加载链接到使用空 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)的主要内容,如果未能解决你的问题,请参考以下文章