How to Register COM in VS

在 Visual Studio .Net 部署项目中注册 COM 模块的步骤

  1. 将 COM 对象添加到 Visual Studio 部署项目。
  2. 在解决方案资源管理器中,右键单击刚添加的模块,然后单击属性

    注意:“属性”窗口包含一个表,其中有两列和 x 行(行数取决于项目)。左列列出特定属性。右列将在步骤 4 中解释。
  3. 转到此模块的属性(默认情况下位于 .NET 部署项目的右上角),然后单击“注册表属性”。

    注意:注册表属性指定在安装过程中,应将文件、程序集还是项目输出组注册在目标计算机上。
  4. 在注册表属性的右列中有一个列表框,它显示供您选择的几个选项。请注意解释这些选项的下列详细信息:

      • 对于程序集,通常不需要注册,因而默认值是 DoNotRegister(这意味着安装过程中不会注册该项)。

      • 对于 COM 模块,您可以选择 COMCOMRelativePath 和 COMSelfReg。在安装过程中,这三个选项中的任何一个都将注册 COM 模块。

        请注意下列有关每个选项的详细信息:
    1. COM:模块将由 Windows 安装程序引擎注册为 COM 对象。部署项目将更新相应 .msi 文件的 Registry Tables 组中的 Class 表、ProgID 表和其他表。这是注册 COM 模块的建议方式。
    2. COMRelativePath:模块将由 Windows 安装程序引擎注册为独立的 COM 对象。请注意,此模块只能由安装它时使用的应用程序所使用。
    3. COMSelfReg:在安装模块时,安装程序调用此模块的 DllRegisterServer 函数;在卸载模块时,安装程序调用 DllUnregisterServer 函数。部署项目将更新相应 .msi 文件的 SelfReg 表。建议安装包不要使用自注册。相反,安装包应通过创作安装程序所提供的、用于此用途的一个或多个其他表注册模块(即选择 COM 或COMRelativePath 选项)。对于自注册,将失去拥有中央安装程序服务的许多好处,原因是自注册例程常常会隐藏关键配置信息。

    现在可以生成部署项目,以允许前面的修改依照在步骤 4 中选择的注册属性选项来注册 COM 对象。
  5. 编写批处理脚本.bat文件,使用regsvr32 /s命令注册,调用bat脚本。
  6. 用 LoadLibrary 和 GetProcAddress 取得控件中 DllRegisterServer 函数地址,然后调用注册。
    typedef LONG (*FUN)();
    HMODULE hDll = ::LoadLibrary(TEXT("C:\\WINDOWS\\system32\\Macromed\\Flash\\Flash10e.ocx"));
    if (!hDll)
    return;FUN fn = (FUN)GetProcAddress(hDll, "DllRegisterServer");
    if (fn)
    {fn();
    }
    FreeLibrary(hDll);

  7. 让应用程序在运行的时候自动检查所需要的支持文件和注册控件,免除安装和手动注册。适当修改下面的代码中的支持文件列表,并在App::InitInstance()中调用。
    #include <shlwapi.h>
    #pragma comment(lib, "shlwapi.lib")//检测需要的文件是否存在
    //并且对需要注册的文件进行注册
    //输入参数用于指示文件所在的路径
    //返回TRUE表示成功
    BOOL Check_Environment(LPCTSTR lpszAppPath) //传入文件路径
    {//列出所需要的文件列表typedef struct _FILE_CELL{LPCTSTR szFileName; //文件名BOOL bNeedRegister; //需要注册?}FILE_CELL;const FILE_CELL Support_FileList[] ={{_T("aaa.ocx"), TRUE},   {_T("bbb.ocx"), TRUE},   {_T("ccc.ocx"), TRUE}, {_T("fff.dll"), TRUE},    {_T("other.sys")}, //other need file0, //Don't remove this line};BOOL bRet = 0;TCHAR e_mess[4096], mess[256];memset(e_mess, 0, sizeof(e_mess));int uIndex = 0;while(Support_FileList[uIndex].szFileName){TCHAR fileName[MAX_PATH + 1];_tcscpy_s(fileName, lpszAppPath);PathAddBackslash(fileName);_tcscat_s(fileName, Support_FileList[uIndex].szFileName);if(PathFileExists(fileName)){//if(_tcsicmp(PathFindExtension(fileName),_T(".ocx"))==0) //是需要注册的OCX文件if(Support_FileList[uIndex].bNeedRegister) //需要注册{      //使用短路径名主要是为兼容Win98TCHAR shortfileName[MAX_PATH + 1];GetShortPathName(fileName, shortfileName, MAX_PATH);// Path to OLE Control in shortfileNameHMODULE hModule = LoadLibrary(shortfileName);if(hModule){typedef HRESULT (STDAPICALLTYPE *CTLREGPROC)() ; // Requires olectl.hCTLREGPROC DLLRegisterServer = (CTLREGPROC)GetProcAddress(hModule,"DllRegisterServer" ) ;if(DLLRegisterServer){if(DLLRegisterServer() != S_OK){_stprintf_s(mess, _T("注册模块失败 %s\r\n"), fileName);_tcscat_s(e_mess, mess);}}else{_stprintf_s(mess, _T("模块%s找不到指定注册入口\r\n"), fileName);_tcscat_s(e_mess, mess);}FreeLibrary(hModule) ;}else{_stprintf_s(mess, _T("加载模块失败 %s\r\n"), fileName);_tcscat_s(e_mess, mess);}}}else //提示缺少必要的支持文件{_stprintf_s(mess, _T("缺少必要的文件 %s\r\n"), fileName);_tcscat_s(e_mess, mess);}uIndex++;}if(_tcslen(e_mess) > 0) //检测出错提示{MessageBox(NULL, e_mess, _T("Error"), MB_OK );}else{bRet = true;}return(bRet);
    }

