From 7eef7efe8a18a6a65b9c84db023f0c5a4892d702 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Wed, 22 Jul 2020 12:09:30 -0700 Subject: [PATCH] Game code moved to RedAlertx64.dll, launcher created to launch previous WinMain entry point which has been renamed to CnCMain --- code/CMakeLists.txt | 17 +++++++++++++---- code/launcher/launcher_main.cpp | 18 ++++++++++++++++++ code/redalert/startup.cpp | 2 +- 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 code/launcher/launcher_main.cpp diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index cdc544f..763979c 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -8,6 +8,10 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../) set(CMAKE_VERBOSE_MAKEFILE ON) +set(src_launcher + ./launcher/launcher_main.cpp +) + set(src_io ./redalert/io/userinput.cpp ./redalert/io/userinput.h @@ -732,15 +736,20 @@ if (UNIX) add_definitions(-D RA_AF -DCHEAT_KEYS -DIMGUI_IMPL_OPENGL_LOADER_GLEW -DSCENARIO_EDITOR -DTRUE_FALSE_DEFINED -DENGLISH -D_USRDLL -DREDALERT_EXPORTS) endif(UNIX) -add_executable(RedAlert ${src_io} ${src_win32lib} ${src_redalert} ${src_external} "redalert/light.cpp" "redalert/briefing.cpp") +add_library(RedAlertDLL SHARED ${src_io} ${src_win32lib} ${src_redalert} ${src_external} "redalert/light.cpp" "redalert/briefing.cpp") if (MSVC) -set_target_properties(RedAlert PROPERTIES OUTPUT_NAME "RedAlert" LINK_FLAGS "/PDB:\"RedAlert.pdb\" /SUBSYSTEM:WINDOWS" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/../" ) -target_link_libraries(RedAlert "opengl32.lib" "winmm.lib" "Ws2_32.lib" "${CMAKE_SOURCE_DIR}/external/devil/ilu.lib" "${CMAKE_SOURCE_DIR}/external/devil/DevIL.lib" "${CMAKE_SOURCE_DIR}/external/sdl2/lib/x64/SDL2.lib" "${CMAKE_SOURCE_DIR}/external/openal/out/build/x64-Release/OpenAL32.lib" ${FFmpeg_LIBRARIES}) +set_target_properties(RedAlertDLL PROPERTIES OUTPUT_NAME "RedAlertx64" LINK_FLAGS "/PDB:\"RedAlertx64.pdb\" /SUBSYSTEM:WINDOWS /DEF:${CMAKE_CURRENT_SOURCE_DIR}/exports.def" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/../" ) +target_link_libraries(RedAlertDLL "opengl32.lib" "winmm.lib" "Ws2_32.lib" "${CMAKE_SOURCE_DIR}/external/devil/ilu.lib" "${CMAKE_SOURCE_DIR}/external/devil/DevIL.lib" "${CMAKE_SOURCE_DIR}/external/sdl2/lib/x64/SDL2.lib" "${CMAKE_SOURCE_DIR}/external/openal/out/build/x64-Release/OpenAL32.lib" ${FFmpeg_LIBRARIES}) + +add_executable(Launcher ${src_launcher}) +target_link_libraries(Launcher RedAlertDLL) +set_target_properties(Launcher PROPERTIES OUTPUT_NAME "RedAlert" LINK_FLAGS "/SUBSYSTEM:WINDOWS /PDB:\"RedAlert.pdb\"") + endif(MSVC) if (UNIX) set_target_properties(RedAlert PROPERTIES OUTPUT_NAME "RedAlert" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/.." ) endif(UNIX) -target_include_directories(RedAlert PRIVATE ./external/ffmpeg-win64/include/;./external/xml/;./external/devil/;./external/;./redalert/win32lib;./external/lua/;./external/imgui;./external/dxsdk/Include;./external/ffmpeg-win32/include;./external/sdl2/include;./win32lib;./external/openal/include) \ No newline at end of file +target_include_directories(RedAlertDLL PRIVATE ./external/ffmpeg-win64/include/;./external/xml/;./external/devil/;./external/;./redalert/win32lib;./external/lua/;./external/imgui;./external/dxsdk/Include;./external/ffmpeg-win32/include;./external/sdl2/include;./win32lib;./external/openal/include) \ No newline at end of file diff --git a/code/launcher/launcher_main.cpp b/code/launcher/launcher_main.cpp new file mode 100644 index 0000000..c81413f --- /dev/null +++ b/code/launcher/launcher_main.cpp @@ -0,0 +1,18 @@ +// launcher_main.cpp +// + +#include + +int (*WINAPI CnCMain)(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +{ + HMODULE handle = LoadLibrary("redalertx64.dll"); + if (handle == NULL) + return 0; + + CnCMain = (int(__cdecl *)(HINSTANCE, HINSTANCE, LPSTR, int))GetProcAddress(handle, "CnCMain"); + if (CnCMain == NULL) + return 0; + + return CnCMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); +} \ No newline at end of file diff --git a/code/redalert/startup.cpp b/code/redalert/startup.cpp index 35ec3ae..fb3933c 100644 --- a/code/redalert/startup.cpp +++ b/code/redalert/startup.cpp @@ -174,7 +174,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, unsigned int fdwReason, void *lpvReserve * 03/20/1995 JLB : Created. * *=============================================================================================*/ void Reallocate_Big_Shape_Buffer(void); -int PASCAL WinMain ( HINSTANCE instance , HINSTANCE , char * command_line , int command_show ) +int PASCAL CnCMain( HINSTANCE instance , HINSTANCE , char * command_line , int command_show ) { #ifdef WIN32