不使用mfc在atl中如何使用activex控件??? use smart pointeronly automation object implements IDispatch.(Not all COM can be called by Invoke) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在C++里面能不用Invoke最好不用。不知道你是怎样调用的,能详细点吗? 又是两位!多谢,没办法,我要写一个控件集成一个扫描控件。我通过oleview得到他的idl文件,编译出头文件后看了看有IDispatch接口,可没有其他方法的声明(我有说明书)。我只好在我的控件中来IDispatch::Invoke他了,我查询他的ID都能成功,但我用这个id去调用时就会出错!!错误代码:0x8000ffff。用errlook看了一下居然是:灾难性错误!!命苦啊! 调用代码如下:(m_pFtScn2是一个内部组件)VARIANTARG vaRet;VariantInit(&vaRet);DISPPARAMS dispparms;memset(&dispparms,0,sizeof(dispparms));dispparms.cArgs=1;VARIANTARG *pArg=new VARIANTARG;dispparms.rgvarg=pArg;dispparms.rgvarg[0].vt=VT_I4;dispparms.rgvarg[0].lVal=(long)m_hWnd;HRESULT hr=m_pFtScn2->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparms, &vaRet, NULL, NULL);delete pArg;return hr;但是每次都返回0x8000FFFF灾难性故障 什么鸟意思啊!! 先用VariantInit把参数初始化看看吧,这是个好习惯。不过,我认为最大可能是说明书有误,跟开发商联系一下吧。 可是我在mfc中插入这个控件的话,就没问题可以用!我试着用COleDispatchDriver来调用还是不行,mfc里面是怎么实现的??? ActiveX Control 不能從普通的父窗口中 Invoke 出來, 而需要包含在 Control Container 中,建議你在 MSDN 中查一下 "ActiveX Control and Control Container Guidelines" 或者相關內容, 最好還是用 MFC,用 Win32 SDK 來寫很累的. 我自己写了一个测试程序,仿照kenwhale(屠夫)的参数,然后发现它的代码完全可以正确调用,不用象SuperChen(兔子)说的那样需要包含在Control Container中,可以用Invoke调用,但是我的接口不是纯dispatch接口,是双接口(抱歉,我不知道怎么实现纯dispath接口)。kenwhale(屠夫)这段代码我都原封不动使用的,他这里唯一就是dispid来历不明(不会是太大意把dispid弄错了吧,哈哈!)。 SuperChen(兔子):我也想用mfc啊,可要在atl里面写。阿行:我都想是dispid搞错了,那多好啊,天空多美丽!可我看了n遍而且用了n*n种方法表明id没错。const IID LIBID_FtScn2Lib = {0x1ECEC605,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};const IID DIID__DFtScn2 = {0x1ECEC606,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};const IID DIID__DFtScn2Events = {0x1ECEC607,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};const CLSID CLSID_FtScn2 = {0x1ECEC608,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};你说这里他把接口都表示为DIID是不是说这个是纯dispatch接口/? 看了看好像真的是纯DISPATCH接口,我该怎么办? 不是这个,dispid 是1,2,3,4...,idl文件里面[id(1), helpstring...声明的这个序号。我试过了在ATL生成的组件里面去掉了双接口的入口,结果仅仅凭IDispatch,一样可以invoke它的方法。 可以用IDispatch::GetIDsOfNames得到dispid。 arxing(阿行) :我试着用过GetIDsOfNames得到dispid可以成功得到,也与idl文件里面的吻合,哎,可是用这个id去invoke就会出错,可我不把他作为包容的内部控件仅仅用mfc写一个客户端来用这控件又不会有问题,真让人迷茫!!! 这也太奇怪了,这样吧,你跟踪mfc,一直找到调用IDispatch::Invoke的地方,看看它的参数是否跟你的一模一样。 在DLL中创建线程,在线程中创建键盘钩子,结果返回0,请瓿是什么原因 如何从ATL的COM中抛出一个异常? 哪里可下载打包vc程序的软件:最好是不需编程,傻瓜操作的 这个函数为什么不能两次插入相同的HBITMAP?望高手指点一二。谢谢 请教:谁写过/知道用C++给interbase写dll,我用C可以写. 简单问题送分 托盘区的弹出菜单为何不能用 在Cstring类中,怎么加入一个回车并换行。 巨爽,发现了一个鬼佬写的麻将源码! ====如何调试COM程序?==== c++ 新手,问关于union 和 链表的问题 请问如何确定Visual Studio编译后生成的文件那些是程序运行所必需的?
不知道你是怎样调用的,能详细点吗?
没办法,我要写一个控件集成一个扫描控件。我通过oleview得到他的idl文件,编译出头文件后看了看有IDispatch接口,可没有其他方法的声明(我有说明书)。我只好在我的控件中来IDispatch::Invoke他了,我查询他的ID都能成功,但我用这个id去调用时就会出错!!错误代码:0x8000ffff。用errlook看了一下居然是:灾难性错误!!命苦啊!
VARIANTARG vaRet;
VariantInit(&vaRet);
DISPPARAMS dispparms;
memset(&dispparms,0,sizeof(dispparms));
dispparms.cArgs=1;
VARIANTARG *pArg=new VARIANTARG;
dispparms.rgvarg=pArg;
dispparms.rgvarg[0].vt=VT_I4;
dispparms.rgvarg[0].lVal=(long)m_hWnd;
HRESULT hr=m_pFtScn2->Invoke(dispid,
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&dispparms,
&vaRet,
NULL,
NULL);
delete pArg;
return hr;
但是每次都返回0x8000FFFF灾难性故障 什么鸟意思啊!!
不过,我认为最大可能是说明书有误,跟开发商联系一下吧。
kenwhale(屠夫)这段代码我都原封不动使用的,他这里唯一就是dispid来历不明(不会是太大意把dispid弄错了吧,哈哈!)。
阿行:我都想是dispid搞错了,那多好啊,天空多美丽!可我看了n遍而且用了n*n种方法表明id没错。
const IID LIBID_FtScn2Lib = {0x1ECEC605,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};
const IID DIID__DFtScn2 = {0x1ECEC606,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};
const IID DIID__DFtScn2Events = {0x1ECEC607,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};
const CLSID CLSID_FtScn2 = {0x1ECEC608,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};你说这里他把接口都表示为DIID是不是说这个是纯dispatch接口/?
我试过了在ATL生成的组件里面去掉了双接口的入口,结果仅仅凭IDispatch,一样可以invoke它的方法。