如何在 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# 具有 refout 说明符,用于通过引用传递参数变量。您需要使用哪一个取决于参数是 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);