不使用mfc在atl中如何使用activex控件???
我通过IDispatch::Invoke怎么老出错/? 问题点数:50、回复次数:17Top
1 楼kenwhale(屠夫)回复于 2001-11-22 16:23:57 得分 0
a pTop
2 楼masterz(www.fruitfruit.com)回复于 2001-11-22 16:40:32 得分 10
use smart pointer
only automation object implements IDispatch.(Not all COM can be called by Invoke)Top
3 楼arxing(阿行)回复于 2001-11-22 19:53:41 得分 30
在C++里面能不用Invoke最好不用。
不知道你是怎样调用的,能详细点吗?Top
4 楼kenwhale(屠夫)回复于 2001-11-22 21:50:20 得分 0
又是两位!多谢,
没办法,我要写一个控件集成一个扫描控件。我通过oleview得到他的idl文件,编译出头文件后看了看有IDispatch接口,可没有其他方法的声明(我有说明书)。我只好在我的控件中来IDispatch::Invoke他了,我查询他的ID都能成功,但我用这个id去调用时就会出错!!错误代码:0x8000ffff。用errlook看了一下居然是:灾难性错误!!命苦啊! Top
5 楼kenwhale(屠夫)回复于 2001-11-22 21:51:54 得分 0
调用代码如下:(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灾难性故障 什么鸟意思啊!!Top
6 楼arxing(阿行)回复于 2001-11-23 11:18:21 得分 0
先用VariantInit把参数初始化看看吧,这是个好习惯。
不过,我认为最大可能是说明书有误,跟开发商联系一下吧。Top
7 楼kenwhale(屠夫)回复于 2001-11-23 11:25:56 得分 0
可是我在mfc中插入这个控件的话,就没问题可以用!我试着用COleDispatchDriver来调用还是不行,mfc里面是怎么实现的???Top
8 楼SuperChen(哇噻)回复于 2001-11-23 13:29:25 得分 10
ActiveX Control 不能從普通的父窗口中 Invoke 出來, 而需要包含在 Control Container 中,建議你在 MSDN 中查一下 "ActiveX Control and Control Container Guidelines" 或者相關內容, 最好還是用 MFC,用 Win32 SDK 來寫很累的.Top
9 楼arxing(阿行)回复于 2001-11-23 15:24:08 得分 0
我自己写了一个测试程序,仿照kenwhale(屠夫)的参数,然后发现它的代码完全可以正确调用,不用象SuperChen(兔子)说的那样需要包含在Control Container中,可以用Invoke调用,但是我的接口不是纯dispatch接口,是双接口(抱歉,我不知道怎么实现纯dispath接口)。
kenwhale(屠夫)这段代码我都原封不动使用的,他这里唯一就是dispid来历不明(不会是太大意把dispid弄错了吧,哈哈!)。Top
10 楼kenwhale(屠夫)回复于 2001-11-23 15:38:21 得分 0
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接口/?Top
11 楼kenwhale(屠夫)回复于 2001-11-23 16:44:27 得分 0
看了看好像真的是纯DISPATCH接口,我该怎么办?Top
12 楼leng_cn(晓峰)回复于 2001-11-23 17:39:07 得分 0
to:兔子:你知道有没有什么办法可以不用数字签名而可以直接
进行下载控件的办法呀
Top
13 楼arxing(阿行)回复于 2001-11-23 18:15:53 得分 0
不是这个,dispid 是1,2,3,4...,idl文件里面[id(1), helpstring...声明的这个序号。
我试过了在ATL生成的组件里面去掉了双接口的入口,结果仅仅凭IDispatch,一样可以invoke它的方法。Top
14 楼arxing(阿行)回复于 2001-11-23 18:23:15 得分 0
可以用IDispatch::GetIDsOfNames得到dispid。Top
15 楼kenwhale(屠夫)回复于 2001-11-23 23:03:50 得分 0
arxing(阿行) :我试着用过GetIDsOfNames得到dispid可以成功得到,也与idl文件里面的吻合,哎,可是用这个id去invoke就会出错,可我不把他作为包容的内部控件仅仅用mfc写一个客户端来用这控件又不会有问题,真让人迷茫!!!Top
16 楼arxing(阿行)回复于 2001-11-24 13:38:06 得分 0
这也太奇怪了,这样吧,你跟踪mfc,一直找到调用IDispatch::Invoke的地方,看看它的参数是否跟你的一模一样。Top
17 楼kenwhale(屠夫)回复于 2001-11-25 17:27:57 得分 0
我跟踪了一下,好吧,我再去仔细看看吧,Top