转载于:https://www.cnblogs.com/yefengmeander/archive/2012/11/29/2887550.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css3 卡片hover3D效果

鼠标hover卡片 向上翻转&#xff0c;看简易代码 <!DOCTYPE html> <html> <head><title>3D Flip Card hover effects</title><style type"text/css">* {margin: 0;padding: 0;font-family: consolas;box-sizing: border-box;}bo…

随便贴两个漏洞,如 Apache JServ协议服务

1、Apache JServ协议服务 描述&#xff1a;Apache JServ协议&#xff08;AJP&#xff09;是一种二进制协议&#xff0c;可以将来自Web服务器的入站请求代理到 位于Web服务器后面的应用程序服务器。不建议在互联网上公开使用AJP服务。 如果AJP配置错误&#xff0c;可能会允许攻击…

vue3学习笔记 Composition API setup

一、Composition API优势 相对于vue2的option API Vue3的Composition API设计更有优势 Composition(组合式)Api 功能分组 Composition(组合式)Api 功能导入复用 组合式Api 所解决的问题 (1) 更好的代码组织结构 (2) 相同的代码逻辑可以进行复用 home.vue 3种方式递进升级…

【TCP传输数据-键盘录入】

package com.yjf.esupplier.common.test;import java.io.*; import java.net.Socket;/*** author shusheng* description TCP 传输数据:键盘录入* Email shushengyiji.com* date 2019/1/15 22:57*/ public class ClientDemo1 {public static void main(String[] args) throws I…

04

1、创建/guanli 目录&#xff0c;在/guanli下创建zonghe 和 jishu 两个目录&#xff08;一条命令&#xff09; [rootlocalhost ~]# mkdir /guanli [rootlocalhost ~]# touch /guanli/zonghe [rootlocalhost ~]# touch /guanli/jishu [rootlocalhost ~]# ls /guanlix 2、添加组帐…

事件冒泡 bubbles cancelBubble stopPropagation() stopImmediatePropagation() 区别

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>事件冒泡</title></head><body><h4>bubbles cancelBubble stopPropagation() stopImmediatePropagation() 区别</h4><input type"te…

vue2.0关于添加属性后视图不能更新的问题

属性赋值和this.$set 和vue.$set方法我不行 可以用 this.$delete来进行删除后在设置都可以了 转载于:https://www.cnblogs.com/zhouyideboke/p/11276299.html

vite2.1 最新alias别名设置方式

vite.config.js 别名配置 resolve.alias 类型&#xff1a; Record<string, string> | Array<{ find: string | RegExp, replacement: string }> 将会被传递到 rollup/plugin-alias 作为 entries 的选项。也可以是一个对象&#xff0c;或一个 { find, replacement …

Java生鲜电商平台-商城后台架构与原型图实战

Java生鲜电商平台-商城后台架构与原型图实战 说明&#xff1a;生鲜电商平台的运营平台&#xff0c;其中需要很多的功能进行管理。目前把架构与原型图实战分享给大家&#xff0c;希望对大家有用. 仪表盘/首页&#xff0c;简单统计&#xff0c;报表页&#xff0c;运营快捷口。实际…

antdesignvue upload vue3个人笔记待更新

remove点击移除文件时的回调&#xff0c;返回值为 false 时不移除。支持返回一个 Promise 对象&#xff0c;Promise 对象 resolve(false) 或 reject 时不移除。Function(file): boolean | Promise无 beforeUpload上传文件之前的钩子&#xff0c;参数为上传的文件&#xff0c;若…

logging模块和包

日志模块和包 logging logging模块简介 logging模块是记录我们软件的各种状态&#xff0c;还可以记录各种交易信息 其实每个软件都是有错误日志的,开发人员可以通过错误日志中的内容对他的程序进行修改 日志级别 import logginglogging.debug(调试debug) # DEBUG 10…

python软件开发规范

软件开发规范 什么是软件开发规范&#xff1f; 好的设计项目目录结构&#xff0c;就和编码风格一样&#xff0c;是每个程序员都有的风格&#xff0c;但是在流水化标准化作业过程中&#xff0c;个性和风格是 不被鼓励的。如果你去维护一个非常不好读的项目&#xff0c;虽然实现逻…

D3Vueecharts个人乱记

利用d3vue开发的一个网络拓扑图 https://copyfuture.com/blogs-details/20200710101052238h32wazjmcii49dr 一开始用的是echart画的。 根据https://gallery.echartsjs.com/editor.html?cxH1Rkt3hkb&#xff0c;成功画出简单的节点关系。 如图&#xff1a; 总结—— 【优…

vue中使用Vue-pdf在线预览

下载 npm i vue-pdf 引入(在所需要预览的页面) <script>import axios from axiosimport pdf from vue-pdfimport CMapReaderFactory from vue-pdf/src/CMapReaderFactory.js // 加载中文的包export default {components: {pdf},data () {return {numPages:&#xff0c;…

oracle 自定义 聚合函数

Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象 sum_string varchar2(4000), static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number, --对象初始化 member func…

Vue3里的setup中使用vuex

useStore 这里我们可以直接从vuex 4.X中解构出useStore方法&#xff0c;就可以在setup中使用vuex的相关函数 template 使用$store <template><div><h2>{{ $store.state.count }}</h2><button click"increaseCount">点击</button…

JQ 取CHECKBOX选中项值

备忘录 $("[namecheckbox]:checked").each(function(){ alert((this).val()); }) ;转载于:https://www.cnblogs.com/showblog/archive/2010/09/13/1825099.html

vue3 echarts5 graph关系图谱 点击图例节点消失线不消失重复生成问题

const myChart ref(null);const myCharts ref(null);onMounted(() > {// 这种会导致线仍然存在 重复生成myCharts.value echarts.init(myChart.value);myCharts.value.setOption(option);});return {myChart,myCharts,}; 现象&#xff1a;如下图1 点击图例类目2&#xf…

非常完整的coco screator socketio

https://github.com/SeaPlanet/cocoscreator_chat 前端源码 https://github.com/socketio/socket.io-client https://cdnjs.com/libraries/socket.io 转载于:https://www.cnblogs.com/suneil/p/11288628.html

JavaScript 中 obj.hasOwnProperty(prop) 方法

语法 obj.hasOwnProperty(prop) 参数 prop 要检测的属性的 String 字符串形式表示的名称&#xff0c;或者 Symbol。 返回值 用来判断某个对象是否含有指定的属性的布尔值 Boolean。 描述 所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测…