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
答案 0 :(得分:0)
您需要再复制一个字符。 '\0'
称为字符串终止符。没有它,C中的C ++和PInvoke不会识别字符串的结尾。如果要复制wcslen
个字符,则不会复制零。有很多解决方案:
memcpy(OutName, out, (len + 1) * sizeof(wchar_t))
的字符。此外,传递缓冲区(StringBuilder)大小是个好主意。 C / C ++允许你在变量boudaries之外写。这个尺寸可以避免这种情况。