从c#调用带有自定义参数的非托管DLL函数



我一直在尝试从我的c#应用程序中调用c++ dll中的一个函数。这就是我到目前为止所拥有的,但我不知道我是否在正确的道路上,或者我是否做错了什么。由于函数参数是自定义类型,我不知道如何继续。

这是c++中的函数定义

int GetDeviceList(
PRINTER_LIST* pList
);

这些是参数

#define MAX_PRINTER 32
typedef struct {
WCHAR   name[128];          // printer name
WCHAR   id[64];             // printer ID
WCHAR   dev[64];            // device connection
WCHAR   desc[256];          // description
int     pid;                // USB product ID
} PRINTER_ITEM;
typedef struct  {
int                 n;
PRINTER_ITEM    item[MAX_PRINTER];
} PRINTER_LIST;

到目前为止,我能够转换参数

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PrinterItem {
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public string name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public string id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public string dev;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public string desc;
public int pid;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PrinterList {
public int n;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public PrinterItem[] item;
}

和我一直试图实现它到我的程序

public
class Program
{
[DllImport("dllName.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int GetDeviceList(_____);
static void Main(string[] args)
{
var deviceList = GetDeviceList(____);
}
}

我假设您的意图是通过引用传递单个PrinterList

public
class Program
{
[DllImport("dllName.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int GetDeviceList(ref PrinterList list);
static void Main(string[] args)
{
PrinterList list = new PrinterList();
var deviceList = GetDeviceList(ref list);
}
}

确保非托管dll使用Standard call调用(你的C声明没有说明)。

应该可以。

最新更新