【问题标题】:Can you dynamically call an object from a DLL?您可以从 DLL 动态调用对象吗?
【发布时间】:2013-06-24 00:29:47
【问题描述】:

假设我有一个包含以下内容的 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 中创建的类的地址?

【问题讨论】:

    标签: c++ winapi dll


    【解决方案1】:

    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 传递给常用的链接器命令行

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我试图创建一个显式链接的示例这是我最终想出的示例,对于之前没有特别提及这一点,我深表歉意。

        我们开始吧:

        //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 显式调用类/对象,但您可以调用其方法。

        【讨论】:

        • 什么是“_ZN7MathDLL5MathX3ADDEdd”?
        猜你喜欢
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 2022-01-27
        • 1970-01-01
        • 2017-09-19
        相关资源
        最近更新 更多