dllimport类型问题
DLLImport type problems
我正在尝试将c dll导入我的C#项目。 .h 代码看起来像这样:
_declspec(dllexport) LRESULT CALLBACK SensFindDeviceW(LONG n, LPWSTR pwszMask, PSENSDEVICEW pDevice);
_sensdevicew结构:
typedef struct _SENSDEVICEW
{
WCHAR szSerialNo[32];
WCHAR szDeviceID[32];
LONG nIndex;
} SENSDEVICEW, * PSENSDEVICEW;
所以我在 c#中所做的工作直到现在使用dllimport:
[DllImport("dll/UFTAccess.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
static extern unsafe long SensFindDeviceW(long n, String pszMask, SENSDEVICEW pDevice);
定义结构:
[StructLayout(LayoutKind.Sequential)]
unsafe struct SENSDEVICEW
{
public char[] szSerialNo;
public char[] szDeviceID;
public long nIndex;
}
并尝试以一种方法使用它:
SENSDEVICEW myDevice = new SENSDEVICEW();
myDevice.szSerialNo = new char[32];
myDevice.szDeviceID = new char[32];
long test = SensFindDeviceW(1, "", myDevice);
使用此ag get system.runtime.interopservices.safearraytypemismatchexception 。
如果我不初始化数组,我会遇到堆栈不平衡错误。
我已经尝试使用stringBuilder(不起作用)并编造这样的char-阵列:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
string szSerialNo;
,但会导致堆栈不平衡。
也许你们中的任何人都知道我还能尝试让DLL工作吗?
我看到以下问题:
-
LRESULT
是一个指针大小的签名整数。那是C#上的IntPtr
。 -
LONG
是扩展到long
的宏。在Windows上,Clong
是一个32位签名的整数。因此,在C#侧您需要使用int
。 - 结构声明是错误的(见下文)。而且您无法通过参考通过结构。
- 宏
CALLBACK
表示该功能为stdcall
。 -
unsafe
也根本不需要。您应该删除它。
代码应为:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct SENSDEVICEW
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
public string szSerialNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
public string szDeviceID;
public int nIndex;
}
[DllImport("...", CallingConvention=CallingConvention.Stdcall,
CharSet=CharSet.Unicode)]
static extern IntPtr SensFindDeviceW(int n, string pszMask,
ref SENSDEVICEW pDevice);
最后,我假设pszMask
是输入参数。因此string
是正确的。但是,当输入参数应为LPCWSTR
时,C 代码将其声明为LPWSTR
。您可能想检查此参数的语义。当然感觉就像输入参数,在这种情况下,C 编码器有点马虎。
相关文章:
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 指针问题:从不兼容的类型"int"分配给"int *"
- 特征返回类型的 pybind11 问题
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 使用泛型类型推送到堆栈时出现问题
- 在点云库 (PCL) 中使用自定义点类型的问题
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 为<vtkDataArray> VTK 非结构化网格声明 vtkSmartPointer 类型的变量时出现问题
- 模板<类型名称...参数>的问题
- 类型转换问题
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- printf 数据类型说明符复杂问题
- 缺少类型说明符和另一个问题
- 拆分 pybind11 模块和自动类型转换问题
- 类型转换问题:返回为整数而不是浮点/类型
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 我的 SWIG 类型图有什么问题?
- 从标准输入读取多个类型时出现问题