ActiveX 添加测试工程

1.新建工程MFC application,

2.添加完毕,在main Dialog中, 右键[Insert Activex Control],选择你的ActiveX控件。

3.选中你刚刚添加的控件,然后右键[add variable]

m_ocx就是控件的instance object,点击[完成],可以看到在XXXDlg.h中会添加这个instance object的定义。

ipcamerctrl1.h

ipcamerctrl1.cpp

就是你的控件,里面包含了控件中的所有方法,成员函数,Event等等,  (在头文件中可以看到  InvokeHelper ()如何调用的 )

void DisconnectServer()
    {
        InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }

//==============================

接下来是关键了, 有时候,我们自己修改控件中的interface,

但是*.h   *.cpp   *.odl(vs2010是*.idl) 中interface没有匹配,比如*.h 中 修改了,funcA(int, int); 而*.odl 为funcA(int), 就容易造成错误。一般也无法编译。

但是除了interface不匹配,还有其他的问题, 就是上文所说的生成  ipcamerctrl1.h 的问题

*.odl

[id(1)] void DisconnectServer();

*.cpp

/////////////////////////////////////////////////////////////////////////////
// Dispatch map

BEGIN_DISPATCH_MAP(CIPCamVideoCtrl, COleControl)

    DISP_PROPERTY_EX_ID(CIPCamVideoCtrl, "MotionEnable", dispidMotionEnable, GetMotionEnable, SetMotionEnable, VT_I4)
    DISP_FUNCTION_ID(CIPCamVideoCtrl, "ConnectServer", dispidConnectServer, ConnectServer, VT_I4, VTS_I4 VTS_BSTR VTS_I4 VTS_BSTR VTS_BSTR VTS_I4)
    DISP_FUNCTION_ID(CIPCamVideoCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
// Event map
BEGIN_EVENT_MAP(CIPCamVideoCtrl, COleControl)
       EVENT_CUSTOM_ID("OnConnectServerResult", eventidOnConnectServerResult, FireOnConnectServerResult, VTS_I4  VTS_I4)
END_EVENT_MAP()

*.h

// Dispatch and event IDs
public:
    enum {
    //{{AFX_DISP_ID(CIPCamVideoCtrl)
    dispidFuncA = 1L,
    dispidFuncB = 2L,

.............

}

这里不得不说经常修改控件的时候,容易遗漏,但是当时编译器没有报错,怎么办呢?

出错情况

调用控件的某些interface 提示“非选择性参数”,“找不到成员”

后来查证(*.h  定义接口的enum中有2个已经删除的func1(),func2() 导致的)

非常折磨人。 如何规避这种情况呢?

答案就是

DISP_PROPERTY_EX  改成  DISP_PROPERTY_EX_ID
DISP_FUNCTION  改成 DISP_FUNCTION_ID
EVENT_CUSTOM 改成 EVENT_CUSTOM_ID

改完之后,定义的形参  会多出一个选项  dispid,

选择任意一个DISP_PROPERTY_EX_ID 进去看下接口定义,就明白了!

添加这个dispid后,外部测试工程中接口用的就是enum的值

InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);

如果有删除修改的错误,编译时也会及时报出来

参考

http://bbs.csdn.net/topics/310061638

里面应该不是 AboutBox()的问题,而是某个dispid 顺序出现错误。

所以我锁定问题的时候,才会想起尝试 确定dispid值。来排除[非选择性参数]的问题。(一切都是自己尝试出来的)

另说明一下,vs2010 通过添加接口,已经全部用 DISP_FUNCTION_ID 格式,

而vc6.0 则是DISP_FUNCTION格式(不加 _ID)。

写下这个只是给自己mark一下,顺便BS下MS,出现这种错误,没有文档,很难找原因。

===============

另vc6.0创建的ActiveX控件, 通过vs2010 添加测试工程,[Insert Activex Control]后, vs2010  Crash  T_T

(但是我VS2010创建的ActiveX控件,用VS2010 添加测试工程则没有问题)

VS2005则正常,时间原因暂且不管,可能也因为VC6.0、VS2010里面各种设置导致的。

有人知道,可以告诉我下原因

