c # — строка строителя как выходной параметр

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

Решение

Вам нужно скопировать еще один символ. '\0' называется терминатором строки. Без этого C, C ++ и PInvoke в .NET не распознают конец строки. Если вы копируете wcslen символы, ноль не копируется. Есть много решений:

  1. Используйте упомянутое wcscpy скопировать строку с \ 0
  2. Скопируйте еще один
    персонаж с memcpy(OutName, out, (len + 1) * sizeof(wchar_t)),

Кроме того, неплохо передать размер буфера (StringBuilder). C / C ++ позволяет писать вне переменных переменных. Этот размер позволяет избежать этого.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]