2015-05-15 105 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等。

相關問題