我正在尝试在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

08-06 13:40