什么是回调函数?如何调用外部的dll?

Magichi 2010-05-16 10:16:14
RT,求详细解答,谢谢
...全文
206 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
maofeisj 2011-11-01
  • 打赏
  • 举报
回复
把你的DLL放程序bin目录下,如果是WinForm就放Bin\Debug目录下 ,实在不行就放C:\Windows\system32目录下。
hztltgg 2010-05-17
  • 打赏
  • 举报
回复
所谓回调,就是不是你调用它,而是系统自己调用它。

你写的代码里主动调用的方法那不是回调函数,但类似与你的事件处理函数就是回调函数了,系统得到一个事件的发生后,主动来调用你的事件处理函数。


至于DLL,那你的程序引用它,就可以直接用了,如果你的外部DLL是指没有引用,那么你还可以通过反射在运行的时候加载它
mayonglong 2010-05-17
  • 打赏
  • 举报
回复
3楼很详细了~
zzw3423343 2010-05-17
  • 打赏
  • 举报
回复
可以把DLL理解成为一个命名空间,如果要调用外部的DLL,则首先要添加此DLL的引用,然后在程序中也不要忘记添加using namespace "xxx"
Magichi 2010-05-17
  • 打赏
  • 举报
回复
等待高手解答
njw1028 2010-05-17
  • 打赏
  • 举报
回复
都很详细了
Magichi 2010-05-17
  • 打赏
  • 举报
回复
继续等待高人解答
noway8881 2010-05-16
  • 打赏
  • 举报
回复
1.回调函数就是函数的指针
2.如果是平台调用可以参考http://www.pinvoke.net/
Magichi 2010-05-16
  • 打赏
  • 举报
回复
大家都来讨论下啊
Magichi 2010-05-16
  • 打赏
  • 举报
回复
想问下2楼的理解怎么样?
3楼的能不能说的简单点?
捷哥1999 2010-05-16
  • 打赏
  • 举报
回复
如何调用外部的dll
1、如果这个dll不是.net编写的,则参考这个:
http://blog.csdn.net/tangl_99/archive/2006/09/06/1182354.aspx

2、如果这个dll是.net编写的,直接添加对这个dll的引用,就可以使用dll里面定义的类型了

至于回调函数,请看:

什么是回调函数?


  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

为什么要使用回调函数?

  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

  如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

  回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。

  另一个使用回调机制的 API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。

  不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。
wuyq11 2010-05-16
  • 打赏
  • 举报
回复
回调函数就是把一个方法的传给另外一个方法去执行
public delegate string ProcessDelegate(string s1, string s2);
public string Process(string s1,string s2,ProcessDelegate process)
{
return process(s1, s2);
}
public string Process1(string s1, string s2)
{
return s1 + s2;
}
使用 DllImport 属性通过调用
  • 打赏
  • 举报
回复
回调 函数,委托监视的方法(事件)在执行,,一般这个方法都是运行在辅助纯种里的,这个方法有返回值,则要定义一个回调函数去接收这个值,用于监视方法的执行情况。
引用外部DLL,右击引用--》添加引用,找到DLL路径,不就把DLL程序集里的东西引用到项目中了么


#region 异步通知:委托
delegate void WorkStarted();
delegate void WorkProgressing();
delegate int WorkCompleted();

class Worker
{
//委托监视的事件
public event WorkStarted started;
public event WorkProgressing progressing;
public event WorkCompleted completed;

public void DoWork()
{
Console.WriteLine("工作: 工作开始");
if (started != null) started();

Console.WriteLine("工作: 工作进行中");
if (progressing != null) progressing();

Console.WriteLine("工作: 工作完成");
/************************************************
* 不幸地,彼得有回到了一开始就想避免的情况中来,比如,老板站在背后盯着他工作。
* 于是,他决定使用自己的委托 作为 他调用的 异步委托完成的通知,让他自己立即回到工作,
* 但是仍可以在别人给他的工作打分后得到通知:
************************************************/
if (completed != null)
{
foreach (WorkCompleted wc in completed.GetInvocationList())
{
wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);//此是你要看,WorkGraded就是回调函数
}
}
}
private void WorkGraded(IAsyncResult res)//
{
WorkCompleted wc = (WorkCompleted)res.AsyncState;
int grade = wc.EndInvoke(res);
Console.WriteLine("工人的工作得分=" + grade);
}
}

class Boss
{
public int WorkCompleted()
{
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Better...");
return 6; /* 总分为10 */
}
}

class Universe
{
static void WorkerStartedWork()
{
Console.WriteLine("Universe notices worker starting work");
}

static int WorkerCompletedWork()
{
System.Threading.Thread.Sleep(4000);
Console.WriteLine("Universe pleased with worker~s work");
return 7;
}
static void Main()
{
Worker peter = new Worker();
Boss boss = new Boss();
peter.completed += new WorkCompleted(boss.WorkCompleted);
peter.started += new WorkStarted(Universe.WorkerStartedWork);
peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);
peter.DoWork();

Console.WriteLine("Main: 工人工作完成");
Console.ReadLine();
}
}
#endregion

110,534

社区成员

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

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

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