mfc ocx 控制元件開發需要注意的問題

smilestone322發表於2015-10-27

1)activex ocx 中需要呼叫第三方dll,lib;而第三方的庫編譯是用c++ builder編譯的,vs2008直接呼叫.lib 有問題;需要轉換;

C++Builder生成DLL,VC呼叫。
1、用extern "C"修飾C++Builder匯出的DLL函式。如:extern "C" __declspec(dllexport) int aFunc(int a);
2、用C++Builder的impdef工具生成DLL對應的def檔案。如:impdef xxx.def xxx.dll。
3、用記事本開啟xxx.def檔案,刪去每個函式名前的"_"。如原來的def檔案為:

C/C++ code

LIBRARY     XXX.DLL

EXPORTS
    ___CPPdebugHook                @2   ; ___CPPdebugHook
    _aFunc                         @1   ; _aFunc


那麼刪除後就變成了:

C/C++ code

LIBRARY     XXX.DLL

EXPORTS
    __CPPdebugHook                @2   ; ___CPPdebugHook
    aFunc                         @1   ; _aFunc


4、用VC的LIB工具,根據上面的def檔案生成lib檔案。如:lib.exe /DEF:XXX.def /MACHINE:IX86,在vc的安裝目錄下對應的lib.exe目錄下執行。生成lib檔案之後,VC便可以使用這個lib檔案;

 

2)準備cabarc.exe工具,可以從微軟官方下載使用執行如下命令進行打包:

             CABARC.exe -s 6144 N "xxxxxx.cab" "xxxxx.ocx" "mwhrf_bj.dll" "xxxxxx.inf"[version]   

其中xxxx.inf內容如下:

[version]    
signature="$CHICAGO$"    
AdvancedINF=2.0    
  
[Add.Code]    
MyTestActiveX.ocx=MyTestActiveX.ocx
CVAPIV200.dll=CVAPIV200.dll
  
[MyTestActiveX.ocx]    
file=thiscab    
clsid={4A89CA80-B5C4-41D5-B150-8FC73A85E641}   
FileVersion=1,0,0,1    
RegisterServer=yes    
DestDir=11 


其中clsid:

只有需要註冊的ocx檔案才設定這個屬性,他的值就是改ocx的唯一classid,可以從專案的.idl檔案中最下方查詢;(uuid)

 

 

3)vs2008 如何除錯activex控制元件;activex除錯工具

C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\TstCon32.exe

vs2008的TstCon32.exe需要自己編譯,直接在網上下載vc6.0的TstCon32.exe;在vs2008的選單工具欄,點外部工具,彈出對話方塊;

標題:ActivexOcxTestTool

命令:C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\TstCon32.exe

然後點應用;在工具選單中選擇ActivexOcxTestTool,執行TstCon32.exe;

此時彈出標題為:ActiveX control Test Container ;

在Edit選單中選擇insert new control,選擇我們的ocx控制元件,然後在control選單中選擇invoke methods 就可以除錯.ocx中的函式了;

 

4)因為.ocx中又呼叫了第三方的庫檔案,使用動態載入dll的方法;LoadLibrary  dll 失敗問題;

解決辦法:

 hdll=NULL;
 TCHAR chCurDir[MAX_PATH] = {0}; 
 GetCurrentDirectory(MAX_PATH, chCurDir); 
 SetCurrentDirectory(_T("E:\\Debug\\")); 
 hdll = LoadLibrary(_T("CVAPIV200.dll")); 
 SetCurrentDirectory(chCurDir); 

 

 

 

 

 

 

 

相關文章