標籤:使用 io 檔案 art 代碼 ar 工作 amp
開發OPM的技術規格如下
1,是一個ATL-COM項目
1.1 是DLL庫,引用了COM的代碼內容
1.2也可以使用DBX類型作為輸出,並且讓它做一些DBX庫的工作
2 關於stdafx檔案
2.1 需要包括的COM檔案
常規的情況下,使用CComModule得到一個 COM對象,這樣不需要在項目中引用ATL
在引用ATL的情況下,可以通過CAtlDllModuleT建立COM對象
2.2 關於_ATL_NO_UUIDOF
項目中有包含,也有不包含的,作用待定
2.3 包括AC的檔案
#include "acadi.h"
#include "dbmain.h"
#include "dbents.h"
#include "dbsymtb.h"
#include "dbobjptr.h"
#include "rxregsvc.h"
3 匯出函數
3.1 至少要包括COM的標準
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
這四個函數都有基本的模板,幾乎可以直接使用。
3.2 如果作為DBX,還要有
acrxEntryPoint
acrxGetApiVersion
4 建立 COMWrapper
主要工作是完成,將自訂對象的屬性等介面轉換成COM類型的介面;
可以參照 已經有類進行編寫,函數內部基本同常規規則
5 IDL介面檔案
COM的介面檔案,用來表示COM的輸出介面、GUID等內容
同時IDL檔案會自動產生為多個文檔,包括
x_i.h :會在COMWrapper中引用,是COM介面的C語言標頭檔
x_i.c :在dllmain 中引用,是COM中C語言的實現
x.tlb :在資源檔中被使用
上述檔案的位置原則上可以自主安排,sample中,輸出到$(ProjectDir)中
出於分離臨時檔案的原則,我選擇輸出到$(IntDir)中,可以視情況具體安排,只要包含目錄中添加即可
5 在資源檔中
5.1 在資源中增加 RGS檔案,作為註冊表資源,該資訊會被用於安裝和卸載
5.2 在資源套件括中增加一條編譯命令,用於將TLB檔案包含在資源內
1 TYPELIB "idloutputname.tlb"
注意:idloutputname是固定的寫入程式碼,包括路徑;不必非是$(ProjName),只要是是IDL輸出的名字即可
這裡我在項目資源屬性中,增加$(IntDir)作為額外的包含路徑
6 RGS檔案
是一種註冊表資訊檔,只不過這種註冊表檔案需要存在資源中,外部程式可以根據其中資訊對COM組件進行註冊和卸載
基本的操作就是使用模板即可,替換GUID
但要注意,不同的sample中,內容會有一些不同,注意版本匹配即可
7 註冊表檔案
REG檔案,將最後的DLL檔案註冊到系統中,這部分是完全獨立的。只要按照模板寫對GUID和路徑即可
向作業系統註冊可以通過另外一個方法解決;
可以通過將OPM的DLL封裝
8 還有幾個沒明白的地方
8.1 APARTMENT_THREADED
DllMain中的 DisableThreadLibraryCalls(hInstance);
stdafx中的 _ATL_APARTMENT_THREADED
RGS中的 val ThreadingModel = s ‘Apartment‘
暫時保持原狀即可