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
#includehinstance 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的話能看到原...