2016-08-22 31 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