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

时间:2015-04-07 11:27:34

标签: c++ windows dll cmake mingw

如果已经提出这个问题,我道歉,但我已经试图找到答案已经好几周了。

对于共享库,我不是特别称职,但使用CLion RC 1.0(及其集成的CMake)与MinGW,我无法创建功能性的Windows DLL具有DllMain功能。我确实设法创建了一个.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。

1 个答案:

答案 0 :(得分:1)

查看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。