c# - 从 C# 应用程序调用 C++ DLL 方法

标签 c# c++ .net dll

我正在尝试在 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] = 越界数组索引;


方法定义: 输出 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)] 输出 ulong pdwParArray

结果:

无法编码“参数 #4”:无效的托管/非托管类型组合(Int64/UInt64 必须与 I8 或 U8 配对)。

最佳答案

你说方法是WINAPI调用,不是cdecl 在您的 C# 应用程序中,您将其声明为 cdecl

关于c# - 从 C# 应用程序调用 C++ DLL 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9062550/

相关文章:

c++ - 为什么我不能在 switch-case 语句中有一个变量?

php如何从exe文件接收多个cout?

.net - 使用32位应用程序获取syswow64目录

c# - MQ .NET 程序集 MQC.USER_ID_PROPERTY 是否被忽略?

c# - ASP.Net Core 2 错误处理 : How to return formatted exception details in Http Response?

c++ - 将CBitmap转换为HICON并在状态栏上使用它

c# - 动态加载 DLL 时 DLL 加载的应用程序特定路径

c# - 如何确保在 ASCX 中使用 JavaScript 时仅包含一次

c# - UITableView reloadData 重复单元格

c# - 如何在 specflow 特征表中使用 "|"关键字