正在将指向C#结构的指针发送到C++DLL中
Sending pointer to C# struct into C++ DLL
我在DLL中有一个C++函数,它取一个指向结构JPInfo的指针,该函数中填充了从服务器接收的数据,C++结构的布局如下所示:
typedef struct JP
{
unsigned char type;
DWORD value;
} JP;
typedef struct JPInfo
{
JP jps[3];
_int16 ConT;
_int16 CallT;
unsigned char ret;
unsigned char count;
unsigned char JPOffset;
unsigned char JPPeriod;
} JPInfo;
函数在DLL中导出如下:
__declspec(dllexport) DWORD __stdcall GetJPInfo(JPInfo* jpi, DWORD time);
该函数使用一个指向JPInfo结构的指针,我曾尝试在C#中模拟这个结构
[StructLayout(LayoutKind.Sequential, Size = 5), Serializable]
public struct JP
{
byte type;
int value;
}
[StructLayout(LayoutKind.Sequential,Size=23),Serializable]
public struct JPInfo
{
JP[] jps;
Int16 ConT;
Int16 CallT;
byte ret;
byte count;
byte JPOffset;
byte JPPeriod;
}
我尝试从C#调用函数,如下所示:
[DllImport("DLLImp.dll")]
unsafe public static extern int GetJP(ref JPInfo jpi, int time);
// then in main...
JPInfo jpi = new JPInfo;
GetJackpotValues(ref jpi, 4000);
我得到了一个类型为"System.ExecutionEngineException"的未处理异常。我的JPInfo结构中不能有一个固定大小的JP结构数组,所以我不知道如何处理这个问题。
谢谢。
您是否尝试删除结构上的Size属性?做类似的事情时,我不必指定大小。对于您的数组属性,请尝试将其归因为:
[StructLayout(LayoutKind.Sequential)]
public struct JPInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
JP[] jps;
Int16 ConT;
Int16 CallT;
byte ret;
byte count;
byte JPOffset;
byte JPPeriod;
}
假设C++结构是打包的,那么您的C#结构应该是这样的:
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JP
{
byte type;
uint value;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JPInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
JP[] jps;
Int16 ConT;
Int16 CallT;
byte ret;
byte count;
byte JPOffset;
byte JPPeriod;
}
另一方面,如果它们没有打包,则将Pack
参数移除到StructLayout
属性中。您应该在C++头文件中查找#pragma pack
语句,以了解C++结构是否已打包。
我猜C++结构是打包的,因为您说过它们被映射到从服务器接收的数据上。
你的进口应该是这样的:
[DllImport("DLLImp.dll")]
public static extern uint GetJP(ref JPInfo jpi, uint time);
DWORD
翻译成uint
而不是int
,这里不需要不安全的代码。
相关文章:
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 读取进程内存多级指针(DLL 注入)
- 函数指针分配在创建 DLL 后导致错误
- 正在从jvm.dll获取FindClass函数指针
- DLL 导出导致唯一指针出现问题
- 全局外部指针变量在 DLL 中不可见
- 如何使用指针作为参数在 C# 中包装C++ DLL?
- 使用指针调用C++ DLL 函数
- 访问违规读取位置传递指针以在c中写入的DLL中起作用
- 将指向对象的指针传递给 dll
- 如何从C DLL返回的指针中获得VBA中的整个矩阵
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 调用包含C#功能指针的DLL函数
- 导出Typdef函数指针到DLL
- 函数指针-DInput8.dll挂钩代码的参数用途
- 监视从应用程序写入指定的内存指针从 DLL 接收
- 如何将对象指针从DLL传递到DLL
- 函数指针和DLL加载顺序
- 从VB传递指针到DLL中的外部C函数
- 使用Python访问带有指针的DLL函数