OLE操作Excel发现一个问题

青蛙工作室 2020-07-21 03:27:23
用OLE法操作Excel,主要代码是这样的:

Variant Ex;
int swp, Err;
Ex =GetActiveOleObject(L"Excel.Application") ; //指向正在运行的Excel
swp = SetWindowPos( Ex.OlePropertyGet(L"hWnd"), 0, 0, 0, 0, 0, 0x43 ); //设置Excel为最前端窗口
//错误就在这里,swp返回0
if(swp==0) {
Err = GetLastError() ; //这里Err得到1400,查得解释是无效的句柄
Return ;
}
//别的一些代码,忽略



经追踪,发现 Ex.OlePropertyGet(L"hWnd")得到的值并不是Excel程序的句柄,因为在Excel用VBA取Excel的句柄,得到的是另一个值。把VBA得到的Excel句柄比如198656代入,SetWindowPos((void*)198656,0, 0, 0, 0, 0, 0x43 ); 能正确返回1而且Excel也确实被置到最前端。

问题就是,如何从OLE语句取得Excel的句柄?
...全文
115 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
就像(HWND__ *)这个类型转换暗示的那样,这个Varaint存储的是一个指向HWND的指针(引用),如果直接传参Ex.OlePropertyGet(L"hWnd"),会把这个指针作为HWND传入...
青蛙工作室 2020-07-23
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
Delphi中这样写是可以的,但是在CB中这些确实不行。原因在于CB中的Variant是用类模拟的,不像Delphi中是编译器直接支持的原生类型,有编译器魔术支持。在CB中这么写就可以了: SetWindowPos((HWND__ *)Ex.OlePropertyGet(L"hWnd").byref, 0, 0, 0, 0, 0, 0x43 );
加个.byref,得到正确的句柄了。我用的CB2009,不需要转换类型。 byref在VB是按址传递,在CB是什么个意思?为什么就能够得到句柄
  • 打赏
  • 举报
回复
Delphi中这样写是可以的,但是在CB中这些确实不行。原因在于CB中的Variant是用类模拟的,不像Delphi中是编译器直接支持的原生类型,有编译器魔术支持。在CB中这么写就可以了:
SetWindowPos((HWND__ *)Ex.OlePropertyGet(L"hWnd").byref, 0, 0, 0, 0, 0, 0x43 );
青蛙工作室 2020-07-21
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
Ex.hWnd难道不行
OLE不是这么写法的,再说,Ex是Variant类型,没有hWnd这种属性。 我用的OLE的写法在别的方面都能正常,比如Ex.OlePropertyGet(L"ActiveWorkbook")就能得到活动工作簿,OlePropertySet()则可以写入,参数是属性,可以参考VBA的写法来用。
  • 打赏
  • 举报
回复
Ex.hWnd难道不行

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