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...