※ 引述《petercoin (彼得幣)》之銘言:
: 我手上有一個C++寫的dll
: 現在在C#寫的程式內使用這個dll
: 在這個dll內有一個struct
: typedef struct _A
: {
: WCHAR buf[64];
: DWORD index;
: } A;
: 會被當成function的參數傳遞
: int funA(A *a)
: {
: a.buf...;
: index = ...;
: }
: 現在我想在C#內叫用funA
: [DllImport("Mydll.dll", CallingConvention = CallingConvention.StdCall, CharSet
: = CharSet.Unicode)]
: public static extern int funA(IntPtr a);
: 有先確認過dll確實有值在buf裡面
: 但是不管怎樣都沒有辦法得到buf的內容
: 在猜想會不會是memory沒有正確傳遞?
: 想請教一下該如何才能正確將dll傳的值抓出來呢?
using System.Runtime.InteropServices;
// 讓編譯後的成員順序依照指定順序排序
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
public struct A
{
// 因為是接收且由C alloc,直接宣告這樣;如果是傳遞寫法會有些不同
// 這邊寫法蠻多、是最需要嘗試的部分
[MarshalAsAttribute(UnmanagedType.LPWStr)]
public string buf;
public uint index;
}
// 宣告部分直接改成out參考,這裡它類似於指標的用途
// 也可以用Intptr後Marshal.PtrToStructure去轉,但如果可以,指定類型會更方便
// 如果遇到問題可以改回IntPtr,把address print出來,看看是否正確
[DllImport("Mydll.dll", CallingConvention = CallingConvention.StdCall, CharSe
= CharSet.Unicode)]
public static extern int funA(out A a);
不保證可以work,有時需要經過一些嘗試,但主要是調整資料型別與屬性(attribute)