【问题标题】:LoadLibrary() file pathLoadLibrary() 文件路径
【发布时间】:2016-07-13 17:32:43
【问题描述】:

我正在尝试使用函数 LoadLibrary(...) 将字符串接收到文件名(.dll 或 .exe)或文件路径。我遇到的问题是文件名本身有多个句点/点。

例子:

HINSTANCE hInst = LoadLibrary(_T("..\\folder\\file.name.dots.exe"));

句柄始终为空,在这种情况下我不能简单地更改文件名。微软在https://support.microsoft.com/en-ca/kb/324468 中提到了多个句点,但我认为它不适用于文件名。有什么想法吗?

【问题讨论】:

  • 这是一个相对路径。那么...相对于什么?
  • 这是我正在工作的项目的相对路径。我已经测试了这个相对路径来处理没有任何多个句点的文件名
  • 顺便说一句...从不像这样发布代码。始终计算完全限定的路径并将其传递给 LoadLibrary()。原因:安全漏洞。
  • 另外,请查看LoadLibraryEx 了解更多信息。如果您注意到文章的长度和它所采用的选项数量,您可以感受到开发人员使用 LoadLibrary 拍摄自己的方式的数量。 .
  • 感谢大家的回复,完整路径确实有效!我可能没有正确写出相对路径。

标签: c++ handle loadlibrary


【解决方案1】:

按照参考文章中的建议,始终计算完全限定路径并将其传递给LoadLibrary/LoadLibraryEx()。这不仅可以解决点缺陷,还可以防止安全漏洞。劫持您的应用程序的当前目录可能会导致您的应用程序运行任意代码。

请参阅MSDN on LoadLibraryEx,以更好地了解使用 LoadLibrary 的复杂性。

【讨论】:

  • 再次感谢大卫。不幸的是,我认为我必须想出一种不同的方法来解决 LoadLibrary 帮助解决的另一个问题(另一个故事再讲),因为这是一个需要相对路径的共享项目。但这回答了我的问题!
  • GetFullPathName() 可能会解决您的问题。小心行事。保护您的客户。
【解决方案2】:

在我看来,绅士的问题源于 BASENAME 中的多个点,如:

    c:\users\joe\elephant.doc.old

当然,伴随的“损坏的文件名”约定将其映射为以下内容:

    c:\users\joe\elepha~2.old

如果你使用损坏的文件名——在 DOS 窗口中可以看到——你应该没有问题,我的年轻朋友。

【讨论】:

  • 那是我的问题,是的。正如大卫所提到的,一个完全合格的路径将解决这个问题。感谢您对损坏的文件名的建议! (也是*绅士哈哈不是男人)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2012-12-14
  • 2016-03-19
相关资源
最近更新 更多