求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#