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

C++ 加载链接到使用空DllMain的DLL时,应用程序无法启动(0xC0000142),c++,dll,visual-studio-2017,C++,Dll,Visual Studio 2017,我有一个简单的Visual Studio 2017解决方案,它由两个项目组成。第一个项目是链接(加载时链接)到第二个项目生成的DLL的可执行文件。第二个项目是一个简单的测试DLL,它导出一个函数,并包含一个空的DllMain入口点 如果我尝试调试解决方案,则会出现一个错误,显示“应用程序无法正确启动(0xc0000142)。单击“确定”关闭应用程序。”我尝试搜索0xc0000142的含义,但从开发角度看,找不到任何有用的内容 如果我从DLL中删除DllMain入口点并重建,一切都会正常工作 以下

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

如果我尝试调试解决方案,则会出现一个错误,显示“应用程序无法正确启动(0xc0000142)。单击“确定”关闭应用程序。”我尝试搜索0xc0000142的含义,但从开发角度看,找不到任何有用的内容

如果我从DLL中删除DllMain入口点并重建,一切都会正常工作

以下是DLL头(MyMath.h):

以下是DLL代码文件(MyMath.cpp):

#包括“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;
}