初学activeX 求助。调用activeX控件时提示"找不到成员"和“非选择性的参数”

笑对人生 2009-06-05 04:31:38
初学activeX ,我写的一个 activeX控件测试程序。 分别调用两个 自定义方法, 分别出现 “找不到成员”,和“非选择性的参数”的提示对话框。 一直不知道原因 。但是调用 AboutBox() 方法可以调用成功。

我用activeX控件测试容器测试时。 AboutBox() 也可以成功。而调用其它方法时会显示
tstcon32.exe 中的 0x7c812afb 处最可能的异常: Microsoft C++ exception: COleException @ 0x0012ef70 。
调用不成功。

我已经分别用 控件测试容器和 regsvr32 注册过 控件了,控件测试成功。

由于是初学者,在此 希望能够得到大家的帮助。


...全文
1630 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxiang37 2011-07-14
  • 打赏
  • 举报
回复
太感谢你们了,困扰了两天的问题终于解决了
fengbingchun 2011-05-25
  • 打赏
  • 举报
回复
受益匪浅!!
fengrx 2009-06-08
  • 打赏
  • 举报
回复
不是已经解决了吗?
lzy91093 2009-06-08
  • 打赏
  • 举报
回复
以前遇到过此问题,想不起来怎么解决的了,想起来再贴上
笑对人生 2009-06-08
  • 打赏
  • 举报
回复
顶一下。继续请求帮助
笑对人生 2009-06-08
  • 打赏
  • 举报
回复
谢谢。结贴。 希望 lzy91093 的回答能帮助其它 遇到 相同 问题的人。
lzy91093 2009-06-08
  • 打赏
  • 举报
回复
控件内部是根据调用方传来的ID区寻找内部的函数的,ID给错了,就调用不到或调用到其他函数里了。(粗浅认识,不对处请方家指正)
其实你影射里用DISP_FUNCTION_ID也是可以的,是要保证IDL文件中定义的一致也是可以的:

