2013-06-24 35 views
2

說我有一個包含這個DLL右:你可以動態調用DLL中的對象嗎?

//DLL 
class foo { 
    static __declspec int Add(int a, int b) 
    { 
    return a+b 
    } 
} 

我如何把它稱之爲GetProc地址?即:

HINSTANCE hFoo = LoadLibrary("Foo.dll"); 
int* proc = NULL; 
proc = (int*) GetProcAddress(hFoo, ??????); 
//Main Exec linked to dll 

世界你將如何得到使用GetProcAddress的一個DLL創建類的地址?

回答

3

edtheprogrammerguy是正確的。

這裏是如何讓班級正確曝光更多的信息:

您需要用屬性前綴:

__declspec(dllexport)... 

全部要公開的功能。

參見this。爲一個C函數

實施例:

__declspec(dllexport) int __cdecl Add(int a, int b) 
{ 
    return (a + b); 
} 

這可以使用MACROS被簡化:一切都在此helpful page說明。


對於C++類,你只需要前綴的每一個類(不是每個單一的方法)

我通常這樣做的:

注:以下也確保可移植性...

包含文件:

// my_macros.h 
// 
// Stuffs required under Windoz to export classes properly 
// from the shared library... 
// USAGE : 
//  - Add "-DBUILD_LIB" to the compiler options 
// 
#ifdef __WIN32__ 
#ifdef BUILD_LIB 
#define LIB_CLASS __declspec(dllexport) 
#else 
#define LIB_CLASS __declspec(dllimport) 
#endif 
#else 
#define LIB_CLASS  // Linux & other Unices : leave it blank ! 
#endif 

用法:

#include "my_macros.h" 

class LIB_CLASS MyClass { 
} 

然後,構建,簡單地說:

  • 傳遞選項-DBUILD_LIB通常的編譯器命令行
  • 傳遞選項-shared平時的鏈接器命令行
1

我試圖創建的顯式鏈接這裏是一個例子我終於想出了一個例子,對於之前沒有具體提及此事,我表示抱歉。

這裏,我們去:

//DLL 
#include "main.h" 
#include <windows.h> 
#include <stdexcept> 

using namespace std; 

class FOO{ 
static __declspec double ADD(double a, double b) 
{ 
    return a+b; 
} 
} 




    //EXEC 
    #include <windows.h> 
#include <iostream> 
#include <stdio.h> 

using namespace std; 
typedef double (*MYPROC)(double, double); 

int main() 
{ 
    double d1 = 10; 
    double d2 = 30; 
    double retval; 
    MYPROC procx = NULL; 
    DWORD err; 
    HINSTANCE hDll = LoadLibrary("DynamicLinkTester.dll"); 
    if(hDll != NULL) 
    { 
    cout << "Success"; 
    procx = (MYPROC) GetProcAddress(hDll, "_ZN7MathDLL5MathX3ADDEdd"); 
    if(NULL != procx) 
    { 
     retval= (procx)(d1, d2); 
     cout << retval; 
    } 
    } 


} 

如果有人想知道同樣的事情,我說:

雖然你不能明確要求從DLL可以調用它的方法的類/對象。

+0

+1分享:) –

+0

什麼是「_ZN7MathDLL5MathX3ADDEdd」? – Rida

相關問題