C# 调用C++ 回调函数成功后 卡死
public enum MPRDeviceEvent
{
PLUGED_IN, //设备插入
PLUGED_OUT, //设备设备拔出
MPR_CODE_CAPTURED, //点读了一个MPR码
POWER_KEY_PRESSED, //POWER键被按下
UP_KEY_PRESSED, //音量+键被按下
DOWN_KEY_PRESSED //音量-键被按下
}
private static void ProcessMPRDeviceEvent(MPRDeviceEvent mrpevent, IntPtr p_data, int data_len)
{
switch (mrpevent)
{
case MPRDeviceEvent.MPR_CODE_CAPTURED:
{
byte[] byteCode = new byte[data_len];
Marshal.Copy(p_data, byteCode, 0, data_len);
Marshal.Release(p_data);
string strCode = string.Empty;
for (int i = 0; i < data_len; i++)
{
strCode += byteCode[i].ToString("X");
}
_Lable.Text = strCode;
break;
}
}
}
public delegate void DelegateMPRCallBack(MPRDeviceEvent mrpevent, IntPtr p_data, int data_len);
public static System.Windows.Forms.Label _Lable;
static DelegateMPRCallBack _CallBack;
[DllImport("MPRDeviceAPI.dll")]
public static extern int MPRDevice_InitLib(DelegateMPRCallBack callBack);
public static bool Start(System.Windows.Forms.Label lable)
{
_Lable = lable;
_CallBack = new DelegateMPRCallBack(ProcessMPRDeviceEvent);
MPRDevice_InitLib(_CallBack);
}
以上是我用C#调用C++回调函数的部分代码,调试时,调用成功,但是调用成功后,程序就会出现未响应!!不知哪里出问题了??请高手指教!! c# 回调函数
[解决办法]
如果data_len比较大,比如几兆,那么strCode += ...会很慢,成为瓶颈。如果是这种情况,你可以用StringBuilder:
StringBuilder strCode = new StringBuilder();
for (int i = 0; i < data_len; i++)
{
strCode.Append(byteCode[i].ToString("X"));
}
_Lable.Text = strCode.ToString();
[解决办法]
(MPRDeviceEvent mrpevent, IntPtr p_data, int data_len);
IntPtr p_data
这个参数,定义为StringBuilder,试试看。
[解决办法]
有的第三方dll
用vs调试的时候会卡死
直接运行生成的exe则不会
[解决办法]
试试 Invoke
[解决办法]
1. 把strcode改成全局变量,_Lable.Text=strcode;这句话放到自定义消息处理里去,这里替换成发送自定义消息
2. label所在窗口的构造函数里, 在InitializeComponent();下面添加
Control.CheckForIllegalCrossThreadCalls = false;
[解决办法]
C# 有自动释放内存的GC 处理机制 那么C+内存处理是不是要人工处理。光看代码 感觉没问题这个应请教下C++高手
[解决办法]
_Lable.Text 用个string 看看吧 还有用委托吧。。。
[解决办法]
把byte[]?byteCode?=?new?byte[data_len]; 放到回调函数之外,声明成全局变量,然后在回调函数中使用这个变量,
这样修改试试.