2013-11-20 3 views
0

У меня есть код на C++, как это просто, чтобы попробовать, чтобы получить строку в C# приложение из dll C++.Передача строки из C++ в C# с использованием указателя void

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); 

Я попытался сортировочных и различные другие предложения, но я не могу понять, почему я получаю мусор values.Its довольно простой, но что что я пропал без вести.

+0

адрес "temp" НЕ является строкой, а memcpy не будет работать должным образом. –

+0

Зачем вам это делать? Зачем передавать указатель между двумя языками, которые могут обрабатывать типы .NET? Если ваш C++ на самом деле является C++/CLI, как следует из использования String ^, почему бы не указать параметр String ^? Или еще лучше как возвращаемое значение? Почему он даже используется как неуправляемый импорт? – nvoigt

ответ

0

Адрес temp НЕ ИСПРАВЛЯЕТСЯ, так что memcpy не будет работать должным образом. Кроме того, sizeof(String) вернет размер объекта System.String (4 байта на 32-битной машине), а не длину строки.

Если вам нужно скопировать значение из управляемой строки в неуправляемый указатель, вам необходимо выполнить следующие шаги.

Прежде всего 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 в буфер назначения (проверить функции с Ansi суффикс для версий char*). См. Пример this post here on SO.

Смежные вопросы