字符串生成器作为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???
有人能帮我拿到输出吗。。。?
名称
您需要再复制一个字符。''0'
被称为字符串终止符。如果没有它,.NET中的C、C++和PInvoke就无法识别字符串的末尾。如果要复制wcslen
字符,则不会复制零。有许多解决方案:
- 使用提到的wcscpy复制字符串''0
- 再复制一个具有CCD_ 3的字符
此外,传递缓冲区(StringBuilder(大小也是个好主意。C/C++允许您在外部变量boudaries中进行编写。这种尺寸可以避免这种情况。