【问题标题】:How to initialize msvcrt.dll?如何初始化 msvcrt.dll?
【发布时间】:2010-12-14 17:29:33
【问题描述】:

如果我执行 LoadLibrary("msvcrt.dll") 是否需要以某种方式初始化 CRT?以下文档中的第 2 节似乎说我这样做了,但是当我尝试调用 _CRT_INIT 时,我得到了 _CRT_INIT 的未定义符号错误:

http://support.microsoft.com/kb/94248

编辑:我应该说这是一个动态加载它使用的所有 dll 的程序,因此调用 LoadLibrary("msvcrt.dll")。

【问题讨论】:

  • 你为什么要这样做?如果您链接到它,它将自动加载。
  • 无论您如何编辑,为什么要显式加载 MSVCRT.DLL 而不是简单地链接导出库?您的应用是否仅有时需要标准库?
  • LoadLibrary 将为您调用 dll 的入口点 (DllMain(...))。所以你不需要进一步初始化它们(它是自动完成的)
  • @Clifford:是的!我们想加载它、使用它、卸载它。
  • @Edwin:如果静态加载msvcrt.dll,调用顺序是DllMainCRTStartup->_CRT_INT->DllMain。如果您动态加载它(使用 LoadLibrary),则不会调用 DllMainCRTStartup(特定于 CRT)。 _CRT_INT 也不是。

标签: c++ winapi msvcrt


【解决方案1】:

在里面拨打DllMain()。如果它依赖于 C 运行时,它将调用 CRT_INIT。

但一个更好的问题是,如果程序在 msvcrt 中使用了某些东西,则无需显式加载 dll 并对其进行初始化,那么为什么要这样做呢?

【讨论】:

  • 如果 msvcrt.dll 是静态加载的,则 DllMain 由 DllMainCRTStartup 调用。 DllMainCRTStartup 也调用_CRT_INIT。问题是,因为 msvcrt.dll 正在动态加载 DllMainCRTStartup 不存在...
【解决方案2】:

如果您使用 C++,您是否将 _CRT_INIT 声明为 extern "C"

您是否尝试过使用 DUMPBIN 实用程序(http://support.microsoft.com/kb/177429 - 如果您自己没有 PATH,我认为您必须使用 Visual Studio 命令提示符)和 /EXPORTS 开关看看 CRT DLL 中哪些函数可用,只是为了仔细检查?

如果您遇到困难,VS2005 和更早版本(可能是之后...)会提供运行时库的源代码。对于 VS2005,它位于 VC/crt/src 中,相对于 VS 安装文件夹。看起来_CRT_INIT 是正确的名称——参见crtdll.cdllcrt0.c,它是一个C 函数。

【讨论】:

  • 顺便说一句,冒着非常烦人的风险或提供我无法判断的信息是不合适的,我总是与运行时静态链接。不会删除对 DLL 的所有依赖项,但会删除所有可能导致问题的依赖项。 (我必须承认,您的问题是 CRT DLL 尚未给我带来困扰的问题。)
  • 万岁! extern "C" 解决了它。现在,当我们通过 exe 中的 LoadLibrary 调用单步执行 DLL 代码的开头,并且我们的 DLL 调用 _CRT_INT,该调用(对 _CRT_INT)进入“VC\crt\src\crtdll.c”中的 _CRT_INIT,您还提到了!
【解决方案3】:

你不能调用 _CRT_INIT() 而是调用 CRT_INIT()(如果你真的必须的话)

【讨论】:

  • 也许你需要参数 CRT_INIT(hinstDLL, fdwReason, lpReserved);
  • 问题不在于args,因为我已经使用了_CRT_INIT(hinstDLL, fdwReason, lpReserved),问题是链接器找不到_CRT_INIT(或CRT_INIT),也不存在于msvcrt.dll 供我通过 GetProcAddress 调用。
【解决方案4】:

您引用的链接指的是仅在“在构建 DLL 时使用 CRT 库”时才使用 CRT_INIT(),即便如此,它也只是两种选择之一;在大多数情况下,第一个可能更可取。

【讨论】:

  • 如果你在链接页面中搜索“如果你有你自己的DLL入口点”,那就是我们需要插入的代码我们的特殊情况(2a 到 2d)。当我们按照他们所说的 2a 到 2d 下进行操作时,找不到 _CRT_INIT。
猜你喜欢
  • 2019-05-17
  • 2017-11-02
  • 1970-01-01
  • 2014-01-22
  • 2012-12-18
  • 2018-11-15
  • 2015-05-14
  • 2019-12-12
  • 1970-01-01
相关资源
最近更新 更多