C++ 加载链接到使用空DllMain的DLL时,应用程序无法启动(0xC0000142)
我有一个简单的Visual Studio 2017解决方案,它由两个项目组成。第一个项目是链接(加载时链接)到第二个项目生成的DLL的可执行文件。第二个项目是一个简单的测试DLL,它导出一个函数,并包含一个空的DllMain入口点 如果我尝试调试解决方案,则会出现一个错误,显示“应用程序无法正确启动(0xc0000142)。单击“确定”关闭应用程序。”我尝试搜索0xc0000142的含义,但从开发角度看,找不到任何有用的内容 如果我从DLL中删除DllMain入口点并重建,一切都会正常工作 以下是DLL头(MyMath.h): 以下是DLL代码文件(MyMath.cpp):C++ 加载链接到使用空DllMain的DLL时,应用程序无法启动(0xC0000142),c++,dll,visual-studio-2017,C++,Dll,Visual Studio 2017,我有一个简单的Visual Studio 2017解决方案,它由两个项目组成。第一个项目是链接(加载时链接)到第二个项目生成的DLL的可执行文件。第二个项目是一个简单的测试DLL,它导出一个函数,并包含一个空的DllMain入口点 如果我尝试调试解决方案,则会出现一个错误,显示“应用程序无法正确启动(0xc0000142)。单击“确定”关闭应用程序。”我尝试搜索0xc0000142的含义,但从开发角度看,找不到任何有用的内容 如果我从DLL中删除DllMain入口点并重建,一切都会正常工作 以下
#包括“MyMath.h”
#包括
#包括
外部“C”BOOL WINAPI DllMain(HINSTANCE HINSTANCE、DWORD FDFREASON、LPVOID lpvReserved)
{
}
整数地址编号(整数a、整数b)
{
返回a+b;
}
下面是第一个使用DLL(Source.cpp)的项目的主代码文件:
#包括
#包括“MyMath.h”
使用名称空间std;
int main()
{
int x=3;
int y=4;
coutDllMain没有返回TRUE
。返回FALSE
或0会导致应用程序失败,错误代码为0xc0000142。DllMain没有返回TRUE
。返回FALSE
或0会导致应用程序失败,错误代码为0xc0000142。为什么它是空的?它需要返回一些东西。未定义未定义的行为。您的DllMain
函数应该返回一个值。要么返回一个值,要么不编写DllMain
函数,并让该函数的默认Windows版本被调用。@PaulMcKenzie我输入了一个返回值,但问题仍然存在。@tkausl我原来在其中有一些返回值为的代码0,因为BOOL只是一个int,我错误地认为0意味着成功。我删除了函数内容以尝试解决问题,但忘记添加返回值(但奇怪的是,它仍然编译)。原来有一个我不知道的TRUE宏定义,它解析为1。@user2498421--。不要猜测或假设Windows API函数应该返回什么,请始终阅读文档。为什么它是空的?它需要返回一些东西。未定义的行为。DllMain
函数应该返回一个v值。要么这样,要么不写一个DllMain
函数,让该函数的默认Windows版本被调用。@PaulMcKenzie我输入了一个返回值,但问题仍然存在。@tkausl我本来有一些返回值为0的代码,因为BOOL只是一个int,我错误地假设0表示nt成功。我删除了函数内容以尝试进行故障排除,但忘了添加返回值(奇怪的是,它仍然编译)。原来有一个我不知道的TRUE宏定义,解析为1。@user2498421--。不要猜测或假设Windows API函数应该返回什么,请始终阅读文档。我也有同样的问题,非常大的项目由于“0xc0000142”而无法启动错误。我给每个DllMain设置了一个断点,发现其中一个DllMain中的一个函数失败。这就是整个项目未能启动的原因。我也有同样的问题,非常大的项目由于“0xc0000142”而无法启动错误。我给每个DllMain设置了一个断点,发现其中一个DllMain的一个函数失败了。这就是整个项目未能启动的原因。
#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
#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;
}
#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;
}