![](/img/trans.png)
[英]Invoking C++ function from C# passing a void pointer that is type stripped
[英]passing string from C++ to C# using void pointer
我正在使用這樣的C ++代碼,只是為了嘗試從c ++ dll將字符串獲取到C#應用程序。
int GetValue(void *pBuffer)
{
int x = 0;
String^ temp;
temp = "TestStringtest1test2";
memcpy(pBuffer, &temp,sizeof(temp));
Console::WriteLine(temp);
return x;
}
在C#方面,我正在做的是
[DllImport("Cplusplusapp.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int GetValue(StringBuilder pBuffer);
StringBuilder Buffer = new StringBuilder(100);
int x = GetValue(Buffer);
Console.WriteLine(Buffer);
我已經嘗試了編組和其他各種建議,但是我無法理解為什么我會得到垃圾值,這很簡單,但是我缺少了什么。
temp
地址本身不是字符串,則memcpy
無法正常工作。 此外, sizeof(String)
將返回System.String
對象的大小(在32位計算機上為4字節),而不是字符串長度。
如果需要將值從托管字符串復制到非托管指針,則必須執行后續步驟。
首先, System.String
始終是UNICODE,然后您將沒有char*
但擁有wchar_t*
(但是您可以使用常規的輔助宏將其轉換為所需的內容)。 要將字符串從System.String
轉換為wchar_t*
請調用Marshal::StringToBSTR()
:
String^ temp = L"My string";
BSTR bstr = Marhshal::StringToBSTR(temp);
memcpy(pBuffer, bstr, SysStringLength(bstr));
Marshal::FreeBSTR(bstr);
當然,如果不需要使用System.String
,則可以跳過所有這些操作,而不必將字符串分配給System.String
。 根據導入該函數的方式將其更改為wchar_t*
或char*
(是否為CharSet.Ansi
),看看其他Marshal::StringToXYZ
函數,我將從System::String
創建一個臨時字符串,然后我將strcpy
到目標緩沖區(使用char*
版本的Ansi后綴檢查功能)。 有關示例,請參見此處的SO 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.