MFC:如何获取 DLL 文件名?

Posted

技术标签:

【中文标题】MFC:如何获取 DLL 文件名?【英文标题】:MFC: How to get DLL file name? 【发布时间】:2011-11-15 17:58:24 【问题描述】:

我有一个由第 3 方应用程序加载的 MFC DLL。如何从 DLL 的代码中获取 DLL 文件名?也就是说,例如,如果 DLL 的名称是 mycode.dll,我希望在代码中能够检索字符串“mycode.dll”。

我应该补充一点,如果 DLL 文件名在磁盘上发生更改,那么我想在磁盘上获取当前名称(我不是指在运行时更改,而是在主程序调用之间更改)。

我的 DLL 是作为 CWinApp 类实现的,我的代码没有明确的 DllMain。

【问题讨论】:

How to get the filename of a DLL?的可能重复 这并不是真正的重复,因为 OP 已经明确表示他没有DllMain 另外,它不是完全重复的,因为这是在 MFC 的上下文中,它具有不同的数据和可用功能。 【参考方案1】:

您可以调用 AfxGetStaticModuleState 来获取指向 AFX_MODULE_STATE 结构的指针,该结构有一个成员 m_lpszCurrentAppName 包含模块名称(应用程序或 DLL 取决于它的调用位置)。

【讨论】:

我会试试这个,还有这个link 说:AfxGetAppName() 函数返回 AfxGetModuleState()->m_lpszCurrentAppName。 @User,AfxGetModuleStateAfxGetStaticModuleState 是有区别的。 实际上,我刚刚尝试了 AfxGetAppName(),它确实给了我 DLL 名称减去 dll 扩展名(这很好)。我重命名了 DLL 并重新运行它,它给了我新名称,所以这似乎是最好的方法,除非你知道不使用它的原因。 @User,调用的应用程序也是 MFC 吗?除非您调用 AFX_MANAGE_STATE,否则 AfxGetModuleState 将返回应用程序的参数,而不是 DLL 的。如果从 DLL 中调用,AfxGetStaticModuleState 将始终返回 DLL 的参数。 我不确定调用应用程序是否是 MFC,因为它是第 3 方应用程序。我本来是这样想的,但我不知道。无论如何,它在做正确的事。它绝对不会返回第 3 方 exe 的名称。【参考方案2】:

请参阅获取GetModuleFileName 函数。

当你为第一个参数传入 NULL 时,它只会使用当前进程的句柄。

【讨论】:

我对该函数的文档的阅读是,它将返回加载 dll 的 exe 的名称,而不是 dll 的名称,不是吗? 它说:“检索包含指定模块的文件的完全限定路径。...”所以我认为它用于模块。我们过去在工作中使用过它,效果很好。 它还有关于一些全局指针(在 tchar.h 中定义)的文档,可以帮助您获取当前进程的可执行文件的完整路径。【参考方案3】:

GetModuleFileName 函数肯定会返回加载 DLL 的 EXE...而不是 DLL 本身。我会在上面发表评论,但我还没有足够的分数,嗯。

【讨论】:

以上是关于MFC:如何获取 DLL 文件名?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .NET 可执行文件中获取输出并传送到 MFC 应用程序?

如何本地化 win32(非 MFC)DLL

Visual Studio 2019报错:缺少mfc120.dll

MFC如何调用DLL(VC++)

如何获取 DLL 的文件名?

C ++如何从DLL(Windows)的文件名中获取进程ID?