簡體   English   中英

使用void指針將字符串從C ++傳遞到C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM