From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Tue, 3 Feb 2009 12:02:20 +0000 (+0000)
Subject: added wxPersistentRegisterAndRestore() function to work around VC6 brokenness in... 
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/77cc73a78e51832c71351a2758df508672b8c294

added wxPersistentRegisterAndRestore() function to work around VC6 brokenness in debug DLL build

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58635 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

diff --git a/include/wx/persist.h b/include/wx/persist.h
index ff2aabab10..24cd503142 100644
--- a/include/wx/persist.h
+++ b/include/wx/persist.h
@@ -215,5 +215,23 @@ private:
     DECLARE_NO_COPY_CLASS(wxPersistentObject)
 };
 
+// FIXME-VC6: VC6 has troubles with template methods of DLL-exported classes,
+//            apparently it believes they should be defined in the DLL (which
+//            is, of course, impossible as the DLL doesn't know for which types
+//            will they be instantiated) instead of compiling them when
+//            building the main application itself. Because of this problem
+//            (which only arises in debug build!) we can't use the usual
+//            RegisterAndRestore(obj) with it and need to explicitly create the
+//            persistence adapter. To hide this ugliness we define a global
+//            function which does it for us.
+template <typename T>
+inline bool wxPersistentRegisterAndRestore(T *obj)
+{
+    wxPersistentObject * const pers = wxCreatePersistentObject(obj);
+
+    return wxPersistenceManager::Get().RegisterAndRestore(obj, pers);
+                                            
+}
+
 #endif // _WX_PERSIST_H_
 
diff --git a/interface/wx/persist.h b/interface/wx/persist.h
index 8c31fb2976..bb0dc58c31 100644
--- a/interface/wx/persist.h
+++ b/interface/wx/persist.h
@@ -259,6 +259,23 @@ protected:
     framework.
 
     @see @ref persistence_defining
+
+    @header{wx/persist.h}
  */
 template <class T>
 wxPersistentObject *wxCreatePersistentObject(T *obj);
+
+/**
+    A shorter synonym for wxPersistenceManager::RegisterAndRestore().
+
+    This function simply calls wxPersistenceManager::RegisterAndRestore() but
+    using it results in slightly shorter code as it calls
+    wxPersistenceManager::Get() internally.
+
+    For the implementation reasons, this function @em mucst be used instead of
+    the template method when using Microsoft Visual C++ 6 compiler.
+
+    @header{wx/persist.h}
+ */
+template <class T>
+bool wxPersistentRegisterAndRestore(T *obj);
diff --git a/samples/widgets/widgets.cpp b/samples/widgets/widgets.cpp
index a808a3a87f..19d86f02e3 100644
--- a/samples/widgets/widgets.cpp
+++ b/samples/widgets/widgets.cpp
@@ -367,7 +367,7 @@ WidgetsFrame::WidgetsFrame(const wxString& title)
             : wxFrame(NULL, wxID_ANY, title)
 {
     SetName("Main");
-    const bool sizeSet = wxPersistenceManager::Get().RegisterAndRestore(this);
+    const bool sizeSet = wxPersistentRegisterAndRestore(this);
 
     // set the frame icon
     SetIcon(wxICON(sample));
@@ -617,7 +617,7 @@ void WidgetsFrame::InitBook()
              wxEVT_COMMAND_WIDGETS_PAGE_CHANGED,
              wxWidgetsbookEventHandler(WidgetsFrame::OnPageChanged) );
 
-    const bool pageSet = wxPersistenceManager::Get().RegisterAndRestore(m_book);
+    const bool pageSet = wxPersistentRegisterAndRestore(m_book);
 
 #if USE_TREEBOOK
     // for treebook page #0 is empty parent page only so select the first page