2014-03-07 117 views
1

我正在嘗試將C DLL導入到我的C#項目中。 的.H代碼如下所示:DLLImport類型問題

_declspec(dllexport) LRESULT CALLBACK SensFindDeviceW(LONG n, LPWSTR pwszMask, PSENSDEVICEW pDevice); 

的_SENSDEVICEW結構:

typedef struct _SENSDEVICEW 
{ 
    WCHAR  szSerialNo[32]; 
    WCHAR  szDeviceID[32]; 
    LONG  nIndex; 
} SENSDEVICEW, * PSENSDEVICEW; 

所以我在C#所做的到現在爲止使用的DllImport:

[DllImport("dll/UFTAccess.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] 
    static extern unsafe long SensFindDeviceW(long n, String pszMask, SENSDEVICEW pDevice); 

定義結構:

[StructLayout(LayoutKind.Sequential)] 
unsafe struct SENSDEVICEW 
{ 
    public char[] szSerialNo; 
    public char[] szDeviceID; 
    public long nIndex; 
} 

,並試圖在一個方法來使用它:

SENSDEVICEW myDevice = new SENSDEVICEW(); 
myDevice.szSerialNo = new char[32]; 
myDevice.szDeviceID = new char[32];   
     long test = SensFindDeviceW(1, "", myDevice); 

有了這一個得到System.Runtime.InteropServices.SafeArrayTypeMismatchException

如果我不初始化數組,我得到一個堆棧不平衡錯誤。

我已經在使用的StringBuilder(其不工作)和編組炭陣列這樣的嘗試:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
string szSerialNo; 

但它導致堆疊不平衡。

也許你們中的任何一個人都有一個想法還有什麼我可以嘗試讓DLL工作?

回答

1

我看到了以下問題:

  1. LRESULT是一個指針大小的有符號整數。這是C#上的IntPtr
  2. LONG是一個擴展爲long的宏。在Windows上,C++ long是一個32位有符號整數。所以在C#端你需要使用int
  3. 結構聲明是錯誤的(見下文)。並且您無法通過引用傳遞結構。
  4. CALLBACK表示該功能是stdcall
  5. unsafe也完全沒有必要。你應該刪除它。

的代碼應該是:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] 
public struct SENSDEVICEW 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] 
    public string szSerialNo; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] 
    public string szDeviceID; 
    public int nIndex; 
} 

[DllImport("...", CallingConvention=CallingConvention.Stdcall, 
    CharSet=CharSet.Unicode)] 
static extern IntPtr SensFindDeviceW(int n, string pszMask, 
    ref SENSDEVICEW pDevice); 

最後,我假設pszMask是輸入參數。因此string將是正確的。但是,當輸入參數應爲LPCWSTR時,C++代碼將其聲明爲LPWSTR。您可能想要檢查此參數的語義。它肯定感覺像是一個輸入參數,在這種情況下,C++編碼器有點sl。。

+0

謝謝youuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,它工作正常:)現在真的更有意義。是的,pszMask是一個輸入參數。 – Vezixig