疑难杂症,回调函数多次调用就出错

youxiazzz12 2014-04-15 05:47:45
用C++实现了一个回调函数接口的DLL,然后在C#的Form里面调用
C++的部分代码:

//声明
typedef bool (CALLBACK *CallbackHandler)(char *sMsg);
CallbackHandler m_CrdHandler ; //回复信息的回调函数
extern "C"__declspec(dllexport)BOOL WINAPI APISetCallback(CallbackHandler Info)
{
m_CrdHandler = Info;
return TRUE;
}
extern "C" __declspec(dllexport) int __stdcall APITestCall(char* sMsg)
{
m_CrdHandler(sMsg);
return 0;
}


然后在C#里面调用

//声明
public delegate void MyDllCall(string buf);

[DllImport("D:\\xx\\xx\\xx.dll", EntryPoint = "APISetCallback")]
static extern int APISetCallback(MyDllCall fa);

[DllImport("D:\\xx\\xx\\xx.dll", EntryPoint = "APITestCall")]
static extern int APITestCall(string sBuf);
private void Btn_SetCallBack_Click(object sender, EventArgs e)
{
APISetCallback(DoWhileGetMsg);
}

//声明回调的函数
public void DoWhileGetMsg(string buf)
{
return;
if (buf == "") return;
System.IO.StreamWriter sw;
sw = new System.IO.StreamWriter(sLogFile, true);
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Client Get command:");
sw.WriteLine(buf);
sw.Flush();
sw.Close();
return;
}

private void Btn_TestCall_Click(object sender, EventArgs e)
{
APITestCall(MsgBox1.Text);
}


其实DoWhileGetMsg这个函数体里面那么多return就是调试的时候添加的,最后干脆什么都不执行,还是会出错,如下:

如果多次点击按钮(大概4,5十次),则会弹出对话框

对“FormsAppClt!FormsAppClt.Form1+MyDllCall::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃
、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
...全文
389 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
youxiazzz12 2014-04-16
  • 打赏
  • 举报
回复
解决了,原来是代理需要定义成static的
private static MyDllCall callbackfun;  
        private void Btn_SetCallBack_Click(object sender, EventArgs e)
        {
            callbackfun = DoWhileGetMsg;
            APISetCallback(callbackfun);
        }       
谢谢
youxiazzz12 2014-04-16
  • 打赏
  • 举报
回复
引用 3 楼 shiguojie19892 的回复:
那可能有是有溢出,可以查看一下申请内存的地方
我现在感觉就是回调的这个句柄出的问题,毕竟回调函数里面什么也没做
youxiazzz12 2014-04-16
  • 打赏
  • 举报
回复
引用 2 楼 u010005508 的回复:
[quote=引用 1 楼 youxiazzz12 的回复:] 运行少量次数是正常的,当我点击TestCall多次后,就出错
有个疑问!你DLL中定义的回调函数的返回类型为bool!但C#中传递进去的函数返回类型为void!这样是可以的?[/quote] 这个我倒没注意,刚才返回值都改成bool,试了一下,问题依旧
shiguojie19892 2014-04-15
  • 打赏
  • 举报
回复
那可能有是有溢出,可以查看一下申请内存的地方
highnewrain 2014-04-15
  • 打赏
  • 举报
回复
引用 1 楼 youxiazzz12 的回复:
运行少量次数是正常的,当我点击TestCall多次后,就出错
有个疑问!你DLL中定义的回调函数的返回类型为bool!但C#中传递进去的函数返回类型为void!这样是可以的?
youxiazzz12 2014-04-15
  • 打赏
  • 举报
回复
运行少量次数是正常的,当我点击TestCall多次后,就出错

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