Active 控件 写法
参考网页
https://blog.csdn.net/chenyujing1234/article/details/7668484
https://blog.csdn.net/hzzhoushaoyu/article/details/6604572
Application Setting选择为:
Server-Type Dynamic-Link Library (dll)
Additional-Options: Allow merging of proxy/stub code
这里说一句,对于所有只用于web的activex控件,不管有没有界面 都应该用这两个选项。
测试的时候 使用 IE 32位 成功率 比较高
regsvr32.exe 在win7 64位系统上 也分为 64位系统 和32位 系统
ie 32位
工具 —- Internet 选项 —- 自定义级别—
因为要支持64位的ie 所以现在编了两个版本 一个32位 一个64位 可是这两个dll的classid是一样的 接下来要怎么打包安装他们呢 如何区分 让给他们对应到相应的ie上呢
应该需要编译2个版本 一个 WIN32 ,一个 X64 原来我做 IME 输入法的时候就这样弄的。
什么都不用改 可以两个版本并存 看我的文章
http://blog.csdn.net/yang79tao/article/details/7705754
嗯 说的没错 确实不用改 做两个安装包分别注册一下就可以了 谢谢大家 结贴
你改了就不对了 改了你的使用者也得两个版本。
https://blog.csdn.net/qq_32059085/article/details/53032162
vs2013如何创建以及引用x64的动态链接库
https://blog.csdn.net/wangwenjing90/article/details/8755544
windows 32位程序编译成64位
https://blog.csdn.net/woainishifu/article/details/54017550
使用VS在64位平台下编译代码 生成64位dll
看了一些帖子 activeX 控件 刚开始 还是用 ie32位的测试比较好
学习参考资料《COM实用入门教程第三讲.ppt》
COM组件是跨应用的
vbscript Javascript这些解释性语言跟Word,Excel等提供的宏语言如何认识开发者为COM组件提供的自定义接口呢
ATL开发平台都能自动实现IDispatch接口 COM的开发人员一般不需要手动实现该接口。
CHAR, CHAR*, BYTE, BYTE*, SHORT, SHORT*, USHORT, USHORT*, INT, INT*, UINT, UINT*, LONG, LONG*, ULONG, ULONG*, FLOAT, FLOAT*, DOUBLE, DOUBLE*, VARIANT_BOOL, VARIANT_BOOL*, BSTR, BSTR*, IUnknown*, IUnknown**, IDispatch*, IDispatch**, VARIANT, VARIANT*
CHAR: typedef char CHAR;
CHAR*, CHAR的指针
BYTE, typedef unsigned char BYTE;
BYTE*, BYTE的指针
SHORT, typedef short SHORT;
SHORT*, SHORT的指针
USHORT, typedef unsigned short USHORT;
USHORT*, USHORT的指针
INT, typedef int INT;
INT*, INT的指针
UINT, typedef unsigned int UINT;
UINT*, UINT的指针
LONG, typedef long LONG;
LONG*, LONG的指针
ULONG, typedef unsigned long ULONG;
ULONG*, ULONG的指针
FLOAT, typedef float FLOAT;
FLOAT*, FLOAT的指针
DOUBLE, typedef double DOUBLE;
DOUBLE*, DOUBLE的指针
VARIANT_BOOL, COM中的布尔类型
typedef short VARIANT_BOOL;
/* 0 FALSE, -1 TRUE */
VARIANT_BOOL*, VARIANT_BOOL的指针
BSTR, COM中的字符串类型
BSTR*, BSTR的指针
BSTR是指向的是宽字符串的指针 是一个带有字符计数值的字符串 且这个计数值是保存在字符数组的开头。
错误的赋值
BSTR bstr L”Hello UIPower”;
之所有错误 是因为这样子的字符串前面没有计数值
BSTR SysAllocString(const OLECHAR *)是COM中申请BSTR字符串的方法。
BSTR SysAllocStringLen(const OLECHAR *, UINT) 根据字符串指针与字符个数构造BSTR字符串。
UINT SysStringLen(BSTR) 获取字符串前面的计数值。
void SysFreeString(BSTR)释放字符串 当COM中的字符串 BSTR 不再使用时 调用该函数。
BSTR bstrA SysAllocString(L Hello BSTR BSTR bstrB SysAllocStringLen(bstrA, SysStringLen(bstrA)); SysFreeString(bstrA); SysFreeString(bstrB);VARIANT简介
c , vbscript, javascript……计算机语言多种多样 COM产生的目的之一就是要跨语言 而VARIANT数据类型就具有了跨语言的特性 同时它可能存储任何的数据类型 说夸张一点 它是“万能数据类型”。
VARIANT*, VARIANT的指针
为实现“万能类型”的功能 在c 中 VARIANT是一个结构体。该结构体内部又有联合体 联合了多种基本的数据类型 又有变量类型标志VARTYPE vt。可见VARIANT被设置得多么巧妙 合理。
VARIANT结构体的定义 太长了 我们在这边不写出来了 我们可以查看Visual Studio 安装目录\\VC\\PlatformSDK\\Include\\oaidl.h文件中关于VARIANT结构体的定义。
VariantInit()函数 用来初始化一个VARIANT 变量 把vt域设置成VT_EMPTY 表示空类型。vt域指示VARIANT结构体中的联合体所保存的数据类型。
VariantClear()函数 用来清除一个VARIANT变量。
VARIANT var;
VariantInit( var);
//此时 var.vt VT_EMPTY;
//…其它操作
VariantClear( var);
用VARIANT保存LONG类型。
VARIANT var;
VariantInit( var);
var.vt VT_I4; //为什么vt是VT_I4呢 var.lVal 100;VariantClear( var);
//查看VARIANT结构体定义之前的注释可以查看到VT_I4与数据类型的对应关系 同时也可以查看到VT_I2 VT_R4等与相应数据类型的对应关系。
用VARIANT保存FLOAT类型。
VARIANT var;
VariantInit( var);
var.vt VT_R4;var.fltVal 1.23f;VariantClear( var);
用VARIANT保存BSTR类型。
VARIANT var;
VariantInit( var);
var.vt VT_BSTR;var.bstrVal SysAllocString(L Hello UIPower VariantClear( var);
用VARIANT保存BOOL类型。
VARIANT var;
VariantInit( var);
var.vt VT_BOOL;var.boolVal VARIANT_FALSE;VariantClear( var);
从VARIANT读取相应类型的值
if (var.vt VT_I4) long lValue var.lVal; else if (var.vt VT_R4) float fValue var.fltVal; else if (var.vt VT_BSTR) BSTR bstrValue var.bstrVal; else if (var.vt VT_BOOL) VARIANT_BOOL varbValue var.boolVal;
COM数据类型的转换
//LONG转换成FLOAT VARIANT var; VariantInit( var); var.vt VT_I4; var.lVal 100; VariantChangeType( var, var,0, VT_R4); if (var.vt VT_R4) float fValue var.fltVal; VariantClear( var);
22
//LONG转换成BSTR VARIANT var; VariantInit( var); var.vt VT_I4; var.lVal 100; VariantChangeType( var, var,0, VT_BSTR); if (var.vt VT_BSTR) BSTR fValue var.bstrVal; VariantClear( var);VARIANT类型的派生类
直接通过VARIANT API,比如VariantInit, VariantClear等来操作VARIANT比较麻烦 不方便。 给VARIANT赋值也需要设置VARIANT.vt 再设置VARIANT.lVal或VARIANT.fltVal等 也比较麻烦 不方便。 于是有人编写了派生类(子类)来继承VARIANT 然后在派生类中拓展VARIANT的使用方法 使VARIANT的使用更方便 更直接
目前VARIANT的派生类主要有_variant_t CComVariant COleVariant。
_variant_t是VC为支持COM类型而自带的VARIANT派生类 在Visual Studio安装目录\\VC\\include\\comutil.h中定义。
CComVariant是ATL库为支持COM类型而自带的VARIANT派生类 在Visual Studio 安装目录\\VC\\atlmfc\\include\\atlcomcli.h中定义。
COleVariant是MFC库为支持COM类型而自带的VARIANT派生类 在Visual Studio 安装目录\\VC\\atlmfc\\include\\afxdisp.h中定义。
它们的功能都类似。下面我们以CComVariant为例讲解VARIANT类型的派生类。
CComVariant是VARIANT的派生类(子类) 拥有VARIANT的所有用法 可以访问VARIANT的成员。比如CComVariant.lVal或CComVariant.vt或CComVariant.fltVal等。可用CComVariant替代VARIANT。
CComVariant提供了多种方法(包括构造方法 赋值方法) 方便了用户的使用
构造时 会对自身调用VariantInit()函数。
析构时 会对自身调用VariantClear()函数。
所以使用CComVariant代替VARIANT 就不需要再使用VariantInit()函数与VariantClear()函数。
https://support.microsoft.com/zh-cn/help/17621/internet-explorer-downloads
下载 32位的
IE8 多个进程 也可以
选择 变灰的 上面的 那个iexplore.exe
本文链接: http://activeint.immuno-online.com/view-711458.html