使用清单Manifest免注册调用COM组件

前言

虽然ActiveX已被淘汰,但是又没有新的解决方案来替代ActiveX,好多公司都会使用ActiveX解决网页调用本地资源。ActiveX最容易注册出现问题,所以我们接上一篇关于微软的Manifest的那些事,我们谈下如何运用清单Manifest,来实现免注册调用COM组件,也就是调用ActiveX。

准备工作

首先准备一个工具regsvr42.exe,用来提取com组件的注册信息,在命令行中输入

regsvr42 JITCertActiveX.dll

然后就生成了一个JITCertActiveX.sxs.manifest文件。

文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity
    type="win32"
    name="JITCertActiveX.sxs"
    version="1.0.0.0" />

<file name="JITCertActiveX.dll">

    <comClass
        description="SZZSCertInfo Class"
        clsid="{6FA144DC-ADDC-45EE-B5D5-7F8888F92C36}"
        threadingModel="Apartment"
        progid="JITCertActiveX.SZZSCertInfo"
        tlbid="{32360567-7CEB-4F08-BC6C-178BD488885F}" />

</file>

</assembly>

内容理解可以参考上一篇程序集清单

再次准备exe的清单文件,内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity
    type="win32"
    name="testAssembly.sxs"
    version="1.0.0.0" processorArchitecture="x86"/>

<dependency>
		<dependentAssembly>
			<assemblyIdentity
				type="win32"
				name="JITCertActiveX.sxs"
				version="1.0.0.0" processorArchitecture="x86"/>
		</dependentAssembly>
	</dependency>

</assembly>

内容理解可以参考上一篇应用清单

编写测试程序

测试程序我们采用import导入的方法加上智能指针,详细不多说,看代码:

#include <atlbase.h>
#include <iostream>
#include <Windows.h>
// 导入com组件,第一次编译后会生成tlh和tli
#import "JITCertActiveX.dll"
// 根据生成的tlh,使用该命名空间
using namespace JITCertActiveXLib;

class TA
{
public:
    TA() {
        CoInitialize(NULL);
        // CertInfo 替换成tlh里面的内容
        HRESULT hr = pJitVCTK.CoCreateInstance(__uuidof(CertInfo)); //创建COM对象
        if (FAILED(hr))
        {
            return;
        }
        
    }
    _bstr_t getVersion() {
        //com方法看你自己调用的com组件方法
        return pJitVCTK->GetOCXVersion();
    }
    ~TA() {
        pJitVCTK.Release();
        CoUninitialize();
    }
private:
    //IJITCertInfo改成你自己的tlh里面的内容
    CComQIPtr<IJITCertInfo> pJitVCTK;
};

int main()
{
    TA t;
    _bstr_t version = t.getVersion();
    
    std::cout << "Hello World!\n";
}

方法和接口以及实现类不要照抄,重在理解。这种调用com组件是不支持窗口事件的,如果想支持窗口事件请采用窗口模式(根据框架不同,方式也不同,比如MFC和wxWidgets方法就不一样)。

追加嵌入exe清单

在VS的解决方案TestAssembly中点击属性,在项目属性页中选择清单工具,选择输入和输出,选择附加清单文件,将你的exe清单文件附加到这里。

在这里插入图片描述

问题

试着运行,然后我发现exe启动不了。后来发现是exe的清单文件少了一个processorArchitecture属性。遇到这个问题不要慌,一般启动不了是激活上下文找不到依赖的程序集。

激活上下文

这个很重要,Windows为什么能识别你的清单呢?不管是内置的还是独立的清单文件,靠的就是激活上下文。激活上下文参考微软文档使用激活上下文API。我现在用不到,所以就不看了。

跟踪激活上下文

采用sxstrace可以根据激活上下文的动作,进而判断哪里出现了问题。sxstrace跟踪激活上下文

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Uni-app是一款跨平台的开发框架,可以同时开发iOS、Android、H5等多个平台的应用,其中使用了Vue.js框架,可以通过编写Vue组件来实现页面的构建和逻辑的处理。而如果我们需要在Uni-app中调用一些原生的功能或组件,就需要使用到JS调用COM组件的方法。 首先,我们需要在Uni-app的manifest.json文件中配置原生插件的引用,例如: ``` { "plus": { "nativeObj": { "com.abc": "com.js" } } } ``` 上述代码中,我们配置了一个名为com.abc的原生组件,并指定了它对应的js文件为com.js。 接下来,我们需要编写com.js文件来实现JS调用COM组件的逻辑,例如: ``` function callNativeComponent() { plus.nativeObj.call("com.abc", { action: "show", data: { message: "Hello Native" } }, function(result) { console.log("Native component called: " + JSON.stringify(result)); }); } ``` 上述代码中,我们定义了一个名为callNativeComponent的函数,通过plus.nativeObj.call方法来调用原生组件com.abc,并传递一些需要的参数。在回调函数中,我们可以处理原生组件返回的结果。 最后,在Vue组件使用callNativeComponent函数来调用原生组件,例如: ``` <template> <div> <button @click="callNativeComponent">调用原生组件</button> </div> </template> <script> export default { methods: { callNativeComponent() { callNativeComponent(); } } } </script> ``` 上述代码中,我们在Vue组件中定义了一个名为callNativeComponent的方法,当用户点击按钮时,就会调用这个方法,从而触发JS调用COM组件的逻辑。 综上所述,以上就是在Uni-app中使用JS调用COM组件的方法。通过配置manifest.json和编写相应的JS代码,我们可以在Uni-app中轻松地调用原生的功能或组件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值