当前位置:编程学习 > C#/ASP.NET >>

求c++转成C#

C++ 源代码

typedef  VOID ( CALLBACK * mPCH375_INT_ROUTINE ) (  // 中断服务回调程序
PUCHAR   iBuffer );  // 指向一个缓冲区,提供当前的中断特征数据

BOOL WINAPI CH375SetIntRoutine(  // 设定中断服务程序
ULONG   iIndex,  // 指定CH375设备序号
mPCH375_INT_ROUTINE iIntRoutine );  // 指定中断服务回调程序,为NULL则取消中断服务,否则在中断时调用该程序

我现在写成:

public delegate void  IntCallBack( IntPtr iBuffer);
[DllImport("CH375DLL.DLL")] 
private static extern bool CH375SetIntRoutine(  // 设定中断服务程序
uint iIndex,  // 指定CH375设备序号
IntCallBack iIntRoutine );  // 指定中断服务回调程序,为NULL则取消中断服务,否则在中断时调用该程序 



在调用的时候竟然提示未将对象引用设置到对象的实例


恳求哪位大虾帮忙一下,解决立即送分
--------------------编程问答-------------------- Up一下 --------------------编程问答-------------------- 你是怎么调用的 --------------------编程问答-------------------- private   void  GetData(IntPtr Pth)
{}

IntCallBack mycallback = new IntCallBack(GetData);
SetIntRoutine(mycallback);

SetIntRoutine 是我写的另一个函数调用CH375SetIntRoutine的

--------------------编程问答-------------------- 我觉得应该是那个PUCHAR   iBuffer 的翻译问题。 --------------------编程问答-------------------- private   void  GetData(IntPtr Pth)
{
这里是怎么写的?
如果空着会出错吗?
} --------------------编程问答-------------------- 当然不会 --------------------编程问答-------------------- PUCHAR 是 typedef unsigned char* PUCHAR吗?
如果是的话用UIntPtr试一试 --------------------编程问答-------------------- 你是怎么读取private   void  GetData(IntPtr Pth)
中Pth的数据的? --------------------编程问答-------------------- [DllImport("CH375DLL.DLL")] 
private static extern bool CH375SetIntRoutine( 
uint iIndex,  
[MarshalAs(UnmanagedType.FunctionPtr0)]IntCallBack iIntRoutine); --------------------编程问答-------------------- 问题仍未解决....UP --------------------编程问答-------------------- private   void  GetData(IntPtr Pth)
{}
改成
static void GetData(IntPtr Pth)
{}
试一试 --------------------编程问答-------------------- 另一个中断服务倒是可以运行并且正确的。

C++源码:
typedef VOID ( CALLBACK * mPCH375_NOTIFY_ROUTINE ) (  // 设备事件通知回调程序
ULONG iEventStatus );  // 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件
BOOL WINAPI CH375SetDeviceNotify(  // 设定设备事件通知程序
ULONG iIndex,  // 指定CH375设备序号,0对应第一个设备
PCHAR iDeviceID,  // 可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
mPCH375_NOTIFY_ROUTINE iNotifyRoutine );  // 指定设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序


C#:
public delegate void NotifyCallBack( ulong  iEventStatus);

[DllImport("CH375DLL.DLL")]
private static extern  bool CH375SetDeviceNotify(  // 设定设备事件通知程序
 uint iIndex,  // 指定CH375设备序号,0对应第一个设备
string iDeviceID,  // 可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
NotifyCallBack iNotifyRoutine );  // 指定设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序

private void NOTIFY_ROUTINE(ulong iEventStatus)
{
if(iEventStatus==Calvin.CH375.CH375_DEVICE_ARRIVAL)  
{
this.statusBarPanel2.Text="设备已插上";  //将设备插入消息发送到窗体进行处理 
 

 
}
else if(iEventStatus==Calvin.CH375.CH375_DEVICE_REMOVE) 
{
 
this.statusBarPanel2.Text ="设备已拔出";  //将设备拔出消息发送到窗体进行处理

 
}


}
NotifyCallBack mynotifycallback = new NotifyCallBack(NOTIFY_ROUTINE);
ch375.SetDeviceNotify(mynotifycallback))

}
--------------------编程问答-------------------- 问题解决的话,我另外开贴再次专门酬谢....本贴UP有分 --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 这个问题还是存在....恳请哪位大虾出手相助.... --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- //是由于回调函数指针(委托)系统回收
NotifyCallBack   mynotifycallback   =   new   NotifyCallBack(NOTIFY_ROUTINE); 
ch375.SetDeviceNotify(mynotifycallback)) 
改为
NotifyCallBack   mynotifycallback   =   new   NotifyCallBack(NOTIFY_ROUTINE); 
GC.Collect();
GC.WaitForPendingFinalizers(); //防止委托函数被系统回收           
ch375.SetDeviceNotify(mynotifycallback)) 
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,