C 呼叫C C DLL方式

2022-08-11 06:21:11 字數 2096 閱讀 9218

1、編寫乙個簡單的dll

設定為匯出函式,並採用c風格。函式前加extern "c" __declspec(dllexport)。定義函式在退出前自己清空堆疊,在函式前加__stdcall。

新建乙個標頭檔案,在標頭檔案中:

/* 加入任意你想加入的函式定義*/

extern "c" _declspec(dllexport) int _stdcall add(int *x,int *y); // 宣告為c編譯、鏈結方式的外部函式

extern "c" _declspec(dllexport) int _stdcall sub(int x,int y); // 宣告為c編譯、鏈結方式的外部函式

新建乙個.cpp檔案

#include "mydll.h"//貌似這兩個標頭檔案的順序不能顛倒。我試了很多次,但是不能確定。

int add(int *x,int *y)//是否可以理解為,vs2010已經預設是 _stdcall,所以函式不用新增該修飾符

int sub(int x,int y)

把匯出函式名稱變為標準名稱,需加模組定義檔案,就是.def檔案。

內容如下:(需要注釋,前面加分號就可以了,注釋需要單獨行)

library "test"

exports

;add函式

add;sub函式

sublibrary 庫名稱

exports 需要匯出的各個函式名稱

重新編譯之後,再用depends工具看一下,函式已經變成標準add。這個在動態載入時很有用,特別是在getprocaddress函式尋找入庫函式的時候。

2、靜態呼叫

新建乙個c#的控制台專案,

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.runtime.interopservices;//新增

namespace mytest}}

3、動態呼叫

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.runtime.interopservices;//新增

namespace mytest}}

注意:c#時常需要呼叫c/c++dll,當傳遞引數時時常遇到問題,尤其是傳遞和返回字串時。vc++中主要字串型別為:lpstr,lpcstr, lpctstr, string, cstring, lpcwstr, lpwstr等,但轉為c#型別卻不完全相同。

型別對照:

c/c++----------c#

bstr ---------  stringbuilder

lpctstr --------- stringbuilder

lpcwstr ---------  intptr

handle---------intptr

hwnd-----------intptr

char *----------string

int * -----------ref int

int &-----------ref int

void *----------intptr

unsigned char *-----ref byte

struct需要在c#裡重新定義乙個struct

callback**函式需要封裝在乙個委託裡,delegate static extern int funcallback(string str);

注意在每個函式的前面加上public static extern +返回的資料型別,如果不加public ,函式預設為私有函式,呼叫就會出錯。

在c#呼叫c++ dll封裝庫時會出現兩個問題:

1. 資料型別轉換問題 

2. 指標或位址引數傳送問題

C C DLL生成與呼叫例程詳解

為了避免出現問題,請統一使用visual studio 2017 建立乙個dll庫專案,在屬性頁中勾選生成dll 配置型別 在輸出的選擇中選擇release輸出 主要函式和標頭檔案如下 define dlldemoapi declspec dllexport include stdafx.h inc...

C 呼叫方式總結

stdcall stdcall 呼叫約定相當於16位動態庫中經常使用的pascal呼叫約定。在32位的vc 5.0中pascal呼叫約定不再被支援 實際上它已被定義為 stdcall。除了 pascal外,fortran和 syscall也不被支援 取而代之的是 stdcall呼叫約定。兩者實質上是...

C 呼叫C DLL的方式

動態鏈結庫 dll 是乙個包含可由多個程式同時使用的 和資料的庫,dll不是可執行檔案。可以說在windows作業系統中隨處可見,開啟主分割槽盤下的system32。在一些專案中,如果有大量運算或者涉及大量演算法時通常使用c或c 語言封裝成乙個dll,開放一些介面供其他程式呼叫。下面是寫的乙個簡單的...