回调函数多次调用就出错
来源:互联网 发布:西部数码域名转移管理 编辑:程序博客网 时间:2024/05/02 04:21
用C++实现了一个回调函数接口的DLL,然后在C#的Form里面调用
C++的部分代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//声明
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#里面调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//声明
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”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃
、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
解决了,原来是代理需要定义成static的
1
2
3
4
5
6
private
static
MyDllCall callbackfun;
private
void
Btn_SetCallBack_Click(
object
sender, EventArgs e)
{
callbackfun = DoWhileGetMsg;
APISetCallback(callbackfun);
}
谢谢
0 0
- 回调函数多次调用就出错
- 回调函数的结果,如果出错的话就返回FALSE
- C++回调函数出错简单介绍
- C++ dll 调用C#传入的回调函数,运行一段时间程序自动出错
- addEventListener("transitionend", ()=>{...})方法回调函数执行多次问题
- 同步调用、回调函数、异步调用
- ajax不能调用回调函数
- c#调用c++回调函数。
- 回调函数中删除调用者
- preg_replace_callback()调用类中的回调函数
- $.getJSON方法不调用回调函数
- ajax不能调用回调函数
- 回调函数声明与调用
- 函数调用习惯与回调函数
- $.getJSON方法不调用回调函数
- flex 回调函数没有被调用
- 异步调用和回调函数
- C# 调用dll 回调函数
- No_23Non-abundant sums
- ios判断系统是24小时制还是12小时制
- 数字反转
- linux2.6.36之后对工作队列的改进
- hdu1533 KM算法
- 回调函数多次调用就出错
- Flex JAVA Map BlazeDS 参数的传递
- java简单的FTP客户端
- 获取当前用户
- iText学习(一)
- 面向对象三大特性---封装性
- Android 获取WIFI MAC地址的方法
- 背包again
- sql 提取不重复记录