2014-06-27 179 views
0

我有一個具有以下功能的非託管的DLL:從非託管的DLL調用函數

ReadLatch(HANDLE cyHandle, 
       LPWORD lpLatch); 


WriteLatch(HANDLE cyHandle, 
       WORD mask, 
       WORD latch); 



GetPartNumber(HANDLE cyHandle, 
        LPBYTE lpbPartNum); 

GetDeviceProductString(HANDLE cyHandle, 
          LPVOID lpProduct, 
          LPBYTE lpbLength, 
          BOOL bConvertToASCII = TRUE 
          ); 


GetDeviceSerialNumber(HANDLE cyHandle, 
          LPVOID lpSerialNumber, 
          LPBYTE lpbLength, 
          BOOL  bConvertToASCII = TRUE 
          ); 


GetDeviceInterfaceString(HANDLE cyHandle, 
           LPVOID lpInterfaceString, 
           LPBYTE lpbLength, 
           BOOL bConvertToASCII); 

我試圖導入這些功能,但沒有太多的likle找到正確的數據類型:

[DllImportAttribute("runtime.dll", EntryPoint = "ReadLatch", CallingConvention =  CallingConvention.Cdecl)] 
    static extern int ReadLatch(HANDLE cyHandle, [MarshalAs(UnmanagedType. ??????)] ?????? lpLatch); 

    [DllImportAttribute("runtime.dll", EntryPoint = "WriteLatch", CallingConvention = CallingConvention.Cdecl)] 
    static extern int WriteLatch(HANDLE cyHandle, 
       WORD mask, 
       WORD latch); 

    [DllImportAttribute("runtime.dll", EntryPoint = "GetPartNumber", CallingConvention = CallingConvention.Cdecl)] 
    static extern int GetPartNumber(HANDLE cyHandle, 
        LPBYTE lpbPartNum); 

    [DllImportAttribute("runtime.dll", EntryPoint = "GetDeviceProductString", CallingConvention = CallingConvention.Cdecl)] 
    static extern int GetDeviceProductString(HANDLE cyHandle, 
          LPVOID lpProduct, 
          LPBYTE lpbLength, 
          BOOL bConvertToASCII = TRUE 
          ); 

    [DllImportAttribute("runtime.dll", EntryPoint = "GetDeviceSerialNumber", CallingConvention = CallingConvention.Cdecl)] 
    static extern int GetDeviceSerialNumber(HANDLE cyHandle, 
          LPVOID lpSerialNumber, 
          LPBYTE lpbLength, 
          BOOL bConvertToASCII = TRUE 
          ); 

    [DllImportAttribute("runtime.dll", EntryPoint = "GetDeviceInterfaceString", CallingConvention = CallingConvention.Cdecl)] 
    static extern int GetDeviceInterfaceString(HANDLE cyHandle, 
           LPVOID lpInterfaceString, 
           LPBYTE lpbLength, 
           BOOL bConvertToASCII); 

我在哪裏可以找到有關如何表示HANDLE,LPWORD和其他人的信息,以便我可以調用這些函數?

+2

參見[平臺調用數據類型](http://msdn.microsoft.com/en-us/library/ac7ay120(v = vs.110).aspx) –

回答

1

不受管理的類型和它們的管理對應:

  • HANDLE通常由IntPtr表示。
  • WORD - UInt16

對於其他的,我們可能需要知道更多的關於如何使用它們。

希望你的API有一些隨附的文檔可以解釋參數的作用,因爲其中一些並不完全明顯。

對於這個功能,我們可以做一些假設:

ReadLatch(HANDLE cyHandle, LPWORD lpLatch); 

假設lpLatch確實是一個 「出」 參數(和你的返回類型爲int):

[DllImportAttribute("runtime.dll", EntryPoint = "ReadLatch", CallingConvention = CallingConvention.Cdecl)] 
static extern int ReadLatch(IntPtr cyHandle, out UInt16 lpLatch); 
+0

謝謝。我希望它一切正常。 –

+0

問題就像'LPBYTE'可能是一個「輸出參數」(你將它傳遞給你獲取數據的變量的地址),或者它可能是一個指向數組的指針......這取決於文檔澄清是哪種情況。 –

+0

是的。所有的lp變量都是輸出(原始代碼中的指針)。 –

相關問題