Active 控件 写法

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 选项 —->自定义级别—>
这里写图片描述

这里写图片描述

这里写图片描述

3 activex 控件的 64位和32位的问题

因为要支持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的开发人员一般不需要手动实现该接口。

常用的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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/80339285