ATL该怎么调用MFC开发的ocx控件

迷路的指南针 2020-02-18 11:48:16
本人手上原有一个用MFC写的视频采集OCX控件,现在手上项目要去给第三方做ODM,客户提出了采用ATL框架写一个网页插件,实现设备远程控制外还要视频图像实时显示。插件大小有限制导致无法采用MFC来写ODM插件,已经验证过了,大小放不下。
目前我这边的思路是,ATL采用CAxWindows来加载并显示控件。但是使用QueryControl来获取接口这块不知道如何入手。也就是我知道MFC下的接口定义,但是ATL下接口IUnknow接口定义是怎么样的格式要求?

RECT rc;
IWebBrowser2* iWebBrowser;
VARIANT varMyURL;
static CAxWindow WinContainer;
//LPOLESTR pszName=OLESTR("shell.Explorer.");
//LPOLESTR pszName=OLESTR("shell.Explorer.2");
LPOLESTR pszName=OLESTR("{8856F961-340A-11D0-A96B-00C04FD705A2}");
GetClientRect(hWnd, &rc);
WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE);
WinContainer.CreateControl(pszName);
WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);
...

以上面代码为例,我该怎么导出我的接口(类似于上面代码中的IWebBrowser2)?如果是手动定义它有几个部分,哪个点是需要注意的?有没有哪位大佬指教一下。
...全文
194 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
迷路的指南针 2020-02-23
  • 打赏
  • 举报
回复
[结帖]我搞定了,使用vs编译器可以将ocx的头文件编译生成,然后头文件生成了对应的抽象类定义,然后就可以调用了,通过实践确认可以成功搞定。这么偏门的事情知道的大佬估计要么退休了要么就成公司大佬都没空逛论坛了。谢谢版主的热心参与。
迷路的指南针 2020-02-21
  • 打赏
  • 举报
回复
引用 1 楼 red-fly 的回复:
可以先弄个mfc下的控件工程,然后参考它的接口定义来写你自己的工程
试过了,按照MFC定义的类来生成抽象类接口,QueryControl成功,但是一调用接口指针必崩溃
迷路的指南针 2020-02-21
  • 打赏
  • 举报
回复
没有进去,应该是接口生成错误。MFC的标准接口不知道怎么生成,也是尴尬
red-fly 2020-02-21
  • 打赏
  • 举报
回复
那可以在组件的ChangeStr()接口中加个打印什么的,看下是否调进去了,如果没有调用进去,就还是接口部分的问题,如果调进去了,就是组件内部的问题
迷路的指南针 2020-02-21
  • 打赏
  • 举报
回复
引用 5 楼 red-fly 的回复:
Iatl_button_ctrl* pI = NULL; WinContainer.QueryControl(__uuidof(Iatl_button_ctrl), (void**)&pI); if (pI != NULL) pI->ChangeStr(L"Chenc"); 对Pi初始化一下,后面再加个判断。 如果pI不为空,就在 pI->ChangeStr(L"Chenc"); 一行加个断点,F11是否会有线索?
谢谢大佬,我用的Debug模式,默认都会初始化为NULL的,这点我很早就排除了。 Iatl_button_ctrl是个抽象类,F11,进不去吧。它提示的是用户回调期间遇到未处理的异常
red-fly 2020-02-21
  • 打赏
  • 举报
回复
Iatl_button_ctrl* pI = NULL;
WinContainer.QueryControl(__uuidof(Iatl_button_ctrl), (void**)&pI);
if (pI != NULL)
pI->ChangeStr(L"Chenc");

对Pi初始化一下,后面再加个判断。
如果pI不为空,就在 pI->ChangeStr(L"Chenc"); 一行加个断点,F11是否会有线索?
迷路的指南针 2020-02-21
  • 打赏
  • 举报
回复
引用 3 楼 red-fly 的回复:
可以看下指针变量是否为空,如果不为空,就跟进去看一下具体是哪里挂的
RECT rc;  
	LPOLESTR pszName=OLESTR("{C0641619-670C-449E-A5F0-7AA2915D37DA}");
	::GetClientRect(GetDlgItem(IDC_STA_PLAYER).m_hWnd, &rc);
	WinContainer.Create(m_hWnd, rc, 0, WS_CHILD |WS_VISIBLE);  
	HRESULT hr = WinContainer.CreateControl(pszName);
	Iatl_button_ctrl* pI;
	WinContainer.QueryControl(__uuidof(Iatl_button_ctrl), (void**)&pI);
	pI->ChangeStr(L"Chenc");
QueryControl返回的不为空hr返回的要是S_OK,但是一调用方法就崩溃了。采用API根据GetIDsOfNames查询是成功的。采用API进行Invoke也是崩溃
red-fly 2020-02-21
  • 打赏
  • 举报
回复
可以看下指针变量是否为空,如果不为空,就跟进去看一下具体是哪里挂的
red-fly 2020-02-20
  • 打赏
  • 举报
回复
可以先弄个mfc下的控件工程,然后参考它的接口定义来写你自己的工程

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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