OSDN Git Service

コールバック関数の設定をする際に解除をあらかじめ行っていなかったため、二度目以降の設定でエラーとなっていたバグを修正。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 18 Oct 2009 08:41:20 +0000 (08:41 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 18 Oct 2009 08:41:20 +0000 (08:41 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@67 9df91469-1e22-0410-86e7-ea8537beb833

src/plugin/calLibrary/calLibrary.cpp

index 1d6a8d1..36abcf9 100644 (file)
@@ -250,6 +250,9 @@ BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void
 //    Inside Functions\r
 //******************************************************************************\r
 \r
+#define GetAPIAddress(name, unicode) GetProcAddress(g_LibInfo.hLib, (g_LibInfo.szPrefix + wxT(name) + ((unicode && g_LibInfo.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
+#define GetAPIAddressAlt(name, unicode) GetProcAddress(g_LibInfoAlt.hLib, (g_LibInfoAlt.szPrefix + wxT(name) + ((unicode && g_LibInfoAlt.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
+\r
 int CalErrorCodeConvert(int nCalErrorCode)\r
 {\r
        switch (nCalErrorCode)\r
@@ -334,8 +337,60 @@ int CalErrorCodeConvert(int nCalErrorCode)
        }\r
 }\r
 \r
-#define GetAPIAddress(name, unicode) GetProcAddress(g_LibInfo.hLib, (g_LibInfo.szPrefix + wxT(name) + ((unicode && g_LibInfo.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
-#define GetAPIAddressAlt(name, unicode) GetProcAddress(g_LibInfoAlt.hLib, (g_LibInfoAlt.szPrefix + wxT(name) + ((unicode && g_LibInfoAlt.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
+int CalSetCallbackProc(bool fAlt)\r
+{\r
+       // \90æ\82É\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82Ì\90Ý\92è\82ð\89ð\8f\9c\82µ\82Ä\82¨\82­\81B\r
+       FARPROC fpProc;\r
+       if (fAlt)\r
+       {\r
+               fpProc = ::GetAPIAddressAlt("KillOwnerWindowEx64", false);\r
+               g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfoAlt.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddressAlt("KillOwnerWindowEx", false);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               fpProc = ::GetAPIAddress("KillOwnerWindowEx64", false);\r
+               g_LibInfo.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfo.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddress("KillOwnerWindowEx", false);\r
+               }\r
+       }\r
+       if (fpProc == NULL)\r
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+       // \83G\83\89\81[\82Å\82à\96³\8e\8b\82·\82é\81B\r
+       ((BOOL (__stdcall *)(HWND)) fpProc)(NULL);\r
+\r
+       // \91±\82¢\82Ä\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82Ì\90Ý\92è\81B\r
+       if (fAlt)\r
+       {\r
+               fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx64", false);\r
+               g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfoAlt.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx", true);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               fpProc = ::GetAPIAddress("SetOwnerWindowEx64", false);\r
+               g_LibInfo.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfo.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddress("SetOwnerWindowEx", true);\r
+               }\r
+       }\r
+\r
+       return (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
+               ? ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *       )) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc)\r
+               : ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *, DWORD)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc, (fAlt ? g_LibInfoAlt.fUnicode : g_LibInfo.fUnicode) ? sizeof(EXTRACTINGINFOEX64W) : sizeof(EXTRACTINGINFOEX64))))\r
+               ? TPI_ERROR_U_USE_LIBRARY : TPI_ERROR_SUCCESS;\r
+}\r
 \r
 //******************************************************************************\r
 //    Functions\r
@@ -875,49 +930,10 @@ int __stdcall SetCallbackProc
                return TPI_ERROR_D_PARAMETER;\r
        }\r
        g_prProc = * _prArcProc;\r
-       g_LibInfo.fCallback32bit    = FALSE;\r
-       g_LibInfoAlt.fCallback32bit = FALSE;\r
-\r
-       // API\82Ì\83A\83h\83\8c\83X\82ð\8eæ\93¾\81B\r
-       FARPROC fpProc = ::GetAPIAddress("SetOwnerWindowEx64", true);\r
-\r
-       BOOL fResult = FALSE;\r
-       if (fpProc == NULL)\r
-       {\r
-               // SetOwnerWindowEx64\82ª\8eÀ\91\95\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81ASetOwnerWindowEx\82ð\97\98\97p\81B\r
-               fpProc = ::GetAPIAddress("SetOwnerWindowEx", true);\r
-               if (fpProc == NULL)\r
-               {\r
-                       return TPI_ERROR_U_USE_LIBRARY;\r
-               }\r
-               g_LibInfo.fCallback32bit = TRUE;\r
-               fResult = ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc);\r
-       }\r
-       else\r
-       {\r
-               fResult = ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *, DWORD)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc, g_LibInfo.fUnicode ? sizeof(EXTRACTINGINFOEX64W) : sizeof(EXTRACTINGINFOEX64));\r
-       }\r
-\r
-       // \91ã\91Ö\83\89\83C\83u\83\89\83\8a\82ÌAPI\82Ì\83A\83h\83\8c\83X\82ð\8eæ\93¾\81B\91\8dÝ\82µ\82È\82­\82Ä\82à\83G\83\89\81[\82É\82Í\82µ\82È\82¢\81B\r
-       fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx64", true);\r
-\r
-       if (fpProc == NULL)\r
-       {\r
-               // SetOwnerWindowEx64\82ª\8eÀ\91\95\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81ASetOwnerWindowEx\82ð\97\98\97p\81B\r
-               fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx", true);\r
-               if (fpProc == NULL)\r
-               {\r
-                       return fResult;\r
-               }\r
-               g_LibInfoAlt.fCallback32bit = TRUE;\r
-               ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc);\r
-       }\r
-       else\r
-       {\r
-               ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *, DWORD)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc, g_LibInfoAlt.fUnicode ? sizeof(EXTRACTINGINFOEX64W) : sizeof(EXTRACTINGINFOEX64));\r
-       }\r
 \r
-       return fResult ? TPI_ERROR_SUCCESS : TPI_ERROR_UNDEFINED;\r
+       // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82ð\90Ý\92è\81B\r
+       CalSetCallbackProc(true);\r
+       return CalSetCallbackProc(false);\r
 }\r
 \r
 #ifdef __cplusplus\r