FreeLibrary失败

问题描述 投票:1回答:1

我第一次尝试编写DLL,并且有一个我正在尝试的项目。我编写我的DLL(这是我能想到的最简单的DLL),然后对其进行编译。我转到我的可执行文件,调用LoadLibrary,它会很好地加载它,并且能够像通常一样从DLL调用函数。但是,FreeLibrary每一次返回1。我尚未能够成功卸载DLL(我正在玩热重装DLL,这是我为实践而黑手的解决方案)。

这是我的代码:

可执行文件的program.cpp:

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

typedef void (*_TestFunction)();

int main()
{
    HMODULE hinstDLL = LoadLibrary(L"Test.dll");

    _TestFunction TestFunction = (_TestFunction)GetProcAddress(hinstDLL, "TestFunction");

    TestFunction();

    BOOL result = FreeLibrary(hinstDLL);
    std::cout << result << std::endl;

    if (hinstDLL != NULL)
    {
        std::cout << "Still loaded" << std::endl;
    }

    std::cin.ignore();
    return 0;
}

我的DLL的dllmain.cpp:

#include "pch.h"

#define DLL_EXPORT

#include "dllmain.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        std::cout << "DLL Load Process" << std::endl;
        break;
    case DLL_THREAD_ATTACH:
        std::cout << "DLL Load Threaded Process" << std::endl;
        break;
    case DLL_THREAD_DETACH:
        std::cout << "DLL Unload Threaded Process" << std::endl;
        break;
    case DLL_PROCESS_DETACH:
        std::cout << "DLL Unload Process" << std::endl;
        break;
    }
    return TRUE;
}

DLL_FUNCTION void TestFunction()
{
    std::cout << "Hello World" << std::endl;
}

dllmain.h:

#pragma once

#ifdef DLL_EXPORT
#define DLL_FUNCTION extern "C" __declspec(dllexport)
#else
#define DLL_FUNCTION extern "C" __declspec(dllimport)
#endif

我的预编译头仅包含iostream,用于DLL记录信息以及TestFunction()

我不知道为什么它不起作用,并且我已经在这个问题上待了整整一整天。任何帮助表示赞赏。

c++ dll
1个回答
0
投票

根据Microsoft Documentation,如果成功,FreeLibrary将返回非零值。我刚刚在有史以来最简单的示例中对其进行了验证:

#include <iostream>
#include <Windows.h>

int main()
{
    const HMODULE handle = LoadLibraryW(L"kernel32.dll");

    std::cout << FreeLibrary(handle);

    return 0;
}

按预期打印1

如果在调用FreeLibrary时用DLL_PROCESS_DETACH调用DllMain,则一切正常,并且您的DLL已从内存中完全卸载。

© www.soinside.com 2019 - 2024. All rights reserved.