2015-05-15 72 views
0

我创建了一个使用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)); 
} 

评估的.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

是您的实际代码?你真的有任何功能之外的陈述吗?请尝试创建[最小化,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们显示。 –

回答

0

尽管DLL有可能导入主应用程序导出的符号,但它非常复杂。

一个简单得多的方法(更容易调试,因此“更好”)方法是将函数指针传递给DLL,通过它可以回调函数。

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

你可以看到回调函数指针的例子在整个Windows API的 - 几乎名为EnumXYZ接受任何回调API函数。保存函数指针供以后使用的例子将是一个窗口过程,该过程由RegisterClass存储,然后在消息处理期间使用SendMessage,GetMessage,DispatchMessage等。

相关问题