【发布时间】:2012-01-30 10:38:06
【问题描述】:
我正在尝试在 C# 项目中使用 C++ DLL 中的方法,但我在正确调用它时遇到了问题。 方法是这样的:
如 SDK 手册中所述
DWORD WINAPI PrtRead(句柄 hPrt、DWORD dwTimeout、DWORD *pdwType、LPDWORD pdwParArray、LPDWORD pdwArraySize、LPBYTE pbReadData、LPDWORD pdwReadDataLen)
正如代码中真正定义的那样
extern "C" __declspec(dllimport) DWORD PrtRead (HANDLE hPRT, DWORD dwTimeout, DWORD *pdwType, LPDWORD pdwParArray, LPDWORD pdwArraySize,LPBYTE pbReadData, LPDWORD pdwReadDataLen);
在 SDK C++ 示例中,他们这样称呼它:
DWORD dwPar[2];
pdwParArray = &dwPar[0];
dwPar[0] = 0;
dwPar[1] = 0;
DWORD dwRet = PrtRead(hPrinter, dwCurrentTimeout, &dwType, pdwParArray, &dwArraySize, NULL, &dwReadDataLen);
我的问题是获取值 LPDWORD pdwParArray。
DLL 始终在位置 [0] 中返回以下值之一:1、2 或 20,在位置 [1] 中返回以下值之一:1、2 或 4,但我无法做到这一点。
我尝试过这样定义导入:
[DllImport("HPRDH.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern ulong PrtRead(IntPtr hPrt, ulong dwTimeout, ref ulong pdwType, XXXXXXXXX , ref ulong pdwArraySize, ref byte[] pbReadData, ref ulong pdwReadDataLen);
像这样变化的XXXXXXXXX
方法定义:
out ulong[] pdwParArray
变量初始化:
ulong[] pdwParArray;
方法返回:
pdwParArray = null
方法定义:
ref ulong[] pdwParArray
变量初始化:
ulong[] pdwParArray = new ulong[2];
pdwParArray[0] = 0;
pdwParArray[1] = 0;
方法返回: pdwParArray[0] = 0; pdwParArray[1] = 超出范围的数组索引;
方法定义: out ulong pdwParArray
变量初始化: ulong[] pdwParArray = new ulong[2];
方法返回: pdwParArray[0] = 0; pdwParArray[1] = 0;
方法定义: ref ulong pdwParArray
变量初始化: ulong[] pdwParArray = new ulong[2];
方法返回: pdwParArray[0] = 0; pdwParArray[1] = 0;
我应该如何在我的 C# 导入中定义 LPDWORD pdwParArray,如何初始化并调用它?
提前致谢
_
_
_
_
编辑: @TheMathemagician
尝试了以下结果:
定义:
[MarshalAs(UnManagedType.LPArray)] ulong[] pdwParArray
结果:
pdwParArray[0] = 0;
pdwParArray[1] = 0;
定义:
[MarshalAs(UnmanagedType.LPArray)] out ulong[] pdwParArray
结果:
pdwParArray[0] = null;
pdwParArray[1] = null;
定义:
[MarshalAs(UnmanagedType.LPArray)] ulong pdwParArray
结果:
无法封送“参数 #4”:托管/非托管类型组合无效(Int64/UInt64 必须与 I8 或 U8 配对)。
定义:
[MarshalAs(UnmaDefinition:nagedType.LPArray)] out ulong pdwParArray
结果:
无法封送“参数 #4”:托管/非托管类型组合无效(Int64/UInt64 必须与 I8 或 U8 配对)。
【问题讨论】:
-
您使用的是 32 位还是 64 位窗口。看看这里stackoverflow.com/questions/39419/… - 你的整个代码取决于这个问题。
-
我运行的是 64 位 Windows,但尝试强制程序在 x86 上编译并得到相同的结果