BEGIN_DISPATCH_MAP(CCurveChartCtrl, COleControl)
DISP_FUNCTION_ID(CCurveChartCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
DISP_FUNCTION_ID(CCurveChartCtrl, "InitEx", 1, InitEx, VT_I4, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BSTR) //
END_DISPATCH_MAP()

[id(DISPID_ABOUTBOX)] void AboutBox();
[id(1), helpstring("方法Initialize")] LONG InitEx(BSTR target, LONG chart_id, LONG type, LONG item, BSTR verify);

笑对人生 2009-06-08
  • 打赏
  • 举报
回复
错了。 同是要 感谢 “fengrx”
笑对人生 2009-06-08
  • 打赏
  • 举报
回复
问题解决。非常非常感谢lzy91093 对我的帮助。 同时也 非常感谢lzy91093。解决办法为 lzy91093 的方法。

BEGIN_DISPATCH_MAP(CCurveChartCtrl, COleControl)
DISP_FUNCTION_ID(CCurveChartCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
DISP_FUNCTION_ID(CCurveChartCtrl, "InitEx", dispidInitialize, InitEx, VT_I4, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BSTR)
END_DISPATCH_MAP()

改成
BEGIN_DISPATCH_MAP(CCurveChartCtrl, COleControl)
DISP_FUNCTION(CCurveChartCtrl, "InitEx", InitEx, VT_I4, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BSTR)
DISP_FUNCTION(CCurveChartCtrl, "AboutBox", AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

[id(DISPID_ABOUTBOX)] void AboutBox();
[id(1), helpstring("方法Initialize")] LONG InitEx(BSTR target, LONG chart_id, LONG type, LONG item, BSTR verify);
改成
[id(1), helpstring("方法Initialize")] LONG InitEx(BSTR target, LONG chart_id, LONG type, LONG item, BSTR verify);
[id(2)] void AboutBox();



不过我还要问一下 lzy91093 , 发生这种错误的根源在哪里呢?
lzy91093 2009-06-08
  • 打赏
  • 举报
回复
注意DISP_FUNCTION和DISP_FUNCTION_ID的区别,如果用DISP_FUNCTION,其ID按映射中的顺序从1开始依次排列,用DISP_FUNCTION_ID则在影射中指定ID(如这里的dispidInitialize),不管是哪一种,都要保证该ID与idl文件中对应的接口定义里面的id一致。
再有就是注册与重新导出控件类,如果方便建议重做一个调用控件的工程。
lzy91093 2009-06-08
  • 打赏
  • 举报
回复
顺便说一句,调用AboutBox出现“非选择性参数”错误是因为在空间内部调用的是InitEx,由于该函数的参数都是必选的(不是可选参数),调用时按AboutBox的格式传入的是无参数
笑对人生 2009-06-08
  • 打赏
  • 举报
回复
lzy91093 ,首先谢谢你的帮助。麻烦了, 我确实是按你上面的写法改的。但还是不行。


调用方法还是提示“找不到成员”。

之前我调用 AboutBox()时。 是可以调用成功的。 但我按你的方法改完后。 调用AboutBox(),提示“非选择性参数”。。。

lzy91093 2009-06-08
  • 打赏
  • 举报
回复
BEGIN_DISPATCH_MAP(CCurveChartCtrl, COleControl)
DISP_FUNCTION_ID(CCurveChartCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
DISP_FUNCTION_ID(CCurveChartCtrl, "InitEx", dispidInitialize, InitEx, VT_I4, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BSTR)
END_DISPATCH_MAP()

改成
BEGIN_DISPATCH_MAP(CCurveChartCtrl, COleControl)
DISP_FUNCTION(CCurveChartCtrl, "InitEx", InitEx, VT_I4, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BSTR)
DISP_FUNCTION(CCurveChartCtrl, "AboutBox", AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

[id(DISPID_ABOUTBOX)] void AboutBox();
[id(1), helpstring("方法Initialize")] LONG InitEx(BSTR target, LONG chart_id, LONG type, LONG item, BSTR verify);
改成
[id(1), helpstring("方法Initialize")] LONG InitEx(BSTR target, LONG chart_id, LONG type, LONG item, BSTR verify);
[id(2)] void AboutBox();
笑对人生 2009-06-08
  • 打赏
  • 举报
回复
楼上你好。我按你的方法做了。 调用方法还是提示“找不到成员”。

之前我调用 AboutBox()时。 是可以调用成功的。 但我按你的方法改完后。 调用AboutBox(),提示“非选择性参数”。。。

lzy91093 2009-06-08
  • 打赏
  • 举报
回复
重新导出CCurveChartCtrl类
lzy91093 2009-06-08
  • 打赏
  • 举报
回复
to fengrx:返回类型可以不是HRESULT

to sndaxdrs:解决了?

AboutBox的id改成2后把映射
BEGIN_DISPATCH_MAP(CCurveChartCtrl, COleControl)
DISP_FUNCTION_ID(CCurveChartCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
DISP_FUNCTION_ID(CCurveChartCtrl, "InitEx", dispidInitialize, InitEx, VT_I4, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BSTR)
END_DISPATCH_MAP()
里面的两个函数位置颠倒一下,编译,注册,再在控件调用端重新添加控件(重新到处CCurveChartCtrl类)应该就好了
笑对人生 2009-06-08
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20071103/10/80B268B1-61C6-4C31-BF22-203AEB49FA7A.html
http://topic.csdn.net/u/20080219/21/4080D185-40C3-4490-ADAA-A3F0D84A0F7A.html


给大家看看两个相关的主题。
fengrx 2009-06-08
  • 打赏
  • 举报
回复
在我印象中接口中的返回值类型只能是:HRESULT
上次加的方法也是吧。
你自己加方法时,接口文件中定义的,返回值类型都定义成HRESULT试下,如果需要返回其它类型,请在参数中定义,设置为out
笑对人生 2009-06-08
  • 打赏
  • 举报
回复
BEGIN_DISPATCH_MAP(CCurveChartCtrl, COleControl)
DISP_FUNCTION_ID(CCurveChartCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
DISP_FUNCTION_ID(CCurveChartCtrl, "InitEx", dispidInitialize, InitEx, VT_I4, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BSTR)
END_DISPATCH_MAP()
lzy91093 2009-06-08
  • 打赏
  • 举报
回复
BEGIN_DISPATCH_MAP/END_DISPATCH_MAP中间是怎么写的?
加载更多回复(14)

3,245

社区成员

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

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