vs2019卸载dll导致被加载程序崩溃

下面是.dll里面的内容
DWORD WINAPI ShowMainDlg(LPVOID pParam)
{
    ::MessageBoxA(NULL,"模块加载成功","11",0);
    AssisMainDlg dlg;
    dlg.DoModal();
    return 0;
}

BOOL CAssistModelApp::InitInstance()
{
    CWinApp::InitInstance();
    ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ShowMainDlg, NULL, NULL,NULL);
    return TRUE;
}

int CAssistModelApp::ExitInstance()
{
    ::MessageBox(NULL, TEXT("模块卸载成功"), TEXT("22"), 0);
    return CWinApp::ExitInstance();
}

下面是加载程序,bo为false时,如果.dll里面没有AssisMainDlg dlg; dlg.DoModal();可以正常卸载dll,如果加上了这个界面,卸载时显示卸载成功,但是会导致被加载程序崩溃

void CInjectTestDlg::InjectAssist(DWORD pid,CString dllPath,bool bo)
{
    HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    LPVOID lpBaseAddress = VirtualAllocEx(hprocess, NULL, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hprocess, lpBaseAddress, dllPath, strlen(dllPath) + 1, NULL);
    HMODULE hmodue = GetModuleHandle("Kernel32.dll");
    if (bo)
    {
        LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodue, "LoadLibraryA");
        HANDLE hThread = CreateRemoteThread(hprocess, NULL, 0, lpStartAddress, lpBaseAddress, NULL, 0);
        WaitForSingleObject(hprocess, 2000);
        CloseHandle(hprocess);
        CloseHandle(hThread);
    }
    else
    {
        LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodue, "GetModuleHandleA");
        HANDLE hThread = CreateRemoteThread(hprocess, NULL, 0, lpStartAddress, lpBaseAddress, NULL, 0);
        WaitForSingleObject(hThread, INFINITE);
        DWORD dwRet = 0;
        GetExitCodeThread(hThread, &dwRet);
        //CloseHandle(hprocess);
        //CloseHandle(hThread);
        lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodue, "FreeLibraryAndExitThread");
        hThread = CreateRemoteThread(hprocess, NULL, 0, lpStartAddress, (LPVOID)dwRet, NULL, 0);
        WaitForSingleObject(hprocess, 2000);
        CloseHandle(hprocess);
        CloseHandle(hThread);
    }
}

据我所知,程序的运行本就以来dll,现在你把dll卸载了,崩溃应该是自然而然的事吧?

我猜测,应该是你的dll里面有某些方法,或者是变量是主程序所依赖的,卸载后主程序没有找到相应函数或者变量,导致崩溃。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632