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.pswp.cn/news/247311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247311.shtml
英文地址,請注明出處:http://en.pswp.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 方法。這個方法可以用來檢測…