在 C++ 上使用带有 LoadLibrary() 方法的库 dll

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

    您有一个名为 flubber.dll 的动态库 库导出函数bool GetFlubber(Flubber* flubber)。 函数和类型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 中的导出函数后面可能会更安全、更清晰。

【讨论】:

以上是关于在 C++ 上使用带有 LoadLibrary() 方法的库 dll的主要内容,如果未能解决你的问题,请参考以下文章

使用 loadLibrary() 在 java 中调用 c++ dll

C++ - LoadLibrary() 实际上链接到库吗?

C++ LoadLibrary 返回 Null

应用加载失败(loadlibrary失败 ,)应该怎么解决

调试通过 LoadLibrary() 加载到 Excel 中的 C++ DLL

使用 LoadLibrary 后未调用 DllMain