c++ - 免费图书馆失败

标签 c++ dll

我一直在尝试第一次编写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()

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

最佳答案

根据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已从内存中完全卸载。

关于c++ - 免费图书馆失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61717949/

相关文章:

c++ - 自定义 C 类型字符串类的问题

c++ - 包装 C++ 模板,以便它们可以在 C#、Java 等中使用

c++ - 链接c++动态库一直失败

dll - 为什么我们必须将全局钩子(Hook)过程放在单独的 DLL 中

c++ - 为什么 co_await 不能返回字符串?

c++ - 如何在 Linux 机器上链接一个静态库文件

dll - 未解析的 WixUI 引用 :WixUI_InstallDir

c++ - 对包含在 DLL 中的说明

c++ - C++ 中整数的稳健解析

c++ - 帮助声明 C++ 结构,并将 float 组作为其成员之一