C++ unsigned char *什么意思


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;

至於參數列表中只有類型,而沒有形參名,這是因為對編譯器來說,只對形參類型敏感,而形參名字其實是別忽略的,所以寫不寫對編譯器來說都是一樣的,但是程序另一方面也是寫給人看的,所以作為好習慣呢,還是要寫上有意義的形參名最好!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM