extern "C"__declspec(dllexport)
bool FillString(LPWSTR OutName)
{
LPWSTR out = L"TheName\0";
int len = wcslen(out);
memcpy(
OutName,
out,
len * sizeof(wchar_t));
return true;
}
Это функция в моей c / c ++ dll, ниже мой вызов из c # …
[DllImport(@"My.dll", EntryPoint = "FillString", CallingConvention = CallingConvention.Cdecl)]
public static extern bool MyFunction([MarshalAsAttribute(UnmanagedType.LPWStr)] StringBuilder Name);
var fromdll = new StringBuilder(64);
// I do not know length of out string (Name), but it is null terminated
bool IsFilled = MyFunction(fromdll);
Console.WriteLine(fromdll);
Выход
Имя???
Может ли кто-нибудь помочь мне получить вывод …?
Имя
Вам нужно скопировать еще один символ. '\0'
называется терминатором строки. Без этого C, C ++ и PInvoke в .NET не распознают конец строки. Если вы копируете wcslen
символы, ноль не копируется. Есть много решений:
memcpy(OutName, out, (len + 1) * sizeof(wchar_t))
,Кроме того, неплохо передать размер буфера (StringBuilder). C / C ++ позволяет писать вне переменных переменных. Этот размер позволяет избежать этого.
Других решений пока нет …