加载链接到使用空 DllMain 的 DLL 时,应用程序无法启动 (0xC0000142)

Posted

技术标签:

【中文标题】加载链接到使用空 DllMain 的 DLL 时,应用程序无法启动 (0xC0000142)【英文标题】:Application fails to start (0xC0000142) when load-linking to DLL that uses empty DllMain 【发布时间】:2017-12-21 03:40:16 【问题描述】:

我有一个包含两个项目的简单 Visual Studio 2017 解决方案。第一个项目是链接(加载时链接)到从第二个项目生成的 DLL 的可执行文件。第二个项目是一个简单的测试 DLL,它导出一个函数,并包含一个空的 DllMain 入口点。

如果我尝试调试解决方案,我会收到一条错误消息,提示“应用程序无法正确启动 (0xc0000142)。单击确定关闭应用程序。”我尝试搜索 0xc0000142 的含义,但从开发的角度来看,找不到任何有用的东西。

如果我从 DLL 中删除 DllMain 入口点并重新构建,一切正常。

这是 DLL 头文件 (MyMath.h):

#pragma once

#ifdef THE_DLL_EXPORT
  #define API __declspec(dllexport)
#else
  #define API __declspec(dllimport)
#endif

#ifdef __cplusplus
  extern "C" 
#endif

API int AddNumbers(int a, int b);

#ifdef __cplusplus
  
#endif

这里是 DLL 代码文件(MyMath.cpp):

#include "MyMath.h"
#include <stdio.h>
#include <Windows.h>

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved)



int AddNumbers(int a, int b)

    return a + b;

这是第一个使用 DLL (Source.cpp) 的项目的主要代码文件:

#include <iostream>
#include "MyMath.h"
using namespace std;

int main()

    int x = 3;
    int y = 4;
    cout << x << " + " << y << " = " << AddNumbers(x, y) << endl;
    cin.get();
    return 0;

这里发生了什么?

【问题讨论】:

为什么它是空的?它需要返回一些东西。 未定义的行为。您的 DllMain 函数应该返回一个值。要么不写 DllMain 函数,要么调用该函数的默认 Windows 版本。 @PaulMcKenzie 我输入了一个返回值,但问题仍然存在。 @tkausl 我最初在那里有一些返回值为 0 的代码,因为 BOOL 只是一个 int 并且我错误地假设 0 意味着成功。我删除了函数内容以尝试排除故障,但忘记添加返回值(但奇怪的是它仍然编译)。原来有一个我不知道的 TRUE 宏定义,它解析为 1。 @user2498421 -- The documentation specifies what the return values denote。不要猜测或假设 Windows API 函数应该返回什么,请务必阅读文档。 【参考方案1】:

DllMain 没有返回 TRUE。返回 FALSE 或 0 会导致应用程序失败,错误代码为 0xc0000142。

【讨论】:

我有同样的问题,非常大的项目由于“0xc0000142”错误而无法启动。我为每个 DllMain 设置了一个断点,发现其中一个 DllMain 中的一个函数失败了。这就是整个项目未能启动的原因。

以上是关于加载链接到使用空 DllMain 的 DLL 时,应用程序无法启动 (0xC0000142)的主要内容,如果未能解决你的问题,请参考以下文章

Dllmain的作用

在不执行 dllmain 函数的情况下加载 Dll

逆向学习-DLL注入

从DllMain调用LoadLibrary

MFC 罐头 DllMain 不为 DLL_PROCESSS_DETACH 调用 ExitInstance?

常见的注入方法