想实现的功能:
在DLL中封装一个函数func,该函数会不定时地返回一些信息。调用该DLL中的func函数时,想通过回调函数来接收func返回的消息。封装DLL时,好象要用到函数指针,具体不太清楚如何实现,
请熟悉的朋友帮忙介绍下,谢谢
在DLL中封装一个函数func,该函数会不定时地返回一些信息。调用该DLL中的func函数时,想通过回调函数来接收func返回的消息。封装DLL时,好象要用到函数指针,具体不太清楚如何实现,
请熟悉的朋友帮忙介绍下,谢谢
解决方案 »
- 问个问题,能不能把DLL封装打包成ACTIVEX让WEB程序调用
- 请教个MFC框架中D3D的效率问题~
- 不同函数之能否用goto
- 请问各位高手,怎么在VC中调用DELPHI写的COM啊!!
- 哪有将BMP转换为GIF的库或源码下载?
- MFC动态创建菜单问题?
- 在win2000 Professional下如何安装IIS
- [讨教]关于虚拟文件夹的编写(Windows Shell NameSpace Extension相关)
- 如何操作dbf文件?
- 关于 edit 多行编辑框的内容转换问题
- 用CreateProcess执行net start/stop并等待进程句柄,发现没等到net命令执行完,Wait就返回了
- 如何捕获鼠标键盘的信息
typedef int (CALLBACK *SomeFunCallback)(参数列表);void SetSomeCallback(SomeFunCallback pfnCallback);
//提示无法从__cdecl向__stdcall类型//该回调函数中接收消息
/*static*/ int CALLBACK OnCBFunc(int Param1, int Param2, int *outParam)
{
AfxMessageBox("回调函数CBFunc接收消息");
return 0;
} //接收消息的函数原型
extern "C" __declspec(dllexport) int CBFunc(int Param1, int Param2, int *outParam);//设置回调函数
typedef int(__stdcall *PFCALLBACK)(int Param1, int Param2, int *outParam);//定义函数指针
PFCALLBACK gCallBack;extern "C" __declspec(dllexport) void TestCallBack(PFCALLBACK Func);//测试调用DLL中的函数
void CTestDLLDlg::OnButton1()
{
HINSTANCE hInstance;
VERIFY(hInstance=::LoadLibrary("myDLL.dll"));
gCallBack=0; //初始化函数指针 typedef int (CBFuncType)(int Param1, int Param2, int *outParam);
CBFuncType* CBFunc; CBFunc = (CBFuncType*)::GetProcAddress(hInstance,"CBFunc"); //这里提示关于从__cdecl向__stdcall类型转换的问题!!!!!!
//cannot convert parameter 1 from 'int (__cdecl *)(int,int,int *)' to 'int (__stdcall *)(int,int,int *)'
//gCallBack = CBFunc;
TestCallBack(CBFunc);
}
typedef int(__stdcall *PFCALLBACK)(int Param1, int Param2, int *outParam);extern "C" __declspec(dllexport) int /*WINAPI*/ CBFunc(int Param1, int Param2, int *outParam);//演示回调函数被调用
extern "C" __declspec(dllexport) int /*WINAPI*/ /*extern "C" __declspec(dllexport) int*/ CBFunc(int Param1, int Param2, int *outParam)
{
int sum = Param1 + Param2;
*outParam = sum; CString s;
s.Format("计算结果:%d", sum);
//AfxMessageBox(s); return sum;
} //全局变量,用来保存传入的函数地址
PFCALLBACK gCallBack=0; static int i = 0;
ULONG WINAPI Thread1(LPVOID Param)
{
for (i = 0; i < 10; i++)
{
int *p = new int[10];
(*gCallBack)(i, 1, p); //p用来异步传出返回值
Sleep(3000);
delete p;
p = NULL;
}
return 0;
} //设置回调函数
/*void WINAPI*/ extern "C" void __stdcall TestCallBack(PFCALLBACK Func)
{
if(Func==NULL)
return;
gCallBack = Func; //保存函数地址
//启动线程
DWORD ThreadID = 0;
HANDLE hThread = CreateThread(NULL, 0, Thread1, NULL, 0, &ThreadID);
return;
}