C#做界面新手,以前用的MFC,现在我要在C#程序中调用VC++写的DLL库,遇到两个问题:
1.C++库中函数原型为:BOLL LoadCode(char* databuf,int len);//功能为获取buf中的内容和长度然后进行下一步操作
  C#中 Extern bool LoadCode(byte []databuf,int len);
      调用方式大概为:
       ...
      byte[]PFileBuf =new byte[20*1024*1024];
      filehandle =openFileDialog1.OpenFile();
      filehandle.Read(PFileBuf,0,(int)filehandle.length);
      LoadCode(PFileBuf,(int)filehandle.length);
运行结果在获取了文件内容后,在底层对文件进行操作时会蓝屏,但是操作是成功的(此为配置文件,将板卡上面的灯成功点亮了)!请大家指教!
2.C++库中BOOL SetEventHandle(HANDLE hEvent)
{
   ....Window响应中断后
   hEvent->Set();//这句话是在驱动程序中执行的,hEvent由DLL中的hEvent传入
}
在C#中Extern bool SetEventHandle(AutoResetEvent hEvent);//貌似C#下不能用HANDLE定义?
AutoResetEvent  event =new AutoResetEvent ;//创建事件
SetEventHandle(event );//初始化事件
然后在线程中等待底层事件的触发 
...
{
    if(event.waitone(1000))//等待事件的触发
....接下来的操作省略
}
现在的问题是,一旦我底层触发事件,电脑直接死机或者蓝屏!是C#初始化事件方式不对么?我在MFC下用CREATEEVENT创建事件和Waiteforobject()等待事件触发完全没问题啊?
困扰我几天了,不知道有木有大神用过C#调用C++的库与我类似的经历,不胜感激!c#mfcvc++dllbyte

解决方案 »

  1.   

    tryAutoResetEvent  event =new AutoResetEvent ;//创建事件
    SetEventHandle(event.SafeWaitHandle );//初始化事件
      

  2.   

    驱动是用WDK开发的,的确是C++的
      

  3.   

    我调用的DLL里面的函数原型是BOOL SetEventHandle(HANDLE hEvent);
    我可以在C#下这样extern  bool SetEventHandle(event.SafeWaitHandle )引用么?
      

  4.   

    可以这么说吧,事件的确是驱动触发的,然后通过API回传到界面响应,我以前用的MFC做的界面,是用的CREATEEVENT创建事件和Waiteforobject()等待事件触发完全没问题啊,所以我怀疑C#下是不是用错方法来初始化事件了?
      

  5.   

     太感谢了,真的是初始化的问题,改为event.SafeWaitHandle就对了!是不是以前我填的参数AutoResetEvent  event是事件,而现在的参数SafeWaitHandle  safawaithandle 是句柄?
      

  6.   

    第一个问题不太好查,因为是偶尔会出现蓝屏,但是我MFC下的界面调用加载函数就不会蓝屏,唯一的区别就是MFC下调用的时候可以用指针描述参数而已啊BOLL LoadCode(char* databuf,int len);//
      

  7.   

    mfc 下 如何赋值 的?
      

  8.   

    MFC下直接把传进来的BUF数据MEMCPY给另一个BUF,然后再接下来的配置操作,算了哈,这个问题应该能自己检查出来,非常感谢你帮我解决了那个问题!结贴咯