C 呼叫dll時的型別轉換總結

2021-05-18 08:06:26 字數 4201 閱讀 1040

c++(win 32) c#

char**

作為輸入引數轉為

char,通過

encoding

類對這個

string

進行編碼後得到的乙個

char

作為輸出引數轉為

byte,通過

encoding

類對這個

byte

進行解碼,得到字串

c++ dll

介面:void cplusplustocsharp(in char** agentid, out char** agentip);

c#中的宣告:

[dllimport("example.dll")]

public static extern void cplusplustocsharp(char agentid, byte agentip);

c#中的呼叫:

encoding encode = encoding.default;

byte tagentid;

byte tagentip;

string agentip;

tagentid = new byte[100];

tagentip = new byte[100];

cplusplustocsharp(encode.getchars(tagentid), tagentip);

agentip[i] = encode.getstring(tagentip,i*length,length);

handle

intptr

hwnd

intptr

int*

ref int

int&

ref int

void*

intptr

unsigned char*

ref byte

bool

bool

dword

int

或uint

(int

更常用一些)

列舉型別

win32

:bool messagebeep(uint utype //

聲音型別

); 其中的聲音型別為列舉型別中的某一值。c#:

使用者需要自己定義乙個列舉型別:

public enum beeptype

c#中匯入該函式:

[dllimport("user32.dll")]

public static extern bool messagebeep(beeptype beeptype);

c#中呼叫該函式:

messagebeep(beeptype.iconquestion);

結構型別

win32

:使用結構指標作為引數的函式:

bool getsystempowerstatus(

lpsystem_power_status lpsystempowerstatus

); win32

中該結構體的定義:

typedef struct _system_power_status system_power_status, *lpsystem_power_status;

c#:使用者自定義相應的結構體:

struct systempowerstatus

c#中匯入該函式:

[dllimport("kernel32.dll")]

public static extern bool getsystempowerstatus(

ref systempowerstatus systempowerstatus);

c#中呼叫該函式:

systempowerstatus sps;

….sps

初始化賦值

…… getsystempowerstatus(ref sps);

字串對於字串的處理分為以下幾種情況:

1、字串常量指標的處理(

lpctstr

),也適應於字串常量的處理,

.net

中的string

型別是不可變的型別。

2、字串緩衝區的處理(

char*

),即對於變長字串的處理,

.net

中stringbuilder

可用作緩衝區

win32

:bool getfile(lpctstr lprootpathname);

c#:函式宣告:

[dllimport("kernel32.dll", charset = charset.auto)]

static extern bool getfile (

[marshalas(unmanagedtype.lptstr)]

string rootpathname);

函式呼叫:

string pathname;

getfile(pathname);

備註:dllimport

中的charset

是為了說明自動地呼叫該函式相關的

ansi

版本或者

unicode

版本變長字串處理:c#:

函式宣告:

[dllimport("kernel32.dll", charset = charset.auto)]

public static extern int getshortpathname(

[marshalas(unmanagedtype.lptstr)]

string path,

[marshalas(unmanagedtype.lptstr)]

stringbuilder shortpath,

int shortpathlength);

函式呼叫:

具有內嵌字元陣列的結構:

win32

:typedef struct _time_zone_information time_zone_information, *ptime_zone_information;

c#:[structlayout(layoutkind.sequential, charset = charset.unicode)]

struct timezoneinformation

具有**的函式

win32

:bool enumdesktops(

hwinsta hwinsta,

// 視窗例項的控制代碼

desktopenumproc lpenumfunc,

// **函式

lparam lparam

// 用於**函式的值

); **函式

desktopenumproc

的宣告:

bool callback enumdesktopproc(

lptstr lpszdesktop,

// 桌面名稱

lparam lparam

// 使用者定義的值

); c#

:將**函式的宣告轉化為委託:

delegate bool enumdesktopproc(

[marshalas(unmanagedtype.lptstr)]

string desktopname,

int lparam);

該函式在

c#中的宣告:

[dllimport("user32.dll", charset = charset.auto)]

static extern bool enumdesktops(

intptr windowstation,

enumdesktopproc callback,

int lparam);

該錶對c#

中呼叫win32

函式,以及

c++編寫的

dll時引數及返回值的轉換做了乙個小的總結,如果想進一步了解這方面內容的話,可以參照

msdn

中「互操作封送處理」一節。

C 呼叫dll時的型別轉換總結

c win 32 c char 作為輸入引數轉為 char,通過 encoding 類對這個 string 進行編碼後得到的乙個 char 作為輸出引數轉為 byte,通過 encoding 類對這個 byte 進行解碼,得到字串 c dll 介面 void cplusplustocsharp in...

C 呼叫C 的dll總結

舉例 netcontrol.cs using system using system.collections.generic using system.text using system.runtime.interopservices 這句必不可少 namespace netcontrol 1.dl...

C 專案呼叫託管型別的dll

比如在c 專案中,使用c 類庫專案型別生成dll檔案,或使用其他人寫好的託管型別的dll檔案。步驟如下 滑鼠右鍵當前專案下的引用 新增引用 瀏覽 選擇要引用的dll檔案即可。檢查方法 2.1 檢查dll的.net版本 使用vs自帶的一款反編譯工具ildasm.exe,開啟dll檔案,雙擊 manif...