如何实现DLL里面的回调函数

kingmax54212008 2008-12-29 10:47:57
 我想在我的C++的DLL里,实现回调函数,流程如下:

program --------------------→ dll
  ↑ ¦
  ¦_______________________________¦
  callback(回调)


我是该用MFC常规DLL还是MFC扩展DLL实现?如果实现?
(刚刚入门写DLL,大家多多指教!)





...全文
382 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sys0007 2009-01-01
  • 打赏
  • 举报
回复
回调就是把一个函数的地址当作参数出入到另外的函数里。
在DLL里实现也没什么特殊的
huxiao2005 2008-12-30
  • 打赏
  • 举报
回复
此代码适合远程推进安装,木马下载器,升级等功能
huxiao2005 2008-12-30
  • 打赏
  • 举报
回复
哎,不忍心,给你个例子吧

下面是我写的远程http下载程序给你看看,有个回调函数参数 RESPROC fun
typedef void (*RESPROC)(unsigned long , LPCSTR ); //结果处理回调函数定义
typedef LPVOID ( WINAPI * pInternetOpen ) (LPCTSTR ,DWORD ,LPCTSTR ,LPCTSTR ,DWORD );
typedef LPVOID ( WINAPI * pInternetOpenUrl ) ( LPVOID ,LPCTSTR ,LPCTSTR ,DWORD ,DWORD ,DWORD);
typedef BOOL ( WINAPI * pInternetCloseHandle ) ( LPVOID );
typedef BOOL ( WINAPI * pInternetReadFile ) (LPVOID ,LPVOID ,DWORD ,LPDWORD) ;
typedef BOOL (WINAPI *pInternetWriteFile )(LPVOID,LPCVOID,DWORD,LPDWORD);


/*远程http下载,作者:胡循锋,QQ:122108210, e-mail: huxiao2005@163.com*/
int DownFiles(const char Url[], const char savefile[], RESPROC fun)
{
HMODULE hDll;
LPVOID hInternet,hUrlHandle;
char buf[1024];
DWORD dwSize,ret=0;
int len=7;
FILE *pf=NULL;
hDll = LoadLibrary("wininet.dll");
if(hDll)
{
pInternetOpen InternetOpen=NULL;
pInternetOpenUrl InternetOpenUrl=NULL;
pInternetCloseHandle InternetCloseHandle=NULL;
pInternetReadFile InternetReadFile=NULL;
InternetOpen = ( pInternetOpen ) GetProcAddress( hDll, "InternetOpenA" );
InternetOpenUrl = (pInternetOpenUrl ) GetProcAddress ( hDll, "InternetOpenUrlA");
InternetCloseHandle = (pInternetCloseHandle) GetProcAddress (hDll,"InternetCloseHandle");
InternetReadFile = (pInternetReadFile) GetProcAddress(hDll,"InternetReadFile");

hInternet = InternetOpen("httpupdate",0, NULL, NULL, 0);
if (hInternet != NULL)
{
printf("start download %s...\ndownloading: 0 Bytes",Url);
hUrlHandle = InternetOpenUrl(hInternet, Url, NULL, 0, 0x04000000, 0);
if (hUrlHandle!= NULL)
{
pf = fopen(savefile,"wb+");
do
{
memset(buf,0,1024);
if (!InternetReadFile(hUrlHandle, buf,1024, &dwSize))
{
break;
}
if(dwSize>0&&pf){
fwrite(buf,1,dwSize,pf);
ret +=dwSize;
#if 0
if(len==0)
len = printf("%d Bytes",ret);
else{
while(len--)
printf("\b");
len = printf("%d Bytes",ret);
}
#endif
}else if(dwSize==0)
break;
if(fun)
fun(MAKELONG(dwSize,DLT_DONE_SIZE),savefile);
}while (TRUE);
if(pf)
fclose(pf);
InternetCloseHandle(hUrlHandle);
hUrlHandle = NULL;
}
InternetCloseHandle(hInternet);
hInternet = NULL;
}
FreeLibrary(hDll);
}
//printf("\nEnd download %s, Size:%d\n",Url,ret);
return ret;
}
huxiao2005 2008-12-30
  • 打赏
  • 举报
回复
太简单了,自己写代码琢磨吧
ilovedrv 2008-12-29
  • 打赏
  • 举报
回复
在动态库里面定一个接口,如下,然后在program里面调用这个接口,同时传递你的回调函数指针

externc "C" void enum(*, *, call_back_func *)
{
...
call_back_func(*)
...
}


cnzdgs 2008-12-29
  • 打赏
  • 举报
回复
MFC常规DLL和扩展DLL都可以使用回调函数。你需要定义回调函数指针的类型,在DLL导出函数中定义一个函数指针型参数,调用者通过该参数把回调函数(地址)传过来。
ouyh12345 2008-12-29
  • 打赏
  • 举报
回复
把回调函数作为参数
e_sharp 2008-12-29
  • 打赏
  • 举报
回复
UP
oyljerry 2008-12-29
  • 打赏
  • 举报
回复
比如dll里的
extern "C " __declspec(dllexport) void __stdcall call(void (*CallBack)())
{
CallBack();
}

在exe里:
void ExeFunc()
{
ShowMessage( "Callback ");
}
call(ExeFunc);
hxyman 2008-12-29
  • 打赏
  • 举报
回复
http://www.programfan.com/article/163.html

------------------------------------
Posted By EasyCsdn1.0
qrlvls 2008-12-29
  • 打赏
  • 举报
回复
不管回不回调,总之来说他都是一个可以被跨模块调用的函数而已
只要能够在dll里导出无论是扩展dll还是规则dll都是可用的,只是你自己需要区分何时适合用扩展dll,何时需要用规则dll
jgj58 2008-12-29
  • 打赏
  • 举报
回复
我在这方面也是初学,说的不对请大家多包涵
jgj58 2008-12-29
  • 打赏
  • 举报
回复
都可以实现的。 你说的DLL都差不多,只是常规的需要编写def文件。扩展MFC就不用了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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