【问题标题】:to use a library dll with LoadLibrary() method on C++在 C++ 上使用带有 LoadLibrary() 方法的库 dll
【发布时间】:2008-12-03 09:54:11
【问题描述】:

我可以使用 LoadLibrary 方法来导入 struct 类型的数据吗? 请原谅我的英语。 谢谢。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    让我假设问题中遗漏了一些事情:

    1. 您有一个名为 flubber.dll 的动态库
    2. 库导出函数bool GetFlubber(Flubber* flubber)
    3. 函数和类型Flubber(恰好是struct!)在名为flubber.h的头文件中声明。

    如果满足这三个条件,那么您可以在 flubber.dll 上使用LoadLibrary,然后使用GetProcAddressGetFlubber 作为proc 名称,最后您可以声明一个@987654327 @instance 本地并通过检索到的 proc 地址将其传递给 GetFlubber

    【讨论】:

      【解决方案2】:

      您的意思是将数据放入 dll 中,然后使用 LoadLibrary 和 Getprocaddres 获取指向数据的指针吗?这是可能的,尽管将函数放在 dll 中并让它们返回指向数据的指针更为常见。

      【讨论】:

        【解决方案3】:

        嗯……这个问题有点难以理解,恐怕。

        在 C++ 中,结构声明就是一个声明。它不会生成你可以在运行时加载的东西,它是一个纯粹的编译时构造,它只是告诉编译器某些东西在内存中的布局、涉及的字段、它们的类型和顺序等等。

        【讨论】:

          【解决方案4】:

          我假设您使用的是 VC++ 2005。

          MS 现在为您提供Delay Loading Dll's

          Visual C++ 链接器现在支持延迟加载 DLL。这免除了您使用 Windows SDK 函数 LoadLibrary 和 GetProcAddress 来实现 DLL 延迟加载的需要。

          设置延迟负载的步骤。

          转到项目->属性->链接器->输入,然后在“延迟加载的 DLL”中指定您的 Dll

          【讨论】:

          • 如果他想根据版本和可用性动态加载库,那么仍然必须使用 LoadLibrary。
          【解决方案5】:

          正如其他回复所暗示的那样,很难说出这里问的是什么,但我会回答这个问题的另一种解释。我不确定它是否“官方支持”,但您可以让 DLL 导出全局变量,然后通过 GetProcAddress 动态访问它。

          例如,如果名为 foo.dll 的库包含名为 g_MyGlobal 的 FOO 类型的全局变量,则它可以导出 foo.def 中的变量。然后客户端代码可以调用:

          MyPointer = GetProcAddress(..., "g_MyGlobal");
          

          并获得一个指向全局的“FOO *”指针。

          ...但是话虽如此,如果您发现自己需要这样做不是出于私人测试目的,您可能需要重新考虑您的设计。将这个全局隐藏在 DLL 中的导出函数后面可能会更安全、更清晰。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多