2016-06-30 26 views
0

我有下面的C++函數:PInvoking函數輸出參數

int my_func(char* error) { 
    // Have access here to an Exception object called `ex` 
    strcpy(error, ex.what()); 
    return 0; 
} 

我PInvoking像這樣在C#:

[DllImport("pHash.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int my_func(
    [MarshalAs(UnmanagedType.LPStr)] 
    StringBuilder error); 

而且使用這樣的代碼(當然總是C# ):

StringBuilder error = new StringBuilder(); 
int returnValue = my_func(error); 

如果我運行此,程序非常崩潰(意思是崩潰,也不例外剛剛關閉,這就是我T)。我究竟做錯了什麼?

+1

[Matthew](http://stackoverflow.com/a/38117156/5528593)的答案似乎是正確的。但對於你的下一個問題:請告訴我們至少錯誤信息。 「可怕地崩潰」並不像一個異常消息那麼好。 –

+0

有沒有例外,那就是問題所在。該程序退出,這就是它... – Andry

+0

這個函數的接口是無法破解的。您無法防止緩衝區溢出。你必須讓調用者傳遞緩衝區的長度,然後確保你不會複製超出緩衝區的末尾。 –

回答

2

這裏的問題是:你的代碼如何知道字符串緩衝區應該有多大?

通常你會找到一些方法。在沒有這些信息的情況下,您可以做的唯一的事情就是在調用函數之前將StringBuilder初始化爲您所期望的最大字符串的大小。

例如:

 StringBuilder error = new StringBuilder(1024); // Assumes 1024 chars max. 

您的代碼傳遞StringBuilder使用默認的能力,這是(我認爲)16,所以任何字符串比更大會導致崩潰。