托管代碼資料型別如何轉非托管資料型別?array<Byte>^ 怎樣轉為 unsigned char *?
查到網上的一種做法是:
#include<windows.h>
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma comment( lib , "User32.lib" )
int main(array<System::String ^> ^args)
{
array <Byte>^ arr = gcnew array<Byte>(128);
for(int i=0;i<26;i++)
arr[i]='a'+i;
IntPtr p = Marshal::UnsafeAddrOfPinnedArrayElement( arr , 0 );
::MessageBoxA( 0 , (unsigned char *)p.ToPointer() , 0 , 0 );
return 0;
}
我發現根本不行,列印不出來。
uj5u.com熱心網友回復:
參考:托管代碼資料怎么轉非托管資料?array<Byte> 怎樣轉為 char *
uj5u.com熱心網友回復:
array<Byte>^ bs;
std::vector<unsigned char> vecBinData(bs->Length);
for (int i = 0; i < bs->Length; i++)
{
vecBinData[i] = bs[i];
}
unsigned char * pszValue = (unsigned char *)&vecBinData[0];
uj5u.com熱心網友回復:
C++中陣列是沒有長度屬性的,所以在傳遞陣列時候一般都是成對傳遞,就是要帶上陣列長度.所以你在匯出C++的函式時候,引數要有兩個.引數型別對照可參考網上的對照表,比如:https://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html
其實就是記憶體中放了一些資料,C#物件封裝時候,.net內部增加了這個長度等資訊,所以直接能獲取長度,而傳遞給C++時候,C++只知道C#陣列中資料部分的第一個byte的地址,其實這個時候可以除錯看到資料的,但是只有一個地址,你不能確定資料到哪里才能結束.就像是一條線段,只有起點,沒有終點是不行的.
uj5u.com熱心網友回復:
這個我明白,所以問題就是如何把clr c++物件的地址獲取出來。uj5u.com熱心網友回復:
代碼沒問題。。。。。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/11459.html
標籤:C#
上一篇:Cannot set property errors of #<Window> which has only a getter求助這是什么問題啊
下一篇:webservice外網連接出錯
