求c++转成C#

gdyt007 2007-03-07 07:02:58
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则取消中断服务,否则在中断时调用该程序



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


恳求哪位大虾帮忙一下,解决立即送分
...全文
563 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang854126 2012-07-04
  • 打赏
  • 举报
回复
//是由于回调函数指针(委托)系统回收
NotifyCallBack mynotifycallback = new NotifyCallBack(NOTIFY_ROUTINE);
ch375.SetDeviceNotify(mynotifycallback))
改为
NotifyCallBack mynotifycallback = new NotifyCallBack(NOTIFY_ROUTINE);
GC.Collect();
GC.WaitForPendingFinalizers(); //防止委托函数被系统回收
ch375.SetDeviceNotify(mynotifycallback))
gaoju117 2007-03-09
  • 打赏
  • 举报
回复
学习
gdyt007 2007-03-09
  • 打赏
  • 举报
回复
这个问题还是存在....恳请哪位大虾出手相助....
ReViSion 2007-03-08
  • 打赏
  • 举报
回复
帮顶
静_心 2007-03-08
  • 打赏
  • 举报
回复
关注
gdyt007 2007-03-08
  • 打赏
  • 举报
回复
问题解决的话,我另外开贴再次专门酬谢....本贴UP有分
gdyt007 2007-03-08
  • 打赏
  • 举报
回复
另一个中断服务倒是可以运行并且正确的。

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))

}
nspforever 2007-03-08
  • 打赏
  • 举报
回复
private void GetData(IntPtr Pth)
{}
改成
static void GetData(IntPtr Pth)
{}
试一试
gdyt007 2007-03-08
  • 打赏
  • 举报
回复
问题仍未解决....UP
nspforever 2007-03-07
  • 打赏
  • 举报
回复
[DllImport("CH375DLL.DLL")]
private static extern bool CH375SetIntRoutine(
uint iIndex,
[MarshalAs(UnmanagedType.FunctionPtr0)]IntCallBack iIntRoutine);
王集鹄 2007-03-07
  • 打赏
  • 举报
回复
你是怎么读取private void GetData(IntPtr Pth)
中Pth的数据的?
nspforever 2007-03-07
  • 打赏
  • 举报
回复
PUCHAR 是 typedef unsigned char* PUCHAR吗?
如果是的话用UIntPtr试一试
gdyt007 2007-03-07
  • 打赏
  • 举报
回复
当然不会
王集鹄 2007-03-07
  • 打赏
  • 举报
回复
private void GetData(IntPtr Pth)
{
这里是怎么写的?
如果空着会出错吗?
}
gdyt007 2007-03-07
  • 打赏
  • 举报
回复
我觉得应该是那个PUCHAR iBuffer 的翻译问题。
gdyt007 2007-03-07
  • 打赏
  • 举报
回复
private void GetData(IntPtr Pth)
{}

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

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

nspforever 2007-03-07
  • 打赏
  • 举报
回复
你是怎么调用的
gdyt007 2007-03-07
  • 打赏
  • 举报
回复
Up一下

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