c DLL相關使用

2021-07-25 12:49:58 字數 1830 閱讀 7118

1、在頭定義中使用extern

"c"__declspec

(dllexport

) 表示匯出函式,可直接匯出整個類,也可無類定義直接匯出函式。

2、在有類定義的時候,匯出的介面函式名並非原函式名,故有需求時可在外額外封裝一層匯出所需函式。

3、在cpp內函式頭處使用

extern

"c"

(可不新增)。

4、編譯生成dll後可使用depends.exe來檢視匯出的介面函式。

1、靜態呼叫dll

需要所呼叫模組的.h檔案,.lib檔案,.dll檔案。

a、將.lib檔案放到工程內,在 屬性/配置屬性/鏈結器/常規/附加庫目錄 處新增lib的路徑;

b、在屬性/配置屬性/鏈結器/輸入/附加依賴項 處新增***.lib。

c、將被呼叫的dll放在工程生成的dll或exe同一目錄內。

d、將h檔案放入工程資料夾內,將.h檔案新增到頭檔案資源中,在所需處include即可。

2、動態呼叫dll

#include 

hinstance hdll;

hdll=loadlibrary("c

:\\project\\csocket\\debug\\csocket.dll

");if(hdll==null)

1、新增inte***ce.h,inte***ce.h是給lua require該dll的定義處。 luasocket是所生成dll的名字。

#include

#include

"lua.hpp"

extern

"c"__declspec(dllexport)int__cdeclluaopen_luasocket(

lua_state

* l);

2、新增inte***ce.cpp,cpp為lua require該dll的實現,該處流程完全一樣。

#include

"inte***ce.h"

int tolua_global_open(lua_state* tolua_s);

int__cdecl

luaopen_luasocket(lua_state *l)

3、資源檔案內新增

b、新增global.pkg ,include封裝給lua介面的c++標頭檔案,並將lua所需的api介面定義加入pkg。

$#include "luasocket_function.h"

bool connectsocket(const char* ip, int port);

char* sendmsg(const char* cmd);

bool close();

a、新增批處理檔案global.bat (安裝windows lua,並設定環境變數)。該批處理是使用tolua++.exe,通過帶有介面定義的pkg檔案來生成

cpp檔案(lua實現c++功能)。

rem tolua = c:\lua\bin\tolua++.exe

tolua++.exe -o global_lua.cpp global.pkg

c、使用批處理檔案,生成global_lua.cpp檔案,並將cpp加入工程內,編譯工程即可得到帶有lua介面的dll。

4、lua呼叫dll,在lua檔案內新增以下兩句即可。

package.cpath = package.cpath..";"..".\\?.dll"

require("luasocket");

5、注,如果lua呼叫的a.dll,a.dll依賴於b.dll,b.dll則需要在a.dll同一級目錄下,亦或者a.dll使用的是動態呼叫b.dll

C 中使用DllImport呼叫C dll

為什麼要在c 中呼叫c 的 呢?比如我有乙個c 專案要實現某種功能,同時我恰好有乙個已經實現了這個功能的c 我可以用c 重寫一遍,當然如果工程比較大的話,用dllimport來呼叫c 的dll是乙個更好的選擇。由於c dll是非託管 我不能直接在c 工程中新增引用 會出錯誤提示 命名空間system...

怎麼使用C 呼叫C dll 類庫

今天公司有需要與第三方的硬體廠商進行對接,一般硬體廠商提供的大多為c dll 這就涉及到c 呼叫c 了,首先我們需要看一下c dll 裡面定義的是什麼方法,包括傳遞的引數 dll 檔案不便上傳下面舉例說明是怎麼實現的 例如c 方法是這樣定義的 int stdcall unpackdatafile c...

C DLL匯出函式

有兩種方式,一是寫def檔案,二是用 declspec dllexport 修飾。相對來說,我更喜歡用後一種方式,這樣不用多寫乙個檔案。如果呼叫dll的 也是c 的,可能這樣寫沒有什麼問題,但是delphi程式呼叫的話就有問題了,c 編譯器把函式修飾名給修改了,用depends檢視dll的話能看到原...