使用DllMain函数(MinGW+CMake)创建一个Windows共享库

Create a Windows shared library with DllMain function (MinGW + CMake)

本文关键字:一个 Windows 共享 创建 DllMain 函数 MinGW+CMake 使用      更新时间:2023-10-16

如果已经有人问我这个问题,我很抱歉,但我已经努力寻找答案好几个星期了。

在共享库方面,我不是特别胜任,但是,使用CLion RC 1.0(及其集成的CMake)和MinGW,我无法创建具有DllMain功能的功能性Windows DLL。我确实创建了一个.dll文件,但很快就发现该符号没有正确导出。

简单地说,我希望看到与Visual Studio的默认Win32 DLL模板相同或相似的行为。

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(DllMainTest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_library(DllMainTest SHARED ${SOURCE_FILES})

main.cpp

#include <windows.h>
extern "C" BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpvReserved
) {
switch(fdwReason) {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL, "It works!", "Status", MB_OK);
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    default:
        break;
    }
return TRUE;
}

编辑:这个DLL的目的是将它注入32位进程,并在加载时显示MessageBox。

查看add_library文档:http://www.cmake.org/cmake/help/v3.0/command/add_library.html

"STATIC库是链接其他目标时使用的对象文件档案。SHARED库是动态链接的,并在运行时加载。MODULE库是不链接到其他目标的插件,但可以使用类似dlopen的功能在运行时动态加载。"

add_library(DllMainTest MODULE ${SOURCE_FILES})

应按预期导出DllMain。

相关文章: