字符串生成器作为out参数

本文关键字:out 参数 字符串 | 更新日期: 2023-09-27 18:03:22

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???

有人能帮我拿到输出吗。。。?

名称

字符串生成器作为out参数

您需要再复制一个字符。''0'被称为字符串终止符。如果没有它,.NET中的C、C++和PInvoke就无法识别字符串的末尾。如果要复制wcslen字符,则不会复制零。有许多解决方案:

  1. 使用提到的wcscpy复制字符串''0
  2. 再复制一个具有CCD_ 3的字符

此外,传递缓冲区(StringBuilder(大小也是个好主意。C/C++允许您在外部变量boudaries中进行编写。这种尺寸可以避免这种情况。