#endif
#include "wx/app.h"
+#include "wx/dynlib.h"
#include "wx/frame.h"
#include "wx/panel.h"
#include "wx/sizer.h"
// wx application startup code -- runs from its own thread
-__stdcall unsigned MyAppLauncher(void* event)
+unsigned wxSTDCALL MyAppLauncher(void* event)
{
// Note: The thread that called run_wx_gui_from_dll() holds gs_wxStartupCS
// 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
// 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
wxQueueEvent(wxApp::GetInstance(), event);
}
-
-extern "C" WXEXPORT
-void wx_dll_cleanup(void)
+void wx_dll_cleanup()
{
wxCriticalSectionLocker lock(gs_wxStartupCS);
CloseHandle(gs_wxMainThread);
gs_wxMainThread = NULL;
}
+
+} // extern "C"