如何在 C# 中使用 void *buffer 定义 c++ 函数的 dllimport
How to define dllimport of c++ function with void *buffer in C#
我正在尝试使用 C++ DLL S6145usb.dll 与照片打印机 CHC-S6145 集成。那里定义了一个函数,如下所示。我想知道什么是映射 c# DLL 导入。
函数名称 - chcusb_getPrinterInfo
格式
BOOL APIENTRY chcusb_getPrinterInfo (WORD tagNumber, void *rBuffer, DWORD *rLen);
函数详细信息
根据标签标识获取指定打印机的信息
BOOL
是 Win32 中的 32 位整数。 PInvoke 有一个 Boolean
类型,可以通过 MarshalAs
.
将其封送为 32 位整数
WORD
是一个16位无符号整数。 C# 有一个 Uint16
类型。
void*
是原始指针。 C# 为此使用 (U)IntPtr
类型。
DWORD
是一个 32 位无符号整数。 C# 有一个 UInt32
类型。
另一方面,DWORD*
是指向 DWORD
的指针。 C# 具有 ref
和 out
说明符,用于通过引用传递参数变量。您需要使用哪一个取决于参数是 input/output (ref
) 还是仅输出 (out
).
尝试这样的事情:
[DLLImport("S6145usb.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean chcusb_getPrinterInfo(UInt16 tagNumber, IntPtr rBuffer, ref UInt32 rLen);
...
UInt32 bufLen = ...;
IntPtr buffer = Marshal.AllocHGlobal((int)bufLen);
chcusb_getPrinterInfo(..., buffer, ref bufLen);
// use buffer as needed...
Marshal.FreeHGlobal(buffer);
我正在尝试使用 C++ DLL S6145usb.dll 与照片打印机 CHC-S6145 集成。那里定义了一个函数,如下所示。我想知道什么是映射 c# DLL 导入。
函数名称 - chcusb_getPrinterInfo
格式
BOOL APIENTRY chcusb_getPrinterInfo (WORD tagNumber, void *rBuffer, DWORD *rLen);
函数详细信息 根据标签标识获取指定打印机的信息
BOOL
是 Win32 中的 32 位整数。 PInvoke 有一个 Boolean
类型,可以通过 MarshalAs
.
WORD
是一个16位无符号整数。 C# 有一个 Uint16
类型。
void*
是原始指针。 C# 为此使用 (U)IntPtr
类型。
DWORD
是一个 32 位无符号整数。 C# 有一个 UInt32
类型。
DWORD*
是指向 DWORD
的指针。 C# 具有 ref
和 out
说明符,用于通过引用传递参数变量。您需要使用哪一个取决于参数是 input/output (ref
) 还是仅输出 (out
).
尝试这样的事情:
[DLLImport("S6145usb.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean chcusb_getPrinterInfo(UInt16 tagNumber, IntPtr rBuffer, ref UInt32 rLen);
...
UInt32 bufLen = ...;
IntPtr buffer = Marshal.AllocHGlobal((int)bufLen);
chcusb_getPrinterInfo(..., buffer, ref bufLen);
// use buffer as needed...
Marshal.FreeHGlobal(buffer);