将另一个项目的头文件包含到DLL项目中

时间:2015-05-15 20:52:15

标签: c++ dll

我创建了一个测试应用程序,它使用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

是否需要遵循任何其他代码或程序?这可行吗?

1 个答案:

答案 0 :(得分:0)

虽然DLL可以导入主应用程序导出的符号,但它非常复杂。

更简单(更容易调试,因此更好)的方法是将函数指针传递给DLL,通过它可以回调应用程序函数。

这可以作为函数指针类型的函数参数来完成,传递给将使用它的函数。或者它可以提前很长时间配置并保存在DLL中的全局变量中,需要它的函数检索此全局变量并将其用于间接调用。

您可以在整个Windows API中看到回调函数指针的示例 - 几乎任何名为Enum XYZ 的API函数都接受回调。保存函数指针供以后使用的示例是窗口过程,该过程由RegisterClass存储,然后在消息处理期间使用SendMessageGetMessageDispatchMessage