diff --git a/example/DllLoader/DllLoader.cpp b/example/DllLoader/DllLoader.cpp index 4355ea8..abaaaac 100644 --- a/example/DllLoader/DllLoader.cpp +++ b/example/DllLoader/DllLoader.cpp @@ -12,12 +12,18 @@ #include "../../MemoryModule.h" typedef int (*addNumberProc)(int, int); +#ifdef _WIN64 +typedef void (*throwExceptionProc)(void); +#endif #define DLL_FILE TEXT("..\\SampleDLL\\SampleDLL.dll") void LoadFromFile(void) { addNumberProc addNumber; +#ifdef _WIN64 + throwExceptionProc throwException; +#endif HRSRC resourceInfo; DWORD resourceSize; LPVOID resourceData; @@ -43,6 +49,24 @@ void LoadFromFile(void) LoadString(handle, 20, buffer, sizeof(buffer)); _tprintf(_T("String2: %s\n"), buffer); +#ifdef _WIN64 + throwException = (throwExceptionProc)GetProcAddress(handle, "throwException"); + if (!throwException) { + _tprintf(_T("GetProcAddress(\"throwException\") returned NULL\n")); + } else { + try { + throwException(); + _tprintf(_T("Should have caught exception.\n")); + } catch (int e) { + if (e != 42) { + _tprintf(_T("Should have caught exception 42, got %d instead\n"), e); + } else { + _tprintf(_T("Caught exception %d\n"), e); + } + } + } +#endif + FreeLibrary(handle); } @@ -90,6 +114,9 @@ void LoadFromMemory(void) size_t size; HMEMORYMODULE handle; addNumberProc addNumber; +#ifdef _WIN64 + throwExceptionProc throwException; +#endif HMEMORYRSRC resourceInfo; DWORD resourceSize; LPVOID resourceData; @@ -124,6 +151,24 @@ void LoadFromMemory(void) MemoryLoadString(handle, 20, buffer, sizeof(buffer)); _tprintf(_T("String2: %s\n"), buffer); +#ifdef _WIN64 + throwException = (throwExceptionProc)MemoryGetProcAddress(handle, "throwException"); + if (!throwException) { + _tprintf(_T("MemoryGetProcAddress(\"throwException\") returned NULL\n")); + } else { + try { + throwException(); + _tprintf(_T("Should have caught exception.\n")); + } catch (int e) { + if (e != 42) { + _tprintf(_T("Should have caught exception 42, got %d instead\n"), e); + } else { + _tprintf(_T("Caught exception %d\n"), e); + } + } + } +#endif + MemoryFreeLibrary(handle); exit: diff --git a/example/SampleDLL/CMakeLists.txt b/example/SampleDLL/CMakeLists.txt index e3a3af3..381e719 100644 --- a/example/SampleDLL/CMakeLists.txt +++ b/example/SampleDLL/CMakeLists.txt @@ -7,6 +7,9 @@ set (sources add_definitions (-DSAMPLEDLL_EXPORTS) add_library (SampleDLL MODULE ${sources}) if (NOT MSVC) + set_target_properties ("SampleDLL" PROPERTIES LINK_FLAGS "-static -lstdc++ -dynamic") set_target_properties ("SampleDLL" PROPERTIES PREFIX "") set_target_properties ("SampleDLL" PROPERTIES SUFFIX ".dll") +else () + set (CMAKE_CXX_FLAGS "/EHs") endif () diff --git a/example/SampleDLL/Makefile b/example/SampleDLL/Makefile index ce3f65b..ce6aaee 100644 --- a/example/SampleDLL/Makefile +++ b/example/SampleDLL/Makefile @@ -27,7 +27,7 @@ endif OBJ = SampleDLL.o SampleDLL.res SampleDLL.dll: $(OBJ) - $(LINK) $(LDFLAGS) -o SampleDLL.dll $(OBJ) + $(LINK) $(LDFLAGS) -static -lstdc++ -dynamic -o SampleDLL.dll $(OBJ) %.o: %.cpp $(CXX) $(CFLAGS) -c $< diff --git a/example/SampleDLL/SampleDLL.cpp b/example/SampleDLL/SampleDLL.cpp index 7bf03ef..ec73b0e 100644 --- a/example/SampleDLL/SampleDLL.cpp +++ b/example/SampleDLL/SampleDLL.cpp @@ -7,4 +7,11 @@ SAMPLEDLL_API int addNumbers(int a, int b) return a + b; } +#ifdef _WIN64 +SAMPLEDLL_API void throwException(void) +{ + throw 42; +} +#endif + }