C#中的Marshall C++结构
Marshall C++ structure in C#
我在这里提到了类似的问题,但没有得到问题的解决方案。
编组问题。我尝试了C++结构到C#,但做不到。我在pinvoke.net中搜索了任何解决方案的技巧,但找不到任何东西。请帮帮我!
错误消息
An unhandled exception of type 'System.AccessViolationException' occurred in Unknown Module.
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
C++结构
typedef struct SDK_ALARM_INFO
{
int nChannel;
int iEvent;
int iStatus;
SDK_SYSTEM_TIME SysTime;
}SDK_AlarmInfo;
typedef struct SDK_SYSTEM_TIME{
int year;
int month;
int day;
int wday;
int hour;
int minute;
int second;
int isdst;
}SDK_SYSTEM_TIME;
转换的结构C#:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SDK_ALARM_INFO
{
public int nChannel;
public int iEvent;
public int iStatus;
[MarshalAs(UnmanagedType.Struct)]
public SDK_SYSTEM_TIME SysTime;
};
public struct SDK_SYSTEM_TIME
{
public int year;
public int month;
public int day;
public int wday;
public int hour;
public int minute;
public int second;
public int isdst;
}
将指针编组到结构时出错。
C#代码
private XMSDK.fMessCallBack msgcallback;
bool MessCallBack(int lLoginID, string pBuf,uint dwBufLen, IntPtr dwUser)
{
SDK_ALARM_INFO ai = new SDK_ALARM_INFO();
//getting error bottom line
ai = (SDK_ALARM_INFO) Marshal.PtrToStructure(dwUser, typeof(SDK_ALARM_INFO)); // getting error this line
MessageBox.Show("Event: " + ai.iEvent.ToString() + " - Channel: " + ai.nChannel + " - GTime : " + ai.SysTime);
return form.DealwithAlarm(lLoginID,pBuf,dwBufLen);
}
public int InitSDK()
{
//...
msgcallback = new XMSDK.fMessCallBack(MessCallBack);
XMSDK.H264_DVR_SetDVRMessCallBack(msgcallback, this.Handle);
//...
}
MessCallBack函数C#
class XMSDK {
// ...
public delegate bool fMessCallBack(int lLoginID, string pBuf, uint dwBufLen, IntPtr dwUser);
[DllImport("NetSdk.dll")]
public static extern void H264_DVR_SetDVRMessCallBack(fMessCallBack cbAlarmcallback, IntPtr lUser);
//...
}
我认为,结构转换错误和可能导致的错误。正在等待帮助。谢谢
结构声明看起来不错,但请确保您正确理解该SDK。在pBuf
参数中而不是在dwUser
中返回SDK_ALARM_INFO
的可能性很高。通常,当某些SDK允许您使用用户定义的指针注册回调时,该指针会传递给回调方法(本例中为dwUser
),所以我认为在您的情况下,dwUser
实际上等于this.Handle
。
尝试将回调和方法声明更改为
delegate bool fMessCallBack(int lLoginID, IntPtr pBuf, uint dwBufLen, IntPtr dwUser);
bool MessCallBack(int lLoginID, IntPtr pBuf, uint dwBufLen, IntPtr dwUser);
并呼叫
ai = (SDK_ALARM_INFO) Marshal.PtrToStructure(pBuf, typeof(SDK_ALARM_INFO));
也许这会有所帮助。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?