你能动态地从DLL调用一个对象吗?

时间:2013-06-24 00:29:47

标签: c++ winapi 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 个答案:

答案 0 :(得分: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 :(得分:2)

您无法从.dll获取类的地址。如果要使用.dll中的类实例,请使用dllexport / dllimport,它允许您导出类并将其用作本地声明的类。

Microsoft的参考: http://msdn.microsoft.com/en-us/library/81h27t8c(v=vs.80).aspx

答案 2 :(得分: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显式调用类/对象,但您可以调用其方法。