問題描述:
有乙個公共的標頭檔案裡面有這麼一段描述
#define dll_import __declspec(dllimport)
#define dll_export __declspec(dllexport)
#ifdef win32
#ifndef dll_export_api
#define dll_export dll_import
#else
#define dll_export dll_export
#endif
#else
#define dll_export
#endif
#define dll_std_fun extern "c" dll_export
然後有乙個dll工程 如test
在工程的屬性中預定義了 dll_erport_api
在test.h檔案中定義乙個函式(包含公共的標頭檔案)
dll_std_fun void function();
test.cpp
void function()
編譯生成test.dll、test.lib
新建乙個dll工程test2
在test2.h標頭檔案中包含:公共標頭檔案
在工程的屬性中預定義了 dll_erport_api
dll_epprot_api void function2();
#param(lib,"test1.lib");
void function2()
編譯生成test2.dll、test2.lib
然後在另乙個工程中呼叫test2.dll中的函式function2時,函式裡的function執行失敗
檢查後發現是共用乙個巨集的原因(dll_eport_api)
在test2中 functiona()被解析成匯出函式了
#ifdef win32
#ifndef dll_export_api
#define dll_export dll_import
#else
#define dll_export dll_export
#endif
#else
#define dll_export
#endif
#define dll_std_fun extern "c" dll_export
因為在test2的工程中設定了預定義dll_export_api
解決方法:
在test2工程中去掉預定義dll_export_dll
test2.h檔案不變,在test2.cpp檔案中加入
#ifndef dll_export_dll
#define dll_export_dll
#endif
這樣呼叫test2.dll的函式function2時,test.dll的function就能被正確地解析成匯入函式了
關於DLL巢狀封裝及呼叫
最近閒來無事想對log4net進行封裝,封裝成靜態函式,呼叫時不需要管配置檔案,不需要進行配置,直接通過靜態函式記錄日誌。將log4net.dll封裝成自己的類庫logtool.dll 但是在呼叫時出現了問題,若是將自己生成的logtool.dll以及log4net.dll同時放在exe同目錄下,呼...
DLL動態庫巢狀跨級呼叫問題
在應用過程中,動態庫呼叫動態庫是常見操作。其在理論上可行,實施也相對簡單,呼叫層次關係如下 圖1 呼叫層次關係 針對圖1所示的應用,應對的方法如下 將dll b dll c和 dll a一起放在主程式同一目錄下即可正常呼叫。圖2 巢狀層次關係 針對圖2所示的需求,此時如果不做處理,程式執行時會提示找...
dll呼叫其他DLL
總結一下這幾天使用其他程式呼叫mfc的dll,呼叫dll裡面的視窗資源,需要把當前資源控制代碼切換到dll中一般廣泛採用 afx manage state afxgetstaticmodulestate 這個是自動化的,放在函式的開頭,在函式使用完之後,自動切換回去 發現在有些時間不好用,比如dll...