]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/dll/my_dll.cpp
Fix testing for existence of paths with trailing separators in wxMSW.
[wxWidgets.git] / samples / dll / my_dll.cpp
index 99dbedc002b8c6254c56066c8649beeac5f8156b..3aa93e97083ffcb0792fab0f398267f5d2837c7e 100644 (file)
     #pragma hdrstop
 #endif
 
-#ifndef __WXMSW__
-    #error "This sample is MSW-only"
+#ifndef __WINDOWS__
+    #error "This sample is Windows-only"
 #endif
 
 #include "wx/app.h"
+#include "wx/dynlib.h"
 #include "wx/frame.h"
 #include "wx/panel.h"
 #include "wx/sizer.h"
@@ -149,10 +150,10 @@ MyDllApp::MyDllApp()
 
     Connect(wxEVT_IDLE, wxIdleEventHandler(MyDllApp::OnIdle));
     Connect(CMD_SHOW_WINDOW,
-            wxEVT_COMMAND_THREAD,
+            wxEVT_THREAD,
             wxThreadEventHandler(MyDllApp::OnShowWindow));
     Connect(CMD_TERMINATE,
-            wxEVT_COMMAND_THREAD,
+            wxEVT_THREAD,
             wxThreadEventHandler(MyDllApp::OnTerminate));
 }
 
@@ -192,16 +193,15 @@ unsigned wxSTDCALL MyAppLauncher(void* event)
     //       at this point and won't release it until we signal it.
 
     // We need to pass correct HINSTANCE to wxEntry() and the right value is
-    // HINSTANCE of this DLL, not of the main .exe.
-    //
-    // This method of obtaining DLL's instance handle requires at least
-    // Windows XP/2003. We could also implement DllMain() and remember it from
-    // there, that would work on older systems too.
-    HINSTANCE hInstance;
-    int ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
-                                (LPCTSTR)&MyAppLauncher,
-                                &hInstance);
-    if ( ret == 0 )
+    // HINSTANCE of this DLL, not of the main .exe, use this MSW-specific wx
+    // function to get it. Notice that under Windows XP and later the name is
+    // not needed/used as we retrieve the DLL handle from an address inside it
+    // but you do need to use the correct name for this code to work with older
+    // systems as well.
+    const HINSTANCE
+        hInstance = wxDynamicLibrary::MSWGetModuleHandle("my_dll",
+                                                         &gs_wxMainThread);
+    if ( !hInstance )
         return 0; // failed to get DLL's handle
 
     // IMPLEMENT_WXWIN_MAIN does this as the first thing
@@ -231,7 +231,9 @@ unsigned wxSTDCALL MyAppLauncher(void* event)
 // public DLL interface
 // ----------------------------------------------------------------------------
 
-extern "C" WXEXPORT
+extern "C"
+{
+
 void run_wx_gui_from_dll(const char *title)
 {
     // In order to prevent conflicts with hosting app's event loop, we
@@ -286,14 +288,12 @@ void run_wx_gui_from_dll(const char *title)
 
     // Send a message to wx thread to show a new frame:
     wxThreadEvent *event =
-        new wxThreadEvent(wxEVT_COMMAND_THREAD, CMD_SHOW_WINDOW);
+        new wxThreadEvent(wxEVT_THREAD, CMD_SHOW_WINDOW);
     event->SetString(title);
     wxQueueEvent(wxApp::GetInstance(), event);
 }
 
-
-extern "C" WXEXPORT
-void wx_dll_cleanup(void)
+void wx_dll_cleanup()
 {
     wxCriticalSectionLocker lock(gs_wxStartupCS);
 
@@ -303,7 +303,7 @@ void wx_dll_cleanup(void)
     // If wx main thread is running, we need to stop it. To accomplish this,
     // send a message telling it to terminate the app.
     wxThreadEvent *event =
-        new wxThreadEvent(wxEVT_COMMAND_THREAD, CMD_TERMINATE);
+        new wxThreadEvent(wxEVT_THREAD, CMD_TERMINATE);
     wxQueueEvent(wxApp::GetInstance(), event);
 
     // We must then wait for the thread to actually terminate.
@@ -311,3 +311,5 @@ void wx_dll_cleanup(void)
     CloseHandle(gs_wxMainThread);
     gs_wxMainThread = NULL;
 }
+
+} // extern "C"