• 全部
...

通过智能指针调用OCX方法失败

BimyuIO 2014-07-31 08:55:30
环境:VC6,UNICODE工程

我使用VC6的 MFC ActiveX Control Wizard 创建了一个控件,名称为 network.ocx,然后利用 Classwizard 的 Automation 为其添加了一个带有参数的方法





在编译完成注册之后,我使用 ActiveX Control Test Container 测试调用该方法是没有问题的。

我在我的另外一个 MFC 程序中想使用该控件的方法,我不想通过 insert control 的方法生成类来调用,是这样做的,貌似叫做智能指针(不是很懂)。

在 stdafx.h 中 import 该控件



编译的时候会生成对应对应的 tlh 和 tli 文件

然后调用时这样



结果不会提示创建组件失败,但是调用 Run 失败,catch 到的错误提示是“灾难性故障”。

请问各位大神,错误的原因可能在哪里? 我尝试在 Run 中添加 msgbox ,可是根本不会弹出,也即 Run 根本就没有进入。
同样的控件使用 VB 编写,这么调用就没有任何问题。
...全文
给本帖投票
197 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lis2012 2014-07-31
  • 打赏
  • 举报
回复
字符串参数 为什么不适用BSTR 类型?
fishion 2014-07-31
  • 打赏
  • 举报
回复
应该得创建容器才行了 _DNetworkPtr t = NULL; CWnd *pWnd = new CWnd; pWnd->CreateControl(__uuidof(Network), NULL, WS_VISIBLE|BS_OWNERDRAW, CRect(10,10,150,50), this, 1111); IUnknown *pIUnknown = pWnd->GetControlUnknown (); pIUnknown ->QueryInterface(IID_DOcxTest, (LPVOID*)&t); pIUnknown ->Release(); t->Run(...);
BimyuIO 2014-07-31
  • 打赏
  • 举报
回复
到处翻看相关内容,误打误撞搞定了,在控件的ctrl类里重载 IsInvokeAllowed 方法返回 TRUE 即可。 在CNetworkCtrl.h 里添加

BOOL IsInvokeAllowed (DISPID);
在 CNetworkCtrl.cpp 里

BOOL CNetworkCtrl::IsInvokeAllowed (DISPID)
{
	// You can check to see if COleControl::m_bInitialized is FALSE
	// in your automation functions to limit access.
	return TRUE;
}
相关链接: http://bbs.csdn.net/topics/390190748 http://blog.sina.com.cn/s/blog_6d4b374e0101cpu1.html http://blog.csdn.net/xiliang_pan/article/details/8524439 感谢2位!
BimyuIO 2014-07-31
  • 打赏
  • 举报
回复
引用 2 楼 lis2012 的回复:
字符串参数 为什么不适用BSTR 类型?
已测试改为 BSTR 类型,无效,ActiveX Control Test Container 调用 Run 也不行了,但是如果我新建一个不带任何参数的方法 比如 Go() ,ActiveX Control Test Container 就能有效调用,但程序中用 t->Go() 调用也不行。
BimyuIO 2014-07-31
  • 打赏
  • 举报
回复
引用 1 楼 fishion 的回复:
应该得创建容器才行了 _DNetworkPtr t = NULL; CWnd *pWnd = new CWnd; pWnd->CreateControl(__uuidof(Network), NULL, WS_VISIBLE|BS_OWNERDRAW, CRect(10,10,150,50), this, 1111); IUnknown *pIUnknown = pWnd->GetControlUnknown (); pIUnknown ->QueryInterface(IID_DOcxTest, (LPVOID*)&t); pIUnknown ->Release(); t->Run(...);
引用 1 楼 fishion 的回复:
应该得创建容器才行了 _DNetworkPtr t = NULL; CWnd *pWnd = new CWnd; pWnd->CreateControl(__uuidof(Network), NULL, WS_VISIBLE|BS_OWNERDRAW, CRect(10,10,150,50), this, 1111); IUnknown *pIUnknown = pWnd->GetControlUnknown (); pIUnknown ->QueryInterface(IID_DOcxTest, (LPVOID*)&t); pIUnknown ->Release(); t->Run(...);
请问 fishion 兄 IID_DocxTest 是哪里定义的,我的OCX工程名为 Network

3,248

社区成员

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部