stringbuilder作为out参数

时间:2016-08-22 14:12:49

标签: c# c++ stringbuilder

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

输出

  

TheName ???

任何人都可以帮助我获得输出......?

  

TheName

1 个答案:

答案 0 :(得分:0)

您需要再复制一个字符。 '\0'称为字符串终止符。没有它,C中的C ++和PInvoke不会识别字符串的结尾。如果要复制wcslen个字符,则不会复制零。有很多解决方案:

  1. 使用提到的wcscpy复制字符串\ 0
  2. 再复制一份 带有memcpy(OutName, out, (len + 1) * sizeof(wchar_t))的字符。
  3. 此外,传递缓冲区(StringBuilder)大小是个好主意。 C / C ++允许你在变量boudaries之外写。这个尺寸可以避免这种情况。