我正在尝试在C#项目中使用C ++ DLL中的方法,但是我无法正确调用它。
方法是这样的:
如SDK手册所述
DWORD WINAPI PrtRead(HANDLE 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] =越界数组索引;
方法定义:
乌龙pdwParArray
变量初始化:
ulong [] pdwParArray = new ulong [2];
方法返回:
pdwParArray [0] = 0;
pdwParArray [1] = 0;
方法定义:
引用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)] ulong [] pdwParArray
结果:
pdwParArray [0] = null;
pdwParArray [1] = null;
定义:
[MarshalAs(UnmanagedType.LPArray)] ulong pdwParArray
结果:
无法编组“参数4”:无效的托管/非托管类型组合(Int64 / UInt64必须与I8或U8配对)。
定义:
[MarshalAs(UnmaDefinition:nagedType.LPArray)]与uld pdwParArray
结果:
无法编组“参数4”:无效的托管/非托管类型组合(Int64 / UInt64必须与I8或U8配对)。
最佳答案
您说该方法是WINAPI调用,而不是cdecl
在您的C#应用程序中,您将其声明为cdecl