C#调用C++中函数指针问题 本帖最后由 wj0728 于 2011-01-21 15:44:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void* __stdcall AutoRun(callBack back,char *url = NULL);callBack back是如何定义的? 上面c++的写错了,应该his这样void* __stdcall AutoRun(callBack back,char *url = NULL);//callBack的定义typedef void (*callBack)(State);enum State{ Connected, DisConnected, Change}; 函数指针 其实应该是个 int ,他存放的是 callBack 这个函数的地址不知道我理解对不对 这是个回调函数,传入的参数其实就是让外部调用的方法和callback建立关联,从而来实现回调的功能 可能是枚举类的问题吧,能不能在public void StateChange(State st){ .....}中设置断点判断是否接收到了State [DllImport("Device.dll")]public static extern void AutoRun(PointDelegate pd, string url);在这里指定所使用的函数名,指定编码格式,stringurl改为StringBuilder,有可能dll要写这块内存的,最后确定dll已经导出这个函数了 改为:public delegate void PointDelegate(short st); 试试 PointDelegate pd = new PointDelegate(StateChange);这一行定义的是局部变量,回头 pd 就是没用的指针了,pd在函数结束就会被回收,然后指向的委托也被回收,就异常了。你定义为成员变量。private PointDelegate pd = null;public void Init(){ if(pd == null) pd = new PointDelegate(StateChange);} void *则为“无类型指针”,void *可以指向任何类型的数据[DllImport("Device.dll")]public static extern IntPtr AutoRun(PointDelegate pd, string url);public delegate void PointDelegate(State st);public void StateChange(State st){ .....}//pd定义为全局变量,防止垃圾回收PointDelegate pd = new PointDelegate(StateChange);private void Init(){ IntPtr p=AutoRun(pd, "www.baidu.com");}public enum State{ Connected, DisConnected, Change}最好是看看C++代码,看下是怎么处理的 NND,原来是c++提供的dll内部出错了,现在已经解决了,谢谢 发送邮件附件的问题 第三方控件状态栏的用法 关于TabControl的问题 十万火急! datagrid的背景色的问题 如何用c#制作ie插件 一个很棘手的项目问题,请高手帮助 C#窗体中PictureBox的使用 调用user32.dll的问题. c# 注册表是否可以多程序共享访问 ASP.NET如何统计每个用户登录网站的次数 关于DataTable.Select方法比较日期的问题
callBack back是如何定义的?
typedef void (*callBack)(State);
enum State
{
Connected,
DisConnected,
Change
};
public void StateChange(State st)
{
.....
}
中设置断点判断是否接收到了State
public static extern void AutoRun(PointDelegate pd, string url);
在这里指定所使用的函数名,指定编码格式,stringurl改为StringBuilder,有可能dll要写这块内存的,最后确定dll已经导出这个函数了
这一行定义的是局部变量,回头 pd 就是没用的指针了,pd在函数结束就会被回收,然后指向的委托也被回收,就异常了。你定义为成员变量。
private PointDelegate pd = null;
public void Init()
{
if(pd == null) pd = new PointDelegate(StateChange);
}
public static extern IntPtr AutoRun(PointDelegate pd, string url);
public delegate void PointDelegate(State st);
public void StateChange(State st)
{
.....
}//pd定义为全局变量,防止垃圾回收
PointDelegate pd = new PointDelegate(StateChange);
private void Init()
{
IntPtr p=AutoRun(pd, "www.baidu.com");
}public enum State
{
Connected,
DisConnected,
Change
}
最好是看看C++代码,看下是怎么处理的