C++ unsigned char *是表示無符號字符指針的意思。
(1)你是想在C#中調用
C++ DLL中提供的函數接口吧?假如你的DLL名字為MyLib.dll,且位於系統路徑中或運行目錄中,那么在C#中如此寫就可以調用了:
[DllImport("MyLib.dll")]
public extern static void lpOnReceiveUserData(
Intptr buffer,
Int32 sizeBuffer,
ref Byte name,
Int32 sizeSomething);
說明3點:
a。請注意參數轉換,你可能注意到了我對
C++中數據類型unsigned long和unsigned int 都轉換為了C#中的Int32,這個基本沒有問題,在我們現在用的32位操作系統中,都是4個字節,即32位;在16位系統中,是有區別的,long 為32位,int為16位,我想現在都應該基本沒有人用16位的操作系統了吧,呵呵;
b。另外形參的名字是我根據此函數接口的意思加上的,也許名字命名得不太准確,但這並不影響正確使用,沒有辦法,原型中沒有形參的名字(對於這個問題,稍后給你解釋。順便說一句:如果是故作高深其實很膚淺,當然也許DLL的作者有其特殊的原因,其意圖我不可臆測 );
c。因為調用的是__stdcall函數,所以使用了P/Invoke的調用方法。其中的方法FunctionName必須聲明為靜態外部函數,即加上 extern static聲明頭。
(2)關於補充問題:
在C++中BYTE*一般寫法是PBYTE(不過沒有關系,反正都是正確的),其實BYTE就是unsigned char,<WinDef.h>中是這樣定義BYTE的:typedef unsigned char BYTE;所以其在C#中對應參數轉換為ref Byte;
給你解釋一下
C++ 中定義的這個函數接口:
typedef void(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
返回值為void,即無返回值;
__stdcall為函數的調用規范,Windows中的WINAPI宏就是被定義為__stdcall的(<WinDef.h>有這樣的宏定義:#define WINAPI __stdcall),這個調用規范定義的函數接口是標准的windows API;
至於參數列表中只有類型,而沒有形參名,這是因為對編譯器來說,只對形參類型敏感,而形參名字其實是別忽略的,所以寫不寫對編譯器來說都是一樣的,但是程序另一方面也是寫給人看的,所以作為好習慣呢,還是要寫上有意義的形參名最好!