请看下我的代码:
1、定义部分:
public struct sm_ci_init_param_t
{
public uint m_dwStructSize;//非托管代码中未用到此成员
public byte m_bStructVersion;//非托管代码中未用到此成员
public IntPtr ptr_CIInitCbk;//SM_CI_ReceiveMessageFun_t m_pfunReceiveMessage;回调函数指针
} //定义委托
public delegate sm_ci_error_t SM_CI_InitCbkDelegate(sm_msg_code_t i_nMsgCode,
IntPtr i_pInMsgData,//数据指针
uint i_dwInMsgLen,
IntPtr o_pOutMsgData,
uint i_dwMaxOutLen,
IntPtr o_pnOutLen); public class CIStackDLL
{
[DllImport("cistack.dll")]
private static extern sm_ci_error_t SM_CI_Init(IntPtr ptr_pInitParam);//sm_ci_init_param_t结构传出指针
//对SM_CI_Init稍做封装
public sm_ci_error_t CS_SM_CI_Init(SM_CI_InitCbkDelegate DelegateCbk)
{
sm_ci_error_t ret = sm_ci_error_t.SM_CI_ERR_UNKNOWN; sm_ci_init_param_t stInitParam = new sm_ci_init_param_t();
stInitParam.ptr_CIInitCbk = Marshal.GetFunctionPointerForDelegate(DelegateCbk);
//stInitParam.ptr_CIInitCbk = IntPtr.Zero; IntPtr ptr_pInitParam = IntPtr.Zero;
ptr_pInitParam = Marshal.AllocHGlobal(Marshal.SizeOf(stInitParam));
if (ptr_pInitParam != IntPtr.Zero)
{
Marshal.StructureToPtr(stInitParam, ptr_pInitParam, true);
ret = SM_CI_Init(ptr_pInitParam);
}
Marshal.FreeHGlobal(ptr_pInitParam);
ptr_pInitParam = IntPtr.Zero; return ret;
}
}2、调用部分:
sm_ci_error_t ErroCode = sm_ci_error_t.SM_CI_ERR_UNKNOWN;
CIStackDLL CSCIStack = new CIStackDLL();
SM_CI_InitCbkDelegate CIInitCbk = new SM_CI_InitCbkDelegate(CIInitReceiveMessageCbk);
ErroCode = CSCIStack.CS_SM_CI_Init(CIInitCbk); public static sm_ci_error_t CIInitReceiveMessageCbk(sm_msg_code_t i_nMsgCode,
IntPtr i_pInMsgData,//所取数据指针
uint i_dwInMsgLen,//所取数据长度
IntPtr o_pOutMsgData,
uint i_dwMaxOutLen,
IntPtr o_pnOutLen)
{
sm_ci_error_t ret = sm_ci_error_t.SM_CI_OK;
return ret;
} 我自己看来代码应该没什么问题了,编译能通过,可是执行时每次到需要调用回调时应用程序就会挂掉,还没错误提示程序直接崩溃,不得不寻高人指点我的代码是不是有什么问题。
1、定义部分:
public struct sm_ci_init_param_t
{
public uint m_dwStructSize;//非托管代码中未用到此成员
public byte m_bStructVersion;//非托管代码中未用到此成员
public IntPtr ptr_CIInitCbk;//SM_CI_ReceiveMessageFun_t m_pfunReceiveMessage;回调函数指针
} //定义委托
public delegate sm_ci_error_t SM_CI_InitCbkDelegate(sm_msg_code_t i_nMsgCode,
IntPtr i_pInMsgData,//数据指针
uint i_dwInMsgLen,
IntPtr o_pOutMsgData,
uint i_dwMaxOutLen,
IntPtr o_pnOutLen); public class CIStackDLL
{
[DllImport("cistack.dll")]
private static extern sm_ci_error_t SM_CI_Init(IntPtr ptr_pInitParam);//sm_ci_init_param_t结构传出指针
//对SM_CI_Init稍做封装
public sm_ci_error_t CS_SM_CI_Init(SM_CI_InitCbkDelegate DelegateCbk)
{
sm_ci_error_t ret = sm_ci_error_t.SM_CI_ERR_UNKNOWN; sm_ci_init_param_t stInitParam = new sm_ci_init_param_t();
stInitParam.ptr_CIInitCbk = Marshal.GetFunctionPointerForDelegate(DelegateCbk);
//stInitParam.ptr_CIInitCbk = IntPtr.Zero; IntPtr ptr_pInitParam = IntPtr.Zero;
ptr_pInitParam = Marshal.AllocHGlobal(Marshal.SizeOf(stInitParam));
if (ptr_pInitParam != IntPtr.Zero)
{
Marshal.StructureToPtr(stInitParam, ptr_pInitParam, true);
ret = SM_CI_Init(ptr_pInitParam);
}
Marshal.FreeHGlobal(ptr_pInitParam);
ptr_pInitParam = IntPtr.Zero; return ret;
}
}2、调用部分:
sm_ci_error_t ErroCode = sm_ci_error_t.SM_CI_ERR_UNKNOWN;
CIStackDLL CSCIStack = new CIStackDLL();
SM_CI_InitCbkDelegate CIInitCbk = new SM_CI_InitCbkDelegate(CIInitReceiveMessageCbk);
ErroCode = CSCIStack.CS_SM_CI_Init(CIInitCbk); public static sm_ci_error_t CIInitReceiveMessageCbk(sm_msg_code_t i_nMsgCode,
IntPtr i_pInMsgData,//所取数据指针
uint i_dwInMsgLen,//所取数据长度
IntPtr o_pOutMsgData,
uint i_dwMaxOutLen,
IntPtr o_pnOutLen)
{
sm_ci_error_t ret = sm_ci_error_t.SM_CI_OK;
return ret;
} 我自己看来代码应该没什么问题了,编译能通过,可是执行时每次到需要调用回调时应用程序就会挂掉,还没错误提示程序直接崩溃,不得不寻高人指点我的代码是不是有什么问题。
解决方案 »
- 如何在C#.NET中创建一个程序的LOGO窗体?
- 求解方程式. (不知道在哪问,还是发在这吧.)
- 请教 如何在C#中 调用dll文件提供的对外接口~~~~一旦解决再追100
- 怎样将复选框放入状态栏
- 请问VS2005中如何设置虚拟目录的映像,例如一个c:\a\ 目录可以直接\a\来访问
- SQL问题!请高手指点!
- 请大家帮我分析一下以下的方法在使用过程中会不会对服务器造成很大压力
- 分散没了也不郁闷了,以此帖感谢刚才回贴的人.快来接分吧
- Vs2003使用的莫名恼火问题!!!??
- 一个小问题VS.NET2002和VS.NET2003怎么分呀
- 求助:根据输入字符,动态查询记录并将记录赋值于textbox
- 如何读取绝对路径下的文件或者图片
SM_CI_InitCbkDelegate CIInitCbk = new SM_CI_InitCbkDelegate(CIInitReceiveMessageCbk);
ErroCode = CSCIStack.CS_SM_CI_Init(CIInitCbk);
如果回调函数会长期执行,需要将用到的委托定义为全局变量,防止垃圾回收委托。