首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 调用C++ 回调函数顺利后 卡死

2013-09-26 
C# 调用C++ 回调函数成功后 卡死public enum MPRDeviceEvent{PLUGED_IN,//设备插入PLUGED_OUT,//设备设备

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];  放到回调函数之外,声明成全局变量,然后在回调函数中使用这个变量,
这样修改试试.

热点排行