【问题标题】:Calling functions from Unmanaged DLL从非托管 DLL 调用函数
【发布时间】:2014-08-18 02:41:30
【问题描述】:

我有一个具有以下功能的非托管 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);

我正在尝试导入这些函数,但找不到合适的数据类型:

[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 和其他函数的信息,以便我可以调用这些函数?

【问题讨论】:

标签: c# dll unmanaged


【解决方案1】:

非托管类型及其托管对应物:

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

对于其他的,我们可能需要更多地了解它们是如何使用的。

希望您的 API 附带一些文档来解释参数的作用,因为其中一些参数并不完全显而易见。

对于这个函数,我们可以做一些假设:

ReadLatch(HANDLE cyHandle, LPWORD  lpLatch);

假设lpLatch 确实是一个“out”参数(并且您的返回类型是int):

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

【讨论】:

  • 谢谢。我正在把它放在一起,希望一切正常。
  • 问题类似于LPBYTE 可能是一个“输出参数”(您将获取数据的变量的地址传递给它),或者它可能是一个指向数组的指针。 . 由文档来阐明是哪种情况。
  • 是的。所有 lp 变量都是输出(原始代码中的指针)。
  • 那么您应该可以在 C# 签名中使用 out 参数。
猜你喜欢
  • 2011-06-13
  • 2016-02-09
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多