在 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
,然后使用GetProcAddress
以GetFlubber
作为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