gpt4 book ai didi

c++ - DLL中的CreateThread提前终止

转载 作者:行者123 更新时间:2023-12-03 07:05:22 25 4
gpt4 key购买 nike

我正在尝试从控制台应用程序加载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应该通过POP来实现它的MessageBox,但只是在屏幕上闪烁而不是等待用户输入。 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;
}
我的问题是..如何使线程函数中的代码完全执行而不会过早终止或引起痛苦的死锁?很抱歉,我的英语不完善和经验不足。

最佳答案

原因是您在DllMain中执行了某些不安全的操作:正在调用CreateThread
您在DllMain中为响应流程附加而可以执行的操作非常有限,事实上documentation会指出:

There are significant limits on what you can safely do in a DLL entry point. See General Best Practices for specific Windows APIs that are unsafe to call in DllMain. If you need anything but the simplest initialization then do that in an initialization function for the DLL. You can require applications to call the initialization function after DllMain has run and before they call any other functions in the DLL.


该警告将您链接到“一般最佳实践”,其中包括“[c]全部CreateThread。如果您不与其他线程同步,则创建线程可以工作,但是这样做是有风险的。”
即使没有与其他线程同步的风险,该代码也可以通过其他方式发挥作用:例如,您的 main只是调用 FreeLibrary并退出。您在DLL中产生的线程(实际上可能是执行中的线程)将具有应该未映射运行的代码。您实际上是从地毯下面拉出地毯!

关于c++ - DLL中的CreateThread提前终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64604181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com