我创建了一个测试应用程序,它使用DLL文件并调用其内部函数。
我按照链接中给出的步骤操作: Dynamically load a function from a DLL
我有Win32控制台应用程序和DLL创建者应用程序。理想情况下,Win32应用程序LoadLibrary()和GetsProcAddress()并获取DLL内部特定函数的函数指针,并传递参数,返回结果,所有工作都正常工作。
现在,我需要做的是,从控制台应用程序我需要在DLL中调用一个函数,在DLL函数中我需要在Win32控制台应用程序中调用一个函数来获取值而不是作为参数传递。
像这样,
1)将Win32控制台项目中使用的相同头文件包含到DLL项目中。 2)当Win32控制台项目调用DLL项目内部的函数时 3)从控制台项目获取值,处理它并将值设置回控制台应用程序
dllmain.cpp:
#include "evaluate.h"
extern "C" __declspec(dllexport) int _cdecl ADD(void)
{
int a = getValueOfA();
int b = getValueofB();
setValueOfC((a+b));
}
evaluate.cpp:
int getValueOfA(void)
{
return 3;
}
int getValueOfB(void)
{
return 5;
}
void setValueOfC(int c)
{
printf("\nValue of C is: %d",c);
}
HINSTANCE hGetProcIDDLL;
typedef int(_cdecl *func_ptr)();
hGetProcIDDLL = LoadLibrary("MyDll.dll);
func_ptr addFunc = (func_ptr)GetProcAddress(hGetProcIDDLL, "ADD");
addFunc();
evaluate.h
int getValueOfA();
int getValueOfB();
void setValueOfC(int value);
MYDLL.DEF:
EXPORTS
ADD @1
是否需要遵循任何其他代码或程序?这可行吗?
答案 0 :(得分:0)
虽然DLL可以导入主应用程序导出的符号,但它非常复杂。
更简单(更容易调试,因此更好)的方法是将函数指针传递给DLL,通过它可以回调应用程序函数。
这可以作为函数指针类型的函数参数来完成,传递给将使用它的函数。或者它可以提前很长时间配置并保存在DLL中的全局变量中,需要它的函数检索此全局变量并将其用于间接调用。
您可以在整个Windows API中看到回调函数指针的示例 - 几乎任何名为Enum
XYZ
的API函数都接受回调。保存函数指针供以后使用的示例是窗口过程,该过程由RegisterClass
存储,然后在消息处理期间使用SendMessage
,GetMessage
,DispatchMessage
等