vs2008 外部调用ActiveX控件接口方法
转自:http://topic.csdn.net/u/20090605/16/018e26e9-06e2-4e0d-8099-bc8eb326afde.html
sndaxdrs:
初学activeX ,我写的一个 activeX控件测试程序。 分别调用两个 自定义方法, 分别出现 “找不到成员”,和“非选择性的参数”的提示对话框。 一直不知道原因 。但是调用 AboutBox() 方法可以调用成功。
我用activeX控件测试容器测试时。 AboutBox() 也可以成功。而调用其它方法时会显示
tstcon32.exe 中的 0x7c812afb 处最可能的异常: Microsoft C++ exception: COleException @ 0x0012ef70 。
调用不成功。
我已经分别用 控件测试容器和 regsvr32 注册过 控件了,控件测试成功。
由于是初学者,在此 希望能够得到大家的帮助。
fengrx:
使用向导加方法只是生成接口文件中的接口定义吧。
看下类文件中有没有方法的实现,如果没有就自己手工添加接口的实现。
举例:
接口文件中定义:
[id(DISPID_ABOUTBOX), helpstring("AboutBox")] HRESULT AboutBox(void);
头文件中定义:
STDMETHOD(AboutBox)(void);
cpp文件中实现:
STDMETHODIMP CResoftSignCtrl::AboutBox(void)
{
CAboutDlg dlg;
dlg.DoModal();
return S_OK;
}
sndaxdrs:
有实现的 void CCurveChartCtrl::Hello(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
MessageBox("Hello!");
}
这是我写的一个 实现。
顺便说一下。 我自己写 activeX控件。 添加几个方法。都可以测试成功的。
我现在 需要用到别人给我的一个 控件 。 我调用 它的方法 。 显示是 “找不到成员”,
我又在 程序中又添加了一个方法。 就是上面这段代码。 当调用 时显示 “非选择性的参数”
求助大家/希望能得到帮助。
fengrx:
此控件在什么程序中使用的,一般使用此控件的程序会缓存一份此控件的函数表。
如果增加了新函数,不删除缓存文件,新函数是无法使用的。
此控件在什么程序中使用的?
例如对于word2003使用控件时会在临时文件夹保存两个文件夹:
VBE
Word8.0
你这个图表控件是在哪儿使用的?
sndaxdrs:
这个 控件是一个 显示曲线。有点 类似 股票的 波动曲线。
我还想问下 如果添加新函数。怎么来删除缓存文件呢?
lzy91093:
我以前遇到“非选择性的参数”问题原因:
1,接口文件中定义的参数(个数、类型、顺序)与实现类中不同
2,接口文件定义的该函数id与实现的cpp文件中的一些映射宏(如BEGIN_EVENT_MAP/END_EVENT_MAP、BEGIN_DISPATCH_MAP/END_DISPATCH_MAP)里面的函数列表的顺序不一致
不知对你有没有帮助
sndaxdrs:
fengrx .. 你好,问题并没有解决。你只是告诉我添加一个方法我只是编译通过而已。但“找不到成员” 还是没有解决。你告诉我的方法。即使可以解决“非选择性参数”这个问题。也是解决不了“找不到成员“ 这个问题。 我的最终目的是 要解决“非选择性参数”
我再重复一下我的问题。 别人给我一外activeX 控件。 上面有且仅有一个方法 [id(1), helpstring("方法Initialize")] LONG InitEx(BSTR target, LONG chart_id, LONG type, LONG item, BSTR verify);. 我写客户端调用 这个方法时 显示“找不到成员”。 我一直不知道原因 。
为了 测试这个控件 。我又加了一个方法。 调用 我加入的 方法时会 出现 “非选择性参数”
我的最终目的是要解决 “ 找不到成员” 的问题。 希望能得到大家的帮助。 这个问题我几天解决不了。 工作无法继续。
修改一个 笔误, 上面第二行的 “我的最终目的是 要解决“非选择性参数””改成“我的最终目的是 要解决“找不到成员””
lzy91093:
两个问题好像是同一个问题,DISPID_ABOUTBOX定义的是几?贴出头文件和cpp文件帮你看看
sndaxdrs:
#define DISPID_ABOUTBOX (-552)
下面只有一个方法
dispinterface _DCurveChart
{
properties:
methods:
[id(DISPID_ABOUTBOX)] void AboutBox();
[id(1), helpstring("方法Initialize")] LONG InitEx(BSTR target, LONG chart_id, LONG type, LONG item, BSTR verify);
};
这是方法的实现部分
LONG CCurveChartCtrl::InitEx(LPCTSTR target, LONG chart_id, LONG type, LONG item, LPCTSTR verify)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
g_pSysLog->AppendLog(LOG_DEBUG,"InitEx");
strcpy(m_szVerify, verify);
m_nChartID = chart_id;
m_nChartType = type;
m_nTypeFlag = type | (item << 6);
m_nItem = item;
strcpy(m_szSoapEndPoint,target);
m_bInitChart = TRUE;
if (m_bCreateChart)
{
InitChartData();
return 0;
}
return 0;
}
lzy91093:
1,改成[id(2)] void AboutBox();
2,实现类中确保映射表中AboutBox函数在InitEx下面
再试试
BEGIN_DISPATCH_MAP/END_DISPATCH_MAP中间是怎么写的?
sndaxdrs:
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()
fengrx:
在我印象中接口中的返回值类型只能是:HRESULT
上次加的方法也是吧。
你自己加方法时,接口文件中定义的,返回值类型都定义成HRESULT试下,如果需要返回其它类型,请在参数中定义,设置为out
sndaxdrs:
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
给大家看看两个相关的主题。
lzy91093:
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类)应该就好了
重新导出CCurveChartCtrl类
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();
顺便说一句,调用AboutBox出现“非选择性参数”错误是因为在空间内部调用的是InitEx,由于该函数的参数都是必选的(不是可选参数),调用时按AboutBox的格式传入的是无参数
注意DISP_FUNCTION和DISP_FUNCTION_ID的区别,如果用DISP_FUNCTION,其ID按映射中的顺序从1开始依次排列,用DISP_FUNCTION_ID则在影射中指定ID(如这里的dispidInitialize),不管是哪一种,都要保证该ID与idl文件中对应的接口定义里面的id一致。
再有就是注册与重新导出控件类,如果方便建议重做一个调用控件的工程。
sndaxdrs:
问题解决。非常非常感谢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:
控件内部是根据调用方传来的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);
相关文章:

