关于函数指针的写法。

725137 2013-07-17 08:07:23
我有一个主程序和一个dll程序,我想在主程序中,将自已的一个函数指针传给dll,然后dll回调这个主程序的函数,但不知道写法,各位帮帮忙。

主程序:
[/code]


class A{
public:

void methodA()
{
HMODULE h= LoadLibrary("test.dll");
//接下来这里应该怎么写才能将methodB这个方法传给test.dll程序中的test方法呢?
//需要再声明一个类函数指针做为成员变量吗?
}
void methodB(int x)
{
}
}



test.dll:


....

void test(//这里应该怎么接收主程序的那个函数指什啊?这里参数怎么写呢?)
{

}
.....




各位帮帮忙,小弟不太懂c++的这种语法,原理我知道,但就是写不出来。如果主程序中不是采用类的话,我还能写写。如果是类的一个函数指针,就不会写了
...全文
233 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
725137 2013-07-19
  • 打赏
  • 举报
回复
引用 6 楼 yaozhiyong110 的回复:
[quote=引用 3 楼 725137 的回复:]
我只是在问传类函数指针的具体写法,请给个写法出来。再说这里传类的和静态的根本没有区别。


类的成员函数指针和一般函数指针 使用方式是不一样的 你可以自己上网查下...[/quote]


能帮我看下这个为什么出错呢?



//DLL.h文件
#ifdef TEST_DLL_API
#else
#define TEST_DLL_API extern "C" _declspec(dllexport)
#endif

#include <string>
using std::string;

typedef void (*webCallBackFun)(string ,int ,string);


TEST_DLL_API void md5(char* id,char* fname,webCallBackFun webCallBack);




DLL.cpp文件

#define TEST_DLL_API extern "C" _declspec(dllexport)

#include "stdafx.h"
#include "vdba.h"
#include "stdio.h"



BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


void md5(char* id,char* fname,webCallBackFun wcb){

::MessageBox(NULL,"Md5方法开始调用begin","md5提示:",0);
/* HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
WaitForSingleObject(handle, 0);
webCallBack = wcb;*/
wcb("f:aaaa.txt",10,"this is ");
::MessageBox(NULL,"Md5方法开始调用end","md5提示:",0);
}




//主程序文件

// testDll.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <string>
using std::string;

void WebCallBack(string s,int id,string result){
MessageBox(NULL,"WebCallBack","提示",MB_OK);
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.

HMODULE h = LoadLibrary("c:\\vdna.dll");
if( h==0){
MessageBox(NULL,"加载失败1","提示",MB_OK);
return S_OK;
}


typedef void (*webCallBackFun)(string ,int ,string);
typedef void (*Md5Fun)(char *id, char* filename,webCallBackFun);
Md5Fun md5 = (Md5Fun)GetProcAddress(h,"md5");
MessageBox(NULL,"11111111111","马上调用md5",MB_OK);
md5("10","c:\test.txt",WebCallBack);
MessageBox(NULL,"2222222222","",MB_OK);
return 0;
}



执行后就报上面的错。为什么呢?哪里写错了吗?
yaozhiyong110 2013-07-17
  • 打赏
  • 举报
回复
引用 3 楼 725137 的回复:
我只是在问传类函数指针的具体写法,请给个写法出来。再说这里传类的和静态的根本没有区别。
类的成员函数指针和一般函数指针 使用方式是不一样的 你可以自己上网查下...
725137 2013-07-17
  • 打赏
  • 举报
回复
哦。不好意思。看错了。我觉得3楼是正确的哈。。一会儿试试。
725137 2013-07-17
  • 打赏
  • 举报
回复
3楼好像有点对了。但是 typedef void (*test)(method *fun); 这里不需要定义成 typedef void (A::*test)(method *fun);这样么?
725137 2013-07-17
  • 打赏
  • 举报
回复
我只是在问传类函数指针的具体写法,请给个写法出来。再说这里传类的和静态的根本没有区别。
yaozhiyong110 2013-07-17
  • 打赏
  • 举报
回复
DLL: typedef void (*method)(int); void test(method *fun) { int i = 10; (*fun)(i); } 主程序: typedef void (*test)(method *fun); { HMODULE h= LoadLibrary("test.dll"); //接下来这里应该怎么写才能将methodB这个方法传给test.dll程序中的test方法呢? //需要再声明一个类函数指针做为成员变量吗? test *fun = GetProcAddress(h, "test"); if (fun) { fun(methodB); // method必须为全局或者静态东西成员函数 } }
ouyh12345 2013-07-17
  • 打赏
  • 举报
回复
全局函数或静态成员函数

15,471

社区成员

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

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