我想的PInvoke與以下簽名的函數:的PInvoke到函數返回字符串數組
const char ** SWDLLEXPORT org_crosswire_sword_SWModule_parseKeyList(SWHANDLE hSWModule, const char *keyText);
這將返回字符串數組。
我從C
const char **results = org_crosswire_sword_SWModule_parseKeyList(module, argv[2]);
while (results && *results) {
printf("%s\n", *results);
++results;
}
的這個例子中使用我曾嘗試進行pinvoke如下:
[DllImport(DLLNAME)]
public static extern IntPtr org_crosswire_sword_SWModule_parseKeyList(IntPtr hSWModule, string keyText);
和代碼來使用它:
public IEnumerable<string> ParseKeyList(string keyText)
{
IntPtr keyListPtrs = NativeMethods.org_crosswire_sword_SWModule_parseKeyList(_handle, keyText);
return NativeMethods.MarshalStringArray(keyListPtrs);
}
public static IEnumerable<string> MarshalStringArray(IntPtr arrayPtr)
{
IntPtr ptr = Marshal.ReadIntPtr(arrayPtr);
while(arrayPtr != IntPtr.Zero && ptr != IntPtr.Zero)
{
ptr = Marshal.ReadIntPtr(arrayPtr);
string key = Marshal.PtrToStringAnsi(ptr);
yield return key;
arrayPtr = new IntPtr(arrayPtr.ToInt64() + 1);
}
}
該作品在PtrToStringAnsi行的第一項和段錯誤的第二個。我在做什麼錯了,什麼是正確的方法來鉤銷這個功能。
你正在增加'arrayPtr' 1,它將它移動1個字節。但是你想讓它指向下一個數組元素,所以你應該添加'IntPtr.Size'。 – Dirk