设计模式之禅笔记
2019独角兽企业重金招聘Python工程师标准>>> 1.设计原则 1)单一职责原则 There should never be more than one reason for a class to change (就一个类而言,应该只有一个引起它变化的原因) 用于控制类的粒度大小,防止类过于复杂…

vs2008部署问题
转自:http://tangxingqt.blog.163.com/blog/static/2771087220098214755269/ 参考资料 1、VS2005解决"应用程序配置不正确,程序无法启动"问题 2、VS2005安装文件 "由于应用程序配置不正确,应用程序未能启动" 3、Micro…

expdp数据泵导出操作
数据泵需要在本地执行,不可以远程登录操作。 数据泵需要建立目录directory --sys下 create directory su as d:\xs 目录的数据字典是dba_directories SYSncbeta>select owner,directory_name,directory_path from dba_directories; 要求导出scott用户下的emp表…
slf4j 日志监控
问题描述 监控系统 新系统起步,旨在监控原有系统的各种问题。主要的一部分,就是监视原有系统的日志。 日志,是Java企业级应用开发必不可少的一部分,市场上有诸多日志框架。我们选用slf4j。 日志有以下级别: TRACE, DEB…

阿里90后科学家研发,达摩院开源新一代AI算法模型
整理 | 一一出品 | AI科技大本营(ID:rgznai100)AI科技大本营7月5日消息,阿里达摩院宣布开源新一代人机对话模型ESIM。该算法模型提出两年多,已被200多篇论文引用,更曾在国际顶级对话系统评测大赛(DSTC7&…

在vs2008中配置OpenCV2.2
1、下载OpenCV2.2:http://www.opencv.org.cn/index.php/Download 2、下载后解压缩OpenCV-2.2.0-win.zip; 3、下载CMake:http://www.cmake.org/cmake/resources/software.html 4、安装CMake; 5、运行cmake-gui,在wh…

开发者,什么是你真正关心的问题?| AI ProCon 2019
2018 年,上千名开发者与上百名技术专家齐聚一堂,在 CSDN 2018 AI开发者大会上以“AI技术与应用”为核心,深度聚焦人工智能的技术创新与行业应用,真正做到了“只讲技术,拒绝空谈”。今年,在产业智能化的浪潮…

C语言程序的结构
1.一个程序由一个或多个源程序文件组成。 a.预处理指令 b.全局声明 c.函数定义 2.函数是C程序的主要组成部分。 3.一个函数包括两个部分。 a.函数首部 int 函数类型 max 函数名 (int 函数参数类型 x, 函数参数名 int 函数参数类型 y…
flask 核心 之 应用上下文 及 请求上下文
Werkzeugs 是 Flask 的底层WSGI库。什么是WSGI? 一段简单的app: def dispath_request(self, request):return Response(Hello World!)def wsgi_app(self, environ, start_response):request Request(environ)response self.dispath_request(request)re…

vs2008中常见错误解决方法汇总
1、error C2859 vc90.idb is not the idb file that was used when this precompiled header was created。 解决方法:选中工程-->点击右键属性-->Configuration Properties-->C/C-->Output Files-->Program Database File Name中的$(IntDir)/vc90.p…

加速AI应用落地,英特尔AI 2.0的进阶之道
人工智能模型的复杂度不断增加,对内存的需求也越来越大。深度学习的进一步发展需要解决内存限制问题,而当前的解决方案无法利用所有可用计算,业内人士逐渐意识到需要专用芯片来支持深度学习训练和推理。英特尔则在人工智能方面提供优越的硬件…

MySQL基础之 恢复数据和数据库迁移
1、mysql命令或者source命令恢复数据 这两个命令在进行恢复数据的时候要检查是否创建数据库。如果数据库不存在,则恢复失败。 数据库迁移 1、相同版本的mysql数据库之间的迁移。 mysqldump -h host1 -uroot -ppwd --all-databases | mysql -h host2 -uroot -ppw…

.Net 文件流 System.IO之Stream
转自 :http://www.cnblogs.com/yukaizhao/archive/2011/07/28/stream.html Stream在msdn的定义:提供字节序列的一般性视图(provides a generic view of a sequence of bytes)。这个解释太抽象了,不容易理解;…

Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用?
作者 | Rafael Mller , Simon Kornblith, Geoffrey Hinton译者 | Rachel责编 | Jane出品 | AI科技大本营(ID: rgznai100)【导读】损失函数对神经网络的训练有显著影响,也有很多学者人一直在探讨并寻找可以和损失函数一样使模型效果更好的函数…

WaitForSingleObject和WaitForMultipleObjects用法
转自:http://www.360doc.com/content/10/0512/09/1072296_27178529.shtml 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。这些等待函数中最常用的是WaitForSingleObject: DWORD WaitForSingleObject(HANDLE hObject, DW…

【面试必问】支撑百万并发的IO多路复用技术你了解吗?
多路复用其实并不是什么新技术,它的作用是在一个通讯连接的基础上可以同时进行多个请求响应处理。对于网络通讯来其实不存在这一说法,因为网络层面只负责数据传输;由于上层应用协议的制订问题,导致了很多传统服务并不能支持多路复…

DllMain already defined in dllmain.obj错误
错误 uafxcw.lib(dllmodul.obj) : error LNK2005: DllMain already defined in dllmain.obj 修改: 去掉宏定义 _USRDLL 转载于:https://blog.51cto.com/co63oc/1122378

典型的数字水印软件
转自:http://blog.csdn.net/pastora/archive/2005/04/15/348413.aspx ---- 目前,数字水印软件既有商品化产品,也有供研究用的免费软件。 商品化软件 ----提供商品化数字水印软件的公司主要有以下一些: ----1.Digimar…

AI、5G、小程序、AIoT纷纷迎来高峰,下一步开发者们要怎么办?
2018 年,上千名开发者与上百名技术专家齐聚一堂,在 CSDN 2018 AI开发者大会上以“AI技术与应用”为核心,深度聚焦人工智能的技术创新与行业应用,真正做到了“只讲技术,拒绝空谈”。今年,在产业智能化的浪潮…

linux第四课
一、配置软件仓库1.yum简介基于rpm软件包的安装部署机制自动解决软件包的依赖关系需要先配置软件仓库2.配置本地的软件仓库a.放入centos7.iso镜像文件到光驱中,确保电源开启b.命令操作# umount /dev/cdrom# ls /mnt# mount /dev/cdrom /mnt# ls /mnt# mkdir -p /rep…

图像处理和图像识别中常用的CxImage函数
1、Load:reads from disk the image in a specific format; 2、Save:saves to disk the image in a specific format; 3、Filter:2D linear filter(图像锐化,可提高图像清晰度); 4、Copy&…

大战三回合:XGBoost、LightGBM和Catboost一决高低 | 程序员硬核算法评测
作者 | LAVANYA译者 | 陆离责编 | Jane出品 | AI科技大本营(ID: rgznai100)【导读】XGBoost、LightGBM 和 Catboost 是三个基于 GBDT(Gradient Boosting Decision Tree)代表性的算法实现,今天,我们将在三轮…

云计算之Docker介绍
1. 百科简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙…

还在纠结垃圾分类问题?带你用Python感受ImageNet冠军模型SENet的强大
作者 | beyondma转载自CSDN博客本月1日起,上海正式开始了“史上最严“垃圾分类的规定,扔错垃圾最高可罚200元。全国其它46个城市也要陆续步入垃圾分类新时代。各种被垃圾分类逼疯的段子在社交媒体上层出不穷。其实从人工智能的角度看垃圾分类就是图像处理…

软件开发流程包含哪些内容
2019独角兽企业重金招聘Python工程师标准>>> 能否开发出一个好的软件,关键是看软件开发前期所做的工作,重点是这个软件有没有一个好的 软件开发流程,因为一个好的软件开发流程关系到到这个软件的成败和最后能达到一个什么的效果&a…

在对话框中应用CScrollView显示图像
1、用vs2008创建一个基于对话框的工程DialogView; 2、添加一个新类CMyDocument,基类为CDocument; 3、添加一个新类CMyView,基类为CScrollView; 4、修改CMyDocument的头文件: #pragma once // CMyDocument …

如何用纯 CSS 创作一个同心圆弧旋转 loader 特效
效果预览 在线演示 按下右侧的“点击预览”按钮在当前页面预览,点击链接全屏预览。 https://codepen.io/zhang-ou/pen/OZmXQX 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。 请用 chrome, safari, edge 打开观看…

Java长见到的面试题,看你能答出几题,就知道自己有多菜了
作者:Java3y前言只有光头才能变强Redis目前还在看,今天来分享一下我在秋招看过(遇到)的一些面试题(相对比较常见的)0、final关键字简要说一下final关键字,final可以用来修饰什么?这题我是在真实的面试中遇到的,当时答得…

数据结构实验之链表一:顺序建立链表
题目描述 输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。输入 第一行输入整数的个数N;第二行依次输入每个整数。输出 输出这组整数。示例输入 8 12 56 4 6 55 15 33 62 示例输出 12 56 4 6 55 15…

深度学习在人脸检测中的应用 | CSDN 博文精选
作者 | 梁志成、刘鹏、陈方杰责编 | 唐小引转载自CSDN(ID:csdnnews)在目标检测领域,可以划分为人脸检测与通用目标检测,往往人脸这方面会有专门的算法(包括人脸检测、人脸识别、人脸其他属性的识别等)&…