I'm trying to use a method from a C++ DLL in a C# project, but I'm, having problems calling it correctly. The method is this:
As said in the SDK manual
DWORD WINAPI PrtRead (HANDLE hPrt, DWORD dwTimeout, DWORD *pdwType, LPDWORD pdwParArray, LPDWORD pdwArraySize, LPBYTE pbReadData, LPDWORD pdwReadDataLen)
As really defined on code
extern "C" __declspec(dllimport) DWORD PrtRead (HANDLE hPRT, DWORD dwTimeout, DWORD *pdwType, LPDWORD pdwParArray, LPDWORD pdwArraySize,LPBYTE pbReadData, LPDWORD pdwReadDataLen);
and in the SDK C++ sample they call it like this:
DWORD dwPar[2];
pdwParArray = &dwPar[0];
dwPar[0] = 0;
dwPar[1] = 0;
DWORD dwRet = PrtRead(hPrinter, dwCurrentTimeout, &dwType, pdwParArray, &dwArraySize, NULL, &dwReadDataLen);
My problem is getting the value LPDWORD pdwParArray.
The DLL always returns one of the following values in position [0]: 1, 2 or 20 and in postion [1]: 1, 2 or 4, but I'm unbale to make it do this.
I've tryed defining the import like this:
[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);
and varied XXXXXXXXX like this
Method definition:
out ulong[] pdwParArray
Variable Initialization:
ulong[] pdwParArray;
Method returns:
pdwParArray = null
Method definition:
ref ulong[] pdwParArray
Variable Initialization:
ulong[] pdwParArray = new ulong[2];
pdwParArray[0] = 0;
pdwParArray[1] = 0;
Method returns: pdwParArray[0] = 0; pdwParArray[1] = Out of bounds array index;
Method definition: out ulong pdwParArray
Variable Initialization: ulong[] pdwParArray = new ulong[2];
Method returns: pdwParArray[0] = 0; pdwParArray[1] = 0;
Method definition: ref ulong pdwParArray
Variable Initialization: ulong[] pdwParArray = new ulong[2];
Method returns: pdwParArray[0] = 0; pdwParArray[1] = 0;
How should I define the LPDWORD pdwParArray in my C# import, how to initialize it and call it?
Thanks in advance
_
_
_
_
EDIT: @TheMathemagician
Tried the following with these results:
Definition:
[MarshalAs(UnManagedType.LPArray)] ulong[] pdwParArray
Result:
pdwParArray[0] = 0;
pdwParArray[1] = 0;
Definition:
[MarshalAs(UnmanagedType.LPArray)] out ulong[] pdwParArray
Result:
pdwParArray[0] = null;
pdwParArray[1] = null;
Definition:
[MarshalAs(UnmanagedType.LPArray)] ulong pdwParArray
Result:
Cannot marshal 'parameter #4': Invalid managed/unmanaged type combination (Int64/UInt64 must be paired with I8 or U8).
Definition:
[MarshalAs(UnmaDefinition:nagedType.LPArray)] out ulong pdwParArray
Result:
Cannot marshal 'parameter #4': Invalid managed/unmanaged type combination (Int64/UInt64 must be paired with I8 or U8).