對於c/C++和PInvoke,我是一個完整的noob,所以請和我一起裸照。PInvoke和char **
我從我想在我的c#應用程序中使用的人那裏得到了這個程序集。
標題是這樣的:
int __declspec(dllimport) s2o(WCHAR* filename, char** out, int* len);
我設法得到它的部分工作,使用:
[DllImport("s2o.dll", EntryPoint = "[email protected]@[email protected]", CallingConvention = CallingConvention.Cdecl)]
public static extern int s2o(
[MarshalAs(UnmanagedType.LPWStr)]
string filename,
ref char[] @out,
ref int len
);
,然後調用它像這樣:
char[] result = null;
int length = 0;
s2o("filepath", ref result, ref length);
似乎部分工作,因爲'長度'實際上是有價值的。不幸的是,'結果'保持爲空。
我該怎麼做才能做到這一點?
編輯:
好,我設法通過與IntPtr的替換的char [],然後調用「Marshal.PtrToStringAnsi就像尼克工作建議:
string result = Marshal.PtrToStringAnsi(ptr);
然而,由於同樣的答案中的意見,我有點擔心內存使用情況。組件中沒有提供其他方法,因此我該如何清理它?
謝謝!
您可以嘗試用_IntPtr_替換_char [] _併爲指針調用_PtrToStringAuto_:_Marshal.PtrToStringAuto(@out)_ – Centro 2011-05-12 08:56:07
請使用extern「C」在您的DLL中聲明您的函數以禁用名稱修改。現在你的問題。在告訴我們'out'參數如何工作之前,我們不能告訴你如何調用這個函數。誰分配什麼?你有沒有關於's2o'的文檔? – 2011-05-12 08:58:49
@David:我想他說這是第三方DLL,所以他可能不能添加extern「C」。 – Nick 2011-05-12 09:06:59