2016-08-22 61 views
0
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#我的呼叫...stringbuilder的作为输出参数

[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

是否有原因,您不使用例如['wcscpy'](http://en.cppreference.com/w/cpp/string/wide/wcscpy)? –

+0

StringBuilder是可变的,但是这里被转换为C字符串,然后没有任何积极的事情发生。 –

+0

似乎你正在复制wcslen字符,没有\ 0。尝试复制'(len + 1)* sizeof(wchar_t)'字符。 –

回答

0

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

  1. 使用提到wcscpy与\ 0
  2. 复制一个更 字符与memcpy(OutName, out, (len + 1) * sizeof(wchar_t))复制串。

此外,传递缓冲区(StringBuilder)大小是一个好主意。 C/C++允许你编写外部变量badaries。这个尺寸可以避免这种情况。

+0

我从来没有意识到上面有多条评论,这个答案解决了我的直接问题。谢谢。 – TEDSON