2

Say I have a DLL right that contains this:

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

How Do I call it call the GetProc Address? I.e:

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

How in the world would you get the address of a class created in a dll using GetProcAddress?

4

3 回答 3

3

edtheprogrammerguy是正确的。

以下是有关如何正确公开课程的更多信息:

您需要前缀属性:

__declspec(dllexport)...

您要公开的所有功能。

看到这个

C 函数的示例:

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

这可以使用以下方法进行简化MACROS:所有内容都在这个有用的页面上进行了解释。


对于 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给通常的链接器命令行
于 2013-06-24T01:20:12.577 回答
2

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

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

于 2013-06-24T00:39:10.070 回答
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 显式调用类/对象,但您可以调用其方法。

于 2013-06-24T02:24:18.560 回答