ActiveX添加测试工程, 出现的问题[非选择性参数][找不到成员]的更多相关文章

  1. ARC简介以及工程中ARC与非ARC的混合

    Piosa 博客园 博问 闪存 首页 新随笔 联系 管理 订阅 随笔- 79  文章- 0  评论- 13    ARC简介以及工程中ARC与非ARC的混合   ARC与非ARC在一个项目中同时使用, ...

  2. 测试工程中引入Masonry记录

    测试工程中需要引入Masonry,在进行添加新库时发现了几个问题,记录如下,方便有相同问题的朋友查找解决:   1,podfile中添加 pod ‘Masonry’ 后,pod install --v ...

  3. AC6102 DDR2测试工程

    AC6102 DDR2测试工程 本文档介绍AC6102上DDR2存储器基于Verilog代码的测试过程.AC6102上使用了2片16bit的DDR2存储器组成了32bit的硬件总线.虽然是32bit硬 ...

  4. Android中使用自身携带的Junit新建一个测试工程

    1.新建立一个Android工程 package com.shellway.junit; public class Service { public int divide(int a,int b){ ...

  5. UiAutomator 测试工程开发小结

    一.    关于bundle无法导入中文参数 答:    将文件改为UTF-8格式 二.    关于对无法抓取的控件进行快速输入问题 答:    主要通过pressKeyCode方法,首先将光标锁定在 ...

  6. JSBinding + SharpKit / 安装SharpKit以及添加SharpKit工程

    本文说明如何往 sln 中添加 SharpKit 工程,以及配置. SharpKit 工程用于将 C# 源代码编译成 JS  代码. QQ群 189738580 1. 安装SharpKit 到 sha ...

  7. Mantis Administrator控制密码、注册不用邮件验证、添加测试员[Z]

    Mantis默认安装完成后,管理员创建用户,但无法设置用户密码,只有通过邮件由用户自行修改.无法适应某些没有统一邮箱的情况,现将关闭邮箱验证方法和管理员设置用户密码方法验证通过   不用邮件验证: c ...

  8. RadASM的测试工程!

    RadASM已经安装完毕了,是否可以正常工作了呢?我们通过创建一个工程来测试一下,下面就是创建这个测试工程的过程: 1, 2, 3, 4, 5, 6, 7, 8, 9, 至此,我们通过RadASM的模 ...

  9. robotium 测试APK<一> 建立测试工程

    1.准备Android开发环境 2.准备签名工具http://www.troido.de/re-sign.jar 1.建立测试工程 打开Eclipse,点击File->New一个Android ...

随机推荐

  1. Linux中的简单命令

    history:打印你输过的命令      1.用户在shell中输入的命令会自动保存到内存缓冲区      2.在退出shell的时候,内存中的数据会刷新到磁盘文件:~/.bash_history ...

  2. Kali-Linux之开启ssh服务

    需求:通过putty软件ssh到Kali-Linux系统 问题:默认情况下,Kali系统的ssh服务并没有开启 操作方法: 1.编辑sshd_config文件 root@kali:~# vi /etc ...

  3. HTMLImageElement类型的简便利用

    这个是我在复习书籍的时候看见的,当时一个同学想通过页面发送请求,但是数据量不是太大,所以用的get方式,但是页面用表单提交请求的话会让页面进行跳转,当时我在网上查了一点资料,发现基本上都是通过ajax ...

  4. Javascript中的迭代、归并方法

    迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...

  5. MySQL字符串类型转换时间类型

    如果MySQL数据库里面的某个时间用的是varchar(或者是char)类型的,这样可以方便系统使用而不用随便转换时间类型来适应数据库版本的不同,当要把取出的字段转换成时间类型的时候,可以按如下方法操 ...

  6. func_get_args的使用

    func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用:func_num_args一般写在方法中,用于计数:使用方法如下:function foo($ ...

  7. TortoiseSVN文件夹及文件图标不显示解决方法 [转]

    由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图 标,这个问题前一段时间就遇到了(那个时候没找到合适的答案 ...

  8. 【gitlab】版本管理工具

  9. BZOJ 3969 Low Power 解题报告

    我们首先将所有电池排序,那么我们可以找到一组最优方案,使得一台机器的能量之差是相邻两电池的能量之差. 然后我们就二分这个答案,从前往后贪心地选这个数对,然后看是否所有的数对都是满足条件的. 假设这个数 ...

  10. uva 1476 - Error Curves

    对x的坐标三分: #include<cstdio> #include<algorithm> #define maxn 10009 using namespace std; do ...