C++ DLL中的CreateThread过早终止

C++ DLL中的CreateThread过早终止,c++,dll-injection,createthread,C++,Dll Injection,Createthread,我正在尝试从控制台应用程序加载DLL。简单控制台应用程序如下所示: #include <iostream> #include <windows.h> int main(){ HMODULE handleDll = LoadLibraryA("C:\\Tools\\TestDLL.dll"); if (handleDll) { std::cout << "DLL Loaded at Addr

我正在尝试从控制台应用程序加载DLL。简单控制台应用程序如下所示:

#include <iostream>
#include <windows.h>

int main(){
    HMODULE handleDll = LoadLibraryA("C:\\Tools\\TestDLL.dll");
    if (handleDll)
    {
        std::cout << "DLL Loaded at Address: " << handleDll << std::endl;
    }

    FreeLibrary(handleDll);
}
DLL应该弹出一个消息框,它只是在屏幕上闪烁,而不是等待用户输入。DLL代码如下所示:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <Windows.h>

DWORD WINAPI ThreadProc( __in  LPVOID lpParameter )
{
    MessageBox(NULL, L"Hi From The Thread!", L"Pop a Box!", MB_OK);
    return 0;
}

extern "C" __declspec(dllexport) 
VOID PopMessageBox()
{
    DWORD ThreadID;
    HANDLE handleThread; 

    handleThread = CreateThread(NULL, 0, ThreadProc, 0, 0, &ThreadID);
    CloseHandle(handleThread);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        PopMessageBox();
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

我的问题是..如何使线程函数中的代码完全执行,而不会过早终止或造成痛苦的死锁?我为我的英语不好和缺乏经验而道歉。

原因是你在做一些不安全的事情。主要原因:你在呼叫CreateThread

您在DllMain中响应流程附加时所能做的事情非常有限,事实上:

在DLL入口点中可以安全执行的操作有很大的限制。请参阅一般最佳实践,了解在DllMain中调用不安全的特定Windows API。如果您不需要最简单的初始化,请在DLL的初始化函数中执行此操作。您可以要求应用程序在DllMain运行后调用初始化函数,然后再调用DLL中的任何其他函数

警告将您链接到一般最佳实践,其中包括[c]所有CreateThread。如果不与其他线程同步,则创建线程可以正常工作,但这是有风险的


即使没有与其他线程同步相关的风险,此代码在其他方面也是脆弱的:例如,您的main只需调用FreeLibrary并退出。您在DLL中生成的线程(实际上可能是在执行过程中生成的)将具有它应该运行的未映射代码。你简直是在把地毯从下面拉出来

原因是您在DllMain中做了一些不安全的事情:您正在调用CreateThread

您在DllMain中响应流程附加时所能做的事情非常有限,事实上:

在DLL入口点中可以安全执行的操作有很大的限制。请参阅一般最佳实践,了解在DllMain中调用不安全的特定Windows API。如果您不需要最简单的初始化,请在DLL的初始化函数中执行此操作。您可以要求应用程序在DllMain运行后调用初始化函数,然后再调用DLL中的任何其他函数

警告将您链接到一般最佳实践,其中包括[c]所有CreateThread。如果不与其他线程同步,则创建线程可以正常工作,但这是有风险的


即使没有与其他线程同步相关的风险,此代码在其他方面也是脆弱的:例如,您的main只需调用FreeLibrary并退出。您在DLL中生成的线程(实际上可能是在执行过程中生成的)将具有它应该运行的未映射代码。你简直是在把地毯从下面拉出来

您不应该在DllMain中调用CreateThread:您有关于如何正确执行我尝试的操作的示例代码?这里有两个线程并行工作:主线程和使用CreateThread创建的线程。当主线程退出时,应用程序停止。此事件还终止辅助线程。正如其他答案所述,这里的主要问题是您在DLLMain中的操作非常有限。@valkyrie:您的目标是从DLL中启动线程吗?或者弹出一个消息框?我的目标是摆脱在DllMain中约束我的一切。如果我能做到这一点,我可以在弹出msgbox的基础上做一些有价值的事情。你不应该在DllMain中调用CreateThread:你有关于如何正确执行我尝试的操作的示例代码?这里有两个线程并行工作:主线程和用CreateThread创建的线程。当主线程退出时,应用程序停止。此事件还终止辅助线程。正如其他答案所述,这里的主要问题是您在DLLMain中的操作非常有限。@valkyrie:您的目标是从DLL中启动线程吗?或者弹出一个消息框?我的目标是摆脱在DllMain中约束我的一切。如果我能做到这一点,我可以在弹出msgbox的基础上做一些有价值的事情。