OSDN Git Service

CheckArchiveからnFileCountを削除。
[tpi/lychee.git] / src / plugin / calLibrary / calLibrary.cpp
index e40c49d..9ee8207 100644 (file)
@@ -16,7 +16,7 @@
   with this library; if not, write to the Free Software Foundation, Inc.,\r
   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
 \r
-  $Id: calLibrary.cpp,v 1.23 2009/09/27 13:44:12 sirakaba Exp $\r
+  $Id$\r
 *******************************************************************************/\r
 \r
 //******************************************************************************\r
 struct g_LibInfo\r
 {\r
        HMODULE hLib;\r
-       HMODULE hLibAlt;\r
        wxString szPrefix;\r
-       wxString szPrefixAlt;\r
        int nLibIndex;\r
-       unsigned long nExFlag;\r
        wxXmlNode node;\r
        bool fUnicode;\r
-       bool fUnicodeAlt;\r
-}      g_LibInfo;\r
+       bool fCallback32bit;\r
+       bool fRunning;\r
+}      g_LibInfo, g_LibInfoAlt;\r
 \r
 TPI_PROC g_prProc;\r
-bool g_fCallback32bit;\r
-bool g_fExistUnicodeMode;\r
 \r
 //******************************************************************************\r
-//    Entry\r
+//    Inside Functions\r
 //******************************************************************************\r
 \r
-#ifdef __LINUX__\r
-void __attribute__((destructor)) Detach(void)\r
-{\r
-       ::FreeLibrary(g_LibInfo.hLib);\r
-       ::FreeLibrary(g_LibInfo.hLibAlt);\r
-}\r
-#else\r
-BOOL __stdcall DllMain(HMODULE, DWORD fdwReason, void *)\r
-{\r
-       switch (fdwReason)\r
-       {\r
-       case DLL_PROCESS_DETACH:\r
-               ::FreeLibrary(g_LibInfo.hLib);\r
-               break;\r
-       }\r
-       return TRUE;\r
-}\r
-#endif\r
-\r
 wxDateTime FileTimeToWxDateTime(FILETIME * pft)\r
 {\r
-#ifdef __WINDOWS__\r
        FILETIME ftLocal;\r
        SYSTEMTIME st;\r
        if (! ::FileTimeToLocalFileTime(pft, & ftLocal) || ! ::FileTimeToSystemTime(& ftLocal, & st))\r
@@ -88,9 +64,6 @@ wxDateTime FileTimeToWxDateTime(FILETIME * pft)
        }\r
        wxDateTime dt(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);\r
        return dt;\r
-#else\r
-    return (time_t) 0;\r
-#endif\r
 }\r
 \r
 //******************************************************************************\r
@@ -101,165 +74,167 @@ BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void
 {\r
        if (_uMsg != ::RegisterWindowMessage((const wchar_t *) WM_ARCEXTRACT))\r
        {\r
-               // \93Æ\8e©\8ed\97l\82È\82Ç\82É\91Î\82·\82é\97\\94õ\83R\81[\83h\81B\r
+               // 独自仕様などに対する予備コード。\r
                return TRUE;\r
        }\r
 \r
-       // \8d\\91¢\91Ì\82ð\8f\89\8aú\89»\81B\r
+       // 構造体を初期化。\r
        TPI_PROCESSINFO piInfo;\r
-       piInfo.uMessage = TPI_MESSAGE_STATUS;\r
+       piInfo.eMessage = TPI_MESSAGE_STATUS;\r
 \r
        if (_lpEis != NULL)\r
        {\r
-               if (g_fCallback32bit)\r
+               if ((g_LibInfo.fRunning && g_LibInfo.fCallback32bit) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fCallback32bit))\r
                {\r
-                       if (g_LibInfo.fUnicode)\r
+                       if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
                        {\r
-                               // \8f\89\8aú\89»\81B\r
+                               // 初期化。\r
                                EXTRACTINGINFOEXW * ex = (EXTRACTINGINFOEXW *) _lpEis;\r
 \r
-                               // EXTRACTINGINFOEXW -> TPI_FILEINFO\95Ï\8a·\81B\r
+                               // EXTRACTINGINFOEXW -> TPI_FILEINFO変換。\r
                                piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
                                piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
-                               piInfo.fiInfo.llPackedSize      = ex->dwCompressedSize;\r
-                               piInfo.fiInfo.llUnpackedSize    = ex->exinfo.dwFileSize;\r
-                               piInfo.fiInfo.uOSType           = ex->uOSType;\r
+                               piInfo.fiInfo.nPackedSize      = ex->dwCompressedSize;\r
+                               piInfo.fiInfo.nUnpackedSize    = ex->exinfo.dwFileSize;\r
+                               piInfo.fiInfo.eOSType           = ex->eOSType;\r
                                piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
                                piInfo.fiInfo.szStoredName      = WC2String(ex->exinfo.szSourceFileName);\r
                                piInfo.fiInfo.szMethod          = WC2String(ex->szMode);\r
 \r
-                               // EXTRACTINGINFOEXW -> TPI_PROCESSINFO\95Ï\8a·\81B\r
-                               piInfo.llProcessedSize          = ex->exinfo.dwWriteSize;\r
-                               piInfo.fnDestination            = wxFileName::FileName(WC2String(ex->exinfo.szDestFileName));\r
+                               // EXTRACTINGINFOEXW -> TPI_PROCESSINFO変換。\r
+                               piInfo.nProcessedSize           = ex->exinfo.dwWriteSize;\r
+                               piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
                        }\r
                        else\r
                        {\r
-                               // \8f\89\8aú\89»\81B\r
+                               // 初期化。\r
                                EXTRACTINGINFOEX * ex = (EXTRACTINGINFOEX *) _lpEis;\r
 \r
-                               // EXTRACTINGINFOEX -> TPI_FILEINFO\95Ï\8a·\81B\r
+                               // EXTRACTINGINFOEX -> TPI_FILEINFO変換。\r
                                piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
                                piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
-                               piInfo.fiInfo.llPackedSize      = ex->dwCompressedSize;\r
-                               piInfo.fiInfo.llUnpackedSize    = ex->exinfo.dwFileSize;\r
-                               piInfo.fiInfo.uOSType           = ex->uOSType;\r
+                               piInfo.fiInfo.nPackedSize      = ex->dwCompressedSize;\r
+                               piInfo.fiInfo.nUnpackedSize    = ex->exinfo.dwFileSize;\r
+                               piInfo.fiInfo.eOSType           = ex->eOSType;\r
                                piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
-                               piInfo.fiInfo.szStoredName      = MB2String(ex->exinfo.szSourceFileName);\r
-                               piInfo.fiInfo.szMethod          = MB2String(ex->szMode);\r
+                               piInfo.fiInfo.szStoredName      = UTF82String(ex->exinfo.szSourceFileName);\r
+                               piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
 \r
-                               // EXTRACTINGINFOEX -> TPI_PROCESSINFO\95Ï\8a·\81B\r
-                               piInfo.llProcessedSize          = ex->exinfo.dwWriteSize;\r
-                               piInfo.fnDestination            = wxFileName::FileName(MB2String(ex->exinfo.szDestFileName));\r
+                               // EXTRACTINGINFOEX -> TPI_PROCESSINFO変換。\r
+                               piInfo.nProcessedSize           = ex->exinfo.dwWriteSize;\r
+                               piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
                        }\r
                        piInfo.fiInfo.dwAttribute       = 0;\r
                }\r
                else\r
                {\r
-                       if (g_LibInfo.fUnicode)\r
+                       if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
                        {\r
-                               // \8f\89\8aú\89»\81B\r
+                               // 初期化。\r
                                EXTRACTINGINFOEX64W * ex = (EXTRACTINGINFOEX64W *) _lpEis;\r
 \r
-                               // EXTRACTINGINFOEX64W -> TPI_FILEINFO\95Ï\8a·\81B\r
+                               // EXTRACTINGINFOEX64W -> TPI_FILEINFO変換。\r
                                piInfo.fiInfo.dwAttribute       = ex->dwAttributes;\r
                                piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
                                piInfo.fiInfo.tmAccess          = FileTimeToWxDateTime(& ex->ftAccessTime);\r
                                piInfo.fiInfo.tmCreate          = FileTimeToWxDateTime(& ex->ftCreateTime);\r
                                piInfo.fiInfo.tmModified        = FileTimeToWxDateTime(& ex->ftWriteTime);\r
-                               piInfo.fiInfo.llPackedSize      = ex->llCompressedSize;\r
-                               piInfo.fiInfo.llUnpackedSize    = ex->llFileSize;\r
-                               piInfo.fiInfo.uOSType           = ex->uOSType;\r
+                               piInfo.fiInfo.nPackedSize       = ex->llCompressedSize;\r
+                               piInfo.fiInfo.nUnpackedSize     = ex->llFileSize;\r
+                               piInfo.fiInfo.eOSType           = ex->eOSType;\r
                                piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
                                piInfo.fiInfo.szStoredName      = WC2String(ex->exinfo.szSourceFileName);\r
                                piInfo.fiInfo.szMethod          = WC2String(ex->szMode);\r
 \r
-                               // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO\95Ï\8a·\81B\r
-                               piInfo.llProcessedSize          = ex->llWriteSize;\r
-                               piInfo.fnDestination            = wxFileName::FileName(WC2String(ex->exinfo.szDestFileName));\r
+                               // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO変換。\r
+                               piInfo.nProcessedSize           = ex->llWriteSize;\r
+                               piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
                        }\r
                        else\r
                        {\r
-                               // \8f\89\8aú\89»\81B\r
+                               // 初期化。\r
                                EXTRACTINGINFOEX64 * ex = (EXTRACTINGINFOEX64 *) _lpEis;\r
 \r
-                               // EXTRACTINGINFOEX64 -> TPI_FILEINFO\95Ï\8a·\81B\r
+                               // EXTRACTINGINFOEX64 -> TPI_FILEINFO変換。\r
                                piInfo.fiInfo.dwAttribute       = ex->dwAttributes;\r
                                piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
                                piInfo.fiInfo.tmAccess          = FileTimeToWxDateTime(& ex->ftAccessTime);\r
                                piInfo.fiInfo.tmCreate          = FileTimeToWxDateTime(& ex->ftCreateTime);\r
                                piInfo.fiInfo.tmModified        = FileTimeToWxDateTime(& ex->ftWriteTime);\r
-                               piInfo.fiInfo.llPackedSize      = ex->llCompressedSize;\r
-                               piInfo.fiInfo.llUnpackedSize    = ex->llFileSize;\r
-                               piInfo.fiInfo.uOSType           = ex->uOSType;\r
+                               piInfo.fiInfo.nPackedSize       = ex->llCompressedSize;\r
+                               piInfo.fiInfo.nUnpackedSize     = ex->llFileSize;\r
+                               piInfo.fiInfo.eOSType           = ex->eOSType;\r
                                piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
-                               piInfo.fiInfo.szStoredName      = MB2String(ex->exinfo.szSourceFileName);\r
-                               piInfo.fiInfo.szMethod          = MB2String(ex->szMode);\r
+                               piInfo.fiInfo.szStoredName      = UTF82String(ex->exinfo.szSourceFileName);\r
+                               piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
 \r
-                               // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO\95Ï\8a·\81B\r
-                               piInfo.llProcessedSize          = ex->llWriteSize;\r
-                               piInfo.fnDestination            = wxFileName::FileName(MB2String(ex->exinfo.szDestFileName));\r
+                               // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO変換。\r
+                               piInfo.nProcessedSize           = ex->llWriteSize;\r
+                               piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
                        }\r
                }\r
-               piInfo.fiInfo.fnFileName        = wxFileName::FileName(piInfo.fiInfo.szStoredName);\r
+               piInfo.fiInfo.fnFileName        = wxFileName(piInfo.fiInfo.szStoredName);\r
        }\r
 \r
-       // \90\94\8e\9a\82Ì\8f\87\82Å\82È\82­\8f\88\97\9d\82Ì\8f\87\82Å\95À\82ñ\82Å\82¢\82é\82±\82Æ\82É\92\8d\88Ó\81B\r
+       // 数字の順でなく処理の順で並んでいることに注意。\r
        switch (_uState)\r
        {\r
        case ARCEXTRACT_OPEN:\r
-               // \93\96\8aY\8f\91\8cÉ\82Ì\8f\88\97\9d\82ð\8aJ\8en\81B\r
-               piInfo.uStatus = TPI_STATUS_OPENARCHIVE;\r
+               // 当該書庫の処理を開始。\r
+               piInfo.eStatus = TPI_STATUS_OPENARCHIVE;\r
                break;\r
        case 5:\r
-               // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8c\9f\8dõ\92\86\81B\r
-               piInfo.uStatus = TPI_STATUS_SEEKFILE;\r
+               // 当該ファイルの検索中。\r
+               piInfo.eStatus = TPI_STATUS_SEEKFILE;\r
                break;\r
        case ARCEXTRACT_BEGIN:\r
-               // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8aJ\8en\81B\r
-               piInfo.uStatus = TPI_STATUS_BEGINPROCESS;\r
+               // 当該ファイルの処理を開始。\r
+               piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
                break;\r
        case ARCEXTRACT_INPROCESS:\r
-               // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8eÀ\8ds\92\86\81B\r
-               piInfo.uStatus = TPI_STATUS_INPROCESS;\r
+               // 当該ファイルの処理を実行中。\r
+               piInfo.eStatus = TPI_STATUS_INPROCESS;\r
                break;\r
        case 6:\r
-               // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8fI\97¹\81B\r
-               piInfo.uStatus = TPI_STATUS_ENDPROCESS;\r
+               // 当該ファイルの処理を終了。\r
+               piInfo.eStatus = TPI_STATUS_ENDPROCESS;\r
                break;\r
        case 7:\r
-               // \93\96\8aY\8f\91\8cÉ\82Ì\8c\9f\8d¸\92\86\81B\r
-               piInfo.uStatus = TPI_STATUS_TESTARCHIVE;\r
+               // 当該書庫の検査中。\r
+               piInfo.eStatus = TPI_STATUS_TESTARCHIVE;\r
                break;\r
        case ARCEXTRACT_COPY:\r
-               // \93\96\8aY\8f\91\8cÉ\82Ì\8f\91\82«\96ß\82µ\92\86\81B\r
-               piInfo.uStatus = TPI_STATUS_COPYARCHIVE;\r
+               // 当該書庫の書き戻し中。\r
+               piInfo.eStatus = TPI_STATUS_COPYARCHIVE;\r
                break;\r
        case ARCEXTRACT_END:\r
-               // \93\96\8aY\8f\91\8cÉ\82Ì\8f\88\97\9d\82ð\8fI\97¹\81B\r
-               piInfo.uStatus = TPI_STATUS_CLOSEARCHIVE;\r
+               // 当該書庫の処理を終了。\r
+               piInfo.eStatus = TPI_STATUS_CLOSEARCHIVE;\r
                break;\r
        }\r
 \r
-       // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82É\91\97\90M\81B\r
+       // コールバック関数に送信。\r
        if (g_prProc == NULL)\r
        {\r
                return TRUE;\r
        }\r
 \r
-       // \8ag\92£\83t\83\89\83O\82Ì\92l\82É\82æ\82è\8bt\93]\82³\82¹\82é\81B\r
-       bool bRetVal = g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CANCEL;\r
-       return g_LibInfo.nExFlag == 1 ? ! bRetVal : bRetVal;\r
+       return g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CANCEL;\r
 }\r
 \r
 //******************************************************************************\r
 //    Inside Functions\r
 //******************************************************************************\r
 \r
-int CalErrorCodeConvert(int nCalErrorCode)\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 ErrorCodeConvert(int nErrorCode)\r
 {\r
-       switch (nCalErrorCode)\r
+       switch (nErrorCode)\r
        {\r
        case 0:                     return TPI_ERROR_SUCCESS;\r
+       case -1:                                        return TPI_ERROR_S_ENDOFDATA;\r
        case ERROR_DISK_SPACE:      return TPI_ERROR_IO_ARC_WRITE;\r
        case ERROR_READ_ONLY:       return TPI_ERROR_IO_FILE_WRITE;\r
        case ERROR_USER_SKIP:       return TPI_ERROR_D_SKIPPED;\r
@@ -328,15 +303,71 @@ int CalErrorCodeConvert(int nCalErrorCode)
        case ERROR_HDR_INVALID_SIZE:return TPI_ERROR_ARC_BROKEN_HEADER;\r
        case ERROR_UNKNOWN_LEVEL:   return TPI_ERROR_ARC_UNSUPPORTED;\r
        case ERROR_BROKEN_DATA:     return TPI_ERROR_ARC_BROKEN_MISC;\r
-       case ERROR_INVALID_PATH:    return TPI_ERROR_UNDEFINED;\r
+       case ERROR_INVALID_PATH:    return TPI_ERROR_ARC_DANGER;\r
        case ERROR_TOO_BIG:         return TPI_ERROR_IO_FILE_WRITE;\r
-       case ERROR_EXECUTABLE_FILE: return TPI_ERROR_UNDEFINED;\r
+       case ERROR_EXECUTABLE_FILE: return TPI_ERROR_ARC_DANGER;\r
        case ERROR_INVALID_VALUE:   return TPI_ERROR_UNDEFINED;\r
+       case ERROR_HDR_EXPLOIT:     return TPI_ERROR_ARC_DANGER;\r
+       case ERROR_HDR_NO_CRC:      return TPI_ERROR_ARC_BROKEN_HEADER;\r
+       case ERROR_HDR_NO_NAME:     return TPI_ERROR_ARC_BROKEN_HEADER;\r
        default:                    return TPI_ERROR_UNDEFINED;\r
        }\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
+int CalSetCallbackProc(bool fAlt)\r
+{\r
+       // 先にコールバック関数の設定を解除しておく。\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
+       // エラーでも無視する。\r
+       ((BOOL (__stdcall *)(HWND)) fpProc)(NULL);\r
+\r
+       // 続いてコールバック関数の設定。\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
@@ -350,7 +381,7 @@ extern "C"
 int __stdcall GetPluginInformation\r
 (\r
        unsigned int _uInfoId,\r
-       wxULongLong _llSubOption,\r
+       wxULongLong_t,\r
        void * _pPtr\r
 )\r
 {\r
@@ -358,7 +389,7 @@ int __stdcall GetPluginInformation
        {\r
                return TPI_ERROR_D_PARAMETER;\r
        }\r
-       switch (LOWORD(_uInfoId))\r
+       switch (_uInfoId)\r
        {\r
        case TPI_INFO_VERSION_MAJOR:\r
        case TPI_INFO_VERSION_MINOR:\r
@@ -367,119 +398,117 @@ int __stdcall GetPluginInformation
        case TPI_INFO_VERSION_API:\r
                * (int *) _pPtr = 2;\r
                break;\r
-       case TPI_INFO_SUPPORTED_TYPE:\r
-       case TPI_INFO_SUPPORTED_SUFFIX:\r
-       {\r
-               // xml\89ð\90Í\8aJ\8en\81B\r
-               wxStandardPaths p;\r
-               wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
-               // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
-               wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
+       default:\r
+               return TPI_ERROR_D_UNSUPPORTED;\r
+       }\r
+       return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)\r
+{\r
+       static wxULongLong_t s_nFileId;\r
+       wxStandardPaths p;\r
+       wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
+       // 一気に先頭のライブラリの情報を取得。\r
+       wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
 \r
-               // \93K\93\96\82È\88Ê\92u\82Ü\82Å\88Ú\93®\81B\r
-               for (unsigned int i = 0; i < _llSubOption && xmlLibrary != NULL;)\r
+       if (_bFirst)\r
+       {\r
+               // xml解析開始。\r
+               s_nFileId = 0;\r
+       }\r
+       else\r
+       {\r
+               for (wxULongLong_t i = 0; i < s_nFileId && xmlLibrary != NULL; i++)\r
                {\r
                        xmlLibrary = xmlLibrary->GetNext();\r
-                       if (xmlLibrary != NULL && xmlLibrary->HasProp(wxT("suffix")))\r
-                       {\r
-                               i++;\r
-                       }\r
-               }\r
-               if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
-               {\r
-                       // xml\95\96@\83G\83\89\81[\81B\r
-                       return TPI_ERROR_UNDEFINED;\r
                }\r
-\r
-               * (wxString *) _pPtr = xmlLibrary->GetPropVal(LOWORD(_uInfoId) == TPI_INFO_SUPPORTED_TYPE ? wxT("typename") : wxT("suffix"), wxEmptyString);\r
-               break;\r
        }\r
-       default:\r
-               return TPI_ERROR_D_UNSUPPORTED;\r
+\r
+       if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
+       {\r
+               // データの終端に達した場合。\r
+               return TPI_ERROR_S_ENDOFDATA;\r
        }\r
+\r
+       MakeFormatInfo(wxT("calLibrary"), _fiInfo, xmlLibrary, s_nFileId++);\r
+\r
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
 int __stdcall LoadPlugin\r
 (\r
        const wxString & _szArcName,\r
-       wxULongLong _llSubOption\r
+       wxULongLong_t _llTypeId\r
 )\r
 {\r
-       // xml\89ð\90Í\8aJ\8en\81B\r
+       // xml解析開始。\r
        wxStandardPaths p;\r
        wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
        if (! config.IsOk())\r
        {\r
                return TPI_ERROR_UNDEFINED;\r
        }\r
-       // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
+       // 一気に先頭のライブラリの情報を取得。\r
        wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
 \r
-       // \91Î\8fÛ\82ª\91\8dÝ\82·\82é\82È\82ç\82Î\91Î\89\9e\82·\82é\83\89\83C\83u\83\89\83\8a\82ð\92²\8d¸\81A\r
-       // \91Î\8fÛ\82ª\91\8dÝ\82µ\82È\82¢\82È\82ç\82Î\8ew\8e¦\82³\82ê\82½\83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
+       // 対象が存在するならば対応するライブラリを調査、\r
+       // 対象が存在しないならば指示されたライブラリをロード。\r
+       ::RemoveCwdFromSearchPath();\r
        if (! ::wxFileExists(_szArcName))\r
        {\r
-               // \93K\93\96\82È\88Ê\92u\82Ü\82Å\88Ú\93®\81B\r
-               int u = 0;\r
-               for (unsigned int i = 0; i < _llSubOption && xmlLibrary != NULL; u++)\r
+               // 適当な位置まで移動。\r
+               for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < _llTypeId && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
                {\r
                        xmlLibrary = xmlLibrary->GetNext();\r
-                       if (xmlLibrary != NULL && xmlLibrary->HasProp(wxT("suffix")))\r
-                       {\r
-                               i++;\r
-                       }\r
                }\r
                if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
                {\r
-                       // xml\95\96@\83G\83\89\81[\81B\r
+                       // xml文法エラー。\r
                        return TPI_ERROR_UNDEFINED;\r
                }\r
-               g_LibInfo.nLibIndex = u;\r
-               g_LibInfo.node = * xmlLibrary;\r
 \r
-               // \83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
-               g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
+               // ライブラリをロード。\r
+               g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetAttribute(wxT("name"), wxEmptyString).c_str());\r
                if (g_LibInfo.hLib == NULL)\r
                {\r
                        return TPI_ERROR_U_LOAD_LIBRARY;\r
                }\r
-               g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
-               g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
-               g_LibInfo.node.GetPropVal(wxT("exflag"), wxT("0")).ToULong(& g_LibInfo.nExFlag);\r
+               g_LibInfo.szPrefix = xmlLibrary->GetAttribute(wxT("prefix"), wxEmptyString);\r
+               g_LibInfo.fUnicode = xmlLibrary->GetAttribute(wxT("unicode"), wxT("0")) == wxT("1");\r
+               g_LibInfo.node = * xmlLibrary;\r
 \r
-               // \91ã\91Ö\83\89\83C\83u\83\89\83\8a\82à\83\8d\81[\83h\81B\83\8d\81[\83h\82Å\82«\82È\82­\82Ä\82à\83G\83\89\81[\82É\82Í\82µ\82È\82¢\81B\r
-               g_LibInfo.szPrefixAlt = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
-               g_LibInfo.fUnicodeAlt = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
-               g_LibInfo.hLibAlt = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
+               // 代替ライブラリもロード。ロードできなくてもエラーにはしない。\r
+               g_LibInfoAlt.szPrefix = xmlLibrary->GetAttribute(wxT("prefix-alt"), wxEmptyString);\r
+               g_LibInfoAlt.fUnicode = xmlLibrary->GetAttribute(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
+               g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString).c_str());\r
 \r
                return TPI_ERROR_SUCCESS;\r
        }\r
 \r
-       // \96³\8cÀ\83\8b\81[\83v\82É\8a×\82ç\82È\82¢\82æ\82¤\8fã\8cÀ\82ð\90Ý\92è\81B\r
+       // 無限ループに陥らないよう上限を設定。\r
        for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
        {\r
-               // \83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
-               g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
+               // ライブラリをロード。\r
+               g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetAttribute(wxT("name"), wxEmptyString).c_str());\r
                if (g_LibInfo.hLib == NULL)\r
                {\r
                        xmlLibrary = xmlLibrary->GetNext();\r
                        continue;\r
                }\r
-               g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
-               g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
-               g_LibInfo.node.GetPropVal(wxT("exflag"), wxT("0")).ToULong(& g_LibInfo.nExFlag);\r
-\r
-               // \91ã\91Ö\83\89\83C\83u\83\89\83\8a\82à\83\8d\81[\83h\81B\83\8d\81[\83h\82Å\82«\82È\82­\82Ä\82à\83G\83\89\81[\82É\82Í\82µ\82È\82¢\81B\r
-               g_LibInfo.szPrefixAlt = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
-               g_LibInfo.fUnicodeAlt = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
-               g_LibInfo.hLibAlt = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
+               g_LibInfo.szPrefix = xmlLibrary->GetAttribute(wxT("prefix"), wxEmptyString);\r
+               g_LibInfo.fUnicode = xmlLibrary->GetAttribute(wxT("unicode"), wxT("0")) == wxT("1");\r
+\r
+               // 代替ライブラリもロード。ロードできなくてもエラーにはしない。\r
+               g_LibInfoAlt.szPrefix = xmlLibrary->GetAttribute(wxT("prefix-alt"), wxEmptyString);\r
+               g_LibInfoAlt.fUnicode = xmlLibrary->GetAttribute(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
+               g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString).c_str());\r
                g_LibInfo.node = * xmlLibrary;\r
 \r
-               // \8f\91\8cÉ\82É\91Î\89\9e\82µ\82Ä\82¢\82é\82©\83`\83F\83b\83N\81B\r
-               if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
+               // 書庫に対応しているかチェック。\r
+               if (CheckArchive(_szArcName) == TPI_ERROR_SUCCESS)\r
                {\r
-                       // \91Î\89\9e\82µ\82Ä\82¢\82ê\82Î\8f\88\97\9d\82ð\8fI\97¹\81B\r
+                       // 対応していれば処理を終了。\r
                        return TPI_ERROR_SUCCESS;\r
                }\r
 \r
@@ -496,20 +525,18 @@ int __stdcall FreePlugin
 )\r
 {\r
        ::FreeLibrary(g_LibInfo.hLib);\r
-       ::FreeLibrary(g_LibInfo.hLibAlt);\r
+       ::FreeLibrary(g_LibInfoAlt.hLib);\r
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
 int __stdcall CheckArchive\r
 (\r
-       const wxString & _szArcName,\r
-       int * _nFileCount\r
+       const wxString & _szArcName\r
 )\r
 {\r
-       // Unicode\83\82\81[\83h\82É\90Ý\92è\81B\r
+       // Unicodeモードに設定。\r
        FARPROC fpProc = ::GetAPIAddress("SetUnicodeMode", false);\r
-       g_fExistUnicodeMode = fpProc != NULL;\r
-       if (g_fExistUnicodeMode)\r
+       if (fpProc != NULL)\r
        {\r
                ((BOOL (__stdcall *)(BOOL)) fpProc)(TRUE);\r
        }\r
@@ -522,12 +549,24 @@ int __stdcall CheckArchive
 \r
        if (! (g_LibInfo.fUnicode\r
                ? ((BOOL (__stdcall *)(const wchar_t *, const int)) fpProc)(_szArcName.wchar_str(), 0)\r
-               : ((BOOL (__stdcall *)(const char    *, const int)) fpProc)(g_fExistUnicodeMode ? _szArcName.ToUTF8() : _szArcName.char_str(),  0)\r
+               : ((BOOL (__stdcall *)(const char    *, const int)) fpProc)(_szArcName.ToUTF8(),    0)\r
        ))\r
        {\r
                return TPI_ERROR_D_UNSUPPORTED;\r
        }\r
 \r
+       return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall OpenArchive\r
+(\r
+       const wxString & _szArcName,\r
+       void * * _hArchive,\r
+       wxULongLong_t * _nFileCount\r
+)\r
+{\r
+       // ファイル数を取得。\r
+       FARPROC fpProc;\r
        if (_nFileCount != NULL)\r
        {\r
                fpProc = ::GetAPIAddress("GetFileCount", true);\r
@@ -536,25 +575,17 @@ int __stdcall CheckArchive
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
 \r
-               * _nFileCount = g_LibInfo.fUnicode\r
+               int n = g_LibInfo.fUnicode\r
                        ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
-                       : ((int (__stdcall *)(const char *)) fpProc)(g_fExistUnicodeMode ? _szArcName.ToUTF8() : _szArcName.char_str());\r
-               if (* _nFileCount == -1)\r
+                       : ((int (__stdcall *)(const char *)) fpProc)(_szArcName.ToUTF8());\r
+               if (n == -1)\r
                {\r
                        return TPI_ERROR_ARC_UNSUPPORTED;\r
                }\r
+               * _nFileCount = n;\r
        }\r
 \r
-       return TPI_ERROR_SUCCESS;\r
-}\r
-\r
-int __stdcall OpenArchive\r
-(\r
-       const wxString & _szArcName,\r
-       void * * _hArchive\r
-)\r
-{\r
-       FARPROC fpProc = ::GetAPIAddress("OpenArchive", true);\r
+       fpProc = ::GetAPIAddress("OpenArchive", true);\r
        if (fpProc == NULL)\r
        {\r
                return TPI_ERROR_U_USE_LIBRARY;\r
@@ -562,7 +593,7 @@ int __stdcall OpenArchive
 \r
        * _hArchive = g_LibInfo.fUnicode\r
                ? ((void * (__stdcall *)(const HWND, const wchar_t *, const DWORD)) fpProc)(NULL, _szArcName.wchar_str(), 0)\r
-               : ((void * (__stdcall *)(const HWND, const char    *, const DWORD)) fpProc)(NULL, g_fExistUnicodeMode ? _szArcName.ToUTF8() : _szArcName.char_str(),  0);\r
+               : ((void * (__stdcall *)(const HWND, const char    *, const DWORD)) fpProc)(NULL, _szArcName.ToUTF8(),  0);\r
        return _hArchive == NULL ? TPI_ERROR_UNDEFINED : TPI_ERROR_SUCCESS;\r
 }\r
 \r
@@ -572,7 +603,7 @@ int __stdcall CloseArchive
 )\r
 {\r
        FARPROC fpProc = ::GetAPIAddress("CloseArchive", false);\r
-       return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : CalErrorCodeConvert(((int (__stdcall *)(void *)) fpProc)(_hArchive));\r
+       return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : ErrorCodeConvert(((int (__stdcall *)(void *)) fpProc)(_hArchive));\r
 }\r
 \r
 int __stdcall GetFileInformation\r
@@ -582,9 +613,9 @@ int __stdcall GetFileInformation
        bool _bFirst\r
 )\r
 {\r
-       static unsigned int s_uFileID;\r
+       static wxULongLong_t s_nFileId;\r
        static FARPROC fpNext, fpAttr;\r
-       int nResult;\r
+       int nErrorCode;\r
        INDIVIDUALINFO iiInfo;\r
        INDIVIDUALINFOW iiInfoW;\r
        memset(& iiInfo,  0, sizeof(iiInfo));\r
@@ -592,7 +623,7 @@ int __stdcall GetFileInformation
 \r
        if (_bFirst)\r
        {\r
-               s_uFileID = 0;\r
+               s_nFileId = 0;\r
                FARPROC fpProc = ::GetAPIAddress("FindFirst", true);\r
                fpNext = ::GetAPIAddress("FindNext", true);\r
                fpAttr = ::GetAPIAddress("GetAttribute", false);\r
@@ -601,7 +632,7 @@ int __stdcall GetFileInformation
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
 \r
-               nResult = g_LibInfo.fUnicode\r
+               nErrorCode = g_LibInfo.fUnicode\r
                        ? ((int (__stdcall *)(void *, const wchar_t *, LPINDIVIDUALINFOW)) fpProc)(_hArchive, L"*", & iiInfoW)\r
                        : ((int (__stdcall *)(void *, const char *,    LPINDIVIDUALINFO))  fpProc)(_hArchive,  "*", & iiInfo);\r
        }\r
@@ -612,16 +643,16 @@ int __stdcall GetFileInformation
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
 \r
-               nResult = g_LibInfo.fUnicode\r
+               nErrorCode = g_LibInfo.fUnicode\r
                        ? ((int (__stdcall *)(void *, LPINDIVIDUALINFOW)) fpNext)(_hArchive, & iiInfoW)\r
                        : ((int (__stdcall *)(void *, LPINDIVIDUALINFO))  fpNext)(_hArchive, & iiInfo);\r
        }\r
 \r
-       nResult = CalErrorCodeConvert(nResult);\r
-       if (nResult == TPI_ERROR_SUCCESS)\r
+       nErrorCode = ErrorCodeConvert(nErrorCode);\r
+       if (nErrorCode == TPI_ERROR_SUCCESS)\r
        {\r
                _fiInfo->dwAttribute = (fpAttr == NULL) ? 0 : ((int (__stdcall *)(void *)) fpAttr)(_hArchive);\r
-               if ((signed) _fiInfo->dwAttribute == -1)\r
+               if (_fiInfo->dwAttribute == (unsigned) -1)\r
                {\r
                        _fiInfo->dwAttribute = 0;\r
                }\r
@@ -629,9 +660,9 @@ int __stdcall GetFileInformation
                if (g_LibInfo.fUnicode)\r
                {\r
                        _fiInfo->dwCRC32        = iiInfoW.dwCRC;\r
-                       _fiInfo->uOSType        = iiInfoW.uOSType;\r
-                       _fiInfo->llPackedSize   = iiInfoW.dwCompressedSize;\r
-                       _fiInfo->llUnpackedSize = iiInfoW.dwOriginalSize;\r
+                       _fiInfo->eOSType        = iiInfoW.eOSType;\r
+                       _fiInfo->nPackedSize    = iiInfoW.dwCompressedSize;\r
+                       _fiInfo->nUnpackedSize  = iiInfoW.dwOriginalSize;\r
                        _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfoW.wTime, iiInfoW.wDate));\r
                        _fiInfo->szStoredName   = WC2String(iiInfoW.szFileName);\r
                        _fiInfo->szMethod       = WC2String(iiInfoW.szMode);\r
@@ -640,21 +671,21 @@ int __stdcall GetFileInformation
                else\r
                {\r
                        _fiInfo->dwCRC32        = iiInfo.dwCRC;\r
-                       _fiInfo->uOSType        = iiInfo.uOSType;\r
-                       _fiInfo->llPackedSize   = iiInfo.dwCompressedSize;\r
-                       _fiInfo->llUnpackedSize = iiInfo.dwOriginalSize;\r
+                       _fiInfo->eOSType        = iiInfo.eOSType;\r
+                       _fiInfo->nPackedSize    = iiInfo.dwCompressedSize;\r
+                       _fiInfo->nUnpackedSize  = iiInfo.dwOriginalSize;\r
                        _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfo.wTime, iiInfo.wDate));\r
-                       _fiInfo->szStoredName   = MB2String(iiInfo.szFileName);\r
-                       _fiInfo->szMethod       = MB2String(iiInfo.szMode);\r
+                       _fiInfo->szStoredName   = UTF82String(iiInfo.szFileName);\r
+                       _fiInfo->szMethod       = UTF82String(iiInfo.szMode);\r
                        _fiInfo->wCompressRatio = iiInfo.wRatio;\r
                }\r
-               _fiInfo->llFileID       = s_uFileID++;\r
-               _fiInfo->fnFileName     = wxFileName::FileName(_fiInfo->szStoredName);\r
+               _fiInfo->nFileId        = s_nFileId++;\r
+               _fiInfo->fnFileName     = wxFileName(_fiInfo->szStoredName);\r
 //             _fiInfo->ftAccessTime   = 0;\r
 //             _fiInfo->ftCreateTime   = 0;\r
        }\r
 \r
-       return nResult;\r
+       return nErrorCode;\r
 }\r
 \r
 int __stdcall GetArchiveInformation\r
@@ -666,76 +697,78 @@ int __stdcall GetArchiveInformation
        FARPROC fpProc = ::GetAPIAddress("GetArcFileName", true);\r
        if (fpProc != NULL)\r
        {\r
-               // TODO : \83t\83@\83C\83\8b\96¼\82Ì\95\8e\9a\90\94\90§\8cÀ\82ð\93P\94p\81B\r
+               // TODO : ファイル名の文字数制限を撤廃。\r
                wxString s;\r
                if (g_LibInfo.fUnicode)\r
                {\r
                        wchar_t sz[2049];\r
+                       memset(sz, 0, sizeof(sz));\r
                        ((int (__stdcall *)(void *, wchar_t *, const int)) fpProc)(_hArchive, sz, 2048);\r
                        s = WC2String(sz);\r
                }\r
                else\r
                {\r
                        char sz[2049];\r
+                       memset(sz, 0, sizeof(sz));\r
                        ((int (__stdcall *)(void *, char *, const int)) fpProc)(_hArchive, sz, 2048);\r
-                       s = MB2String(sz);\r
+                       s = UTF82String(sz);\r
                }\r
-               _aiInfo->fnArchive = wxFileName::FileName(s);\r
+               _aiInfo->fnArchive = wxFileName(s);\r
        }\r
 \r
        fpProc = ::GetAPIAddress("GetArcFileSizeEx", false);\r
        if (fpProc != NULL)\r
        {\r
-               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llFileSize);\r
+               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->nFileSize);\r
        }\r
        else\r
        {\r
                fpProc = ::GetAPIAddress("GetArcFileSize", false);\r
                if (fpProc != NULL)\r
                {\r
-                       _aiInfo->llFileSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
+                       _aiInfo->nFileSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
                }\r
        }\r
 \r
        fpProc = ::GetAPIAddress("GetArcOriginalSizeEx", false);\r
        if (fpProc != NULL)\r
        {\r
-               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llUnpackedSize);\r
+               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->nUnpackedSize);\r
        }\r
        else\r
        {\r
                fpProc = ::GetAPIAddress("GetArcOriginalSize", false);\r
                if (fpProc != NULL)\r
                {\r
-                       _aiInfo->llUnpackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
+                       _aiInfo->nUnpackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
                }\r
        }\r
 \r
        fpProc = ::GetAPIAddress("GetArcCompressedSizeEx", false);\r
        if (fpProc != NULL)\r
        {\r
-               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llPackedSize);\r
+               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->nPackedSize);\r
        }\r
        else\r
        {\r
                fpProc = ::GetAPIAddress("GetArcCompressedSize", false);\r
                if (fpProc != NULL)\r
                {\r
-                       _aiInfo->llPackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
+                       _aiInfo->nPackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
                }\r
        }\r
 \r
        fpProc = ::GetAPIAddress("GetArcReadSizeEx", false);\r
        if (fpProc != NULL)\r
        {\r
-               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llReadSize);\r
+               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->nReadSize);\r
        }\r
        else\r
        {\r
                fpProc = ::GetAPIAddress("GetArcReadSize", false);\r
                if (fpProc != NULL)\r
                {\r
-                       _aiInfo->llReadSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
+                       _aiInfo->nReadSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
                }\r
        }\r
 \r
@@ -770,73 +803,74 @@ int __stdcall GetArchiveInformation
        fpProc = ::GetAPIAddress("GetArcOSType", false);\r
        if (fpProc != NULL)\r
        {\r
-               _aiInfo->uOSType = ((UINT (__stdcall *)(void *)) fpProc)(_hArchive);\r
+               _aiInfo->eOSType = ((UINT (__stdcall *)(void *)) fpProc)(_hArchive);\r
        }\r
 \r
        fpProc = ::GetAPIAddress("IsSFXFile", false);\r
-       if (fpProc != NULL)\r
-       {\r
-               _aiInfo->nSFXType = ((int (__stdcall *)(void *)) fpProc)(_hArchive);\r
-       }\r
-       if (fpProc == NULL || _aiInfo->nSFXType < 0)\r
-       {\r
-               // \83G\83\89\81[\82Ì\8fê\8d\87\82Í\82Æ\82è\82 \82¦\82¸\92Ê\8fí\82Ì\8f\91\8cÉ\82Æ\82Ý\82È\82·\81B\r
-               _aiInfo->nSFXType = 0;\r
-       }\r
+       _aiInfo->fSFX = fpProc != NULL && ((int (__stdcall *)(void *)) fpProc)(_hArchive) > 0;\r
+\r
+       // 形式に関する情報を取得。\r
+       MakeFormatInfo(wxT("calLibrary"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
 \r
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
 int __stdcall Command\r
 (\r
-       unsigned int _uCommand,\r
+       wxULongLong_t _eCommand,\r
        TPI_SWITCHES * _swInfo,\r
        const wxString & _szArcName,\r
        const wxArrayString & _szFiles\r
 )\r
 {\r
-       // Ini\82©\82ç\83R\83}\83\93\83h\83\89\83C\83\93\82ð\8eæ\93¾\81B\r
+       // xmlからコマンドラインを取得。\r
        wxString szPath, szCommandLine;\r
 \r
-       // API\83A\83h\83\8c\83X\8eæ\93¾\81B\r
-       FARPROC fpProc\r
-               = g_LibInfo.node.GetPropVal(\r
-                       _uCommand == TPI_COMMAND_ADD     ? wxT("add") :\r
-                       _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
-                       _uCommand == TPI_COMMAND_DELETE  ? wxT("delete") : \r
-                       _uCommand == TPI_COMMAND_UPDATE  ? wxT("update") : \r
-                       _uCommand == TPI_COMMAND_TEST    ? wxT("test") : \r
-                       _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair") : \r
-                       _uCommand == TPI_COMMAND_MOVE    ? wxT("move") : \r
-                       _uCommand == TPI_COMMAND_SFX     ? wxT("sfx") : \r
-                       _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx") : wxEmptyString, & szCommandLine)\r
-               ? ::GetAPIAddress("", true)\r
-               : g_LibInfo.node.GetPropVal(\r
-                       _uCommand == TPI_COMMAND_ADD     ? wxT("add-alt") :\r
-                       _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
-                       _uCommand == TPI_COMMAND_DELETE  ? wxT("delete-alt") : \r
-                       _uCommand == TPI_COMMAND_UPDATE  ? wxT("update-alt") : \r
-                       _uCommand == TPI_COMMAND_TEST    ? wxT("test-alt") : \r
-                       _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair-alt") : \r
-                       _uCommand == TPI_COMMAND_MOVE    ? wxT("move-alt") : \r
-                       _uCommand == TPI_COMMAND_SFX     ? wxT("sfx-alt") : \r
-                       _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine)\r
-               ? ::GetProcAddress(g_LibInfo.hLibAlt, g_LibInfo.szPrefixAlt.char_str()) : NULL;\r
-\r
+       // APIアドレス取得。\r
+       g_LibInfoAlt.fRunning\r
+               = g_LibInfo.node.GetAttribute(\r
+                       _eCommand == TPI_COMMAND_CREATE  ? wxT("create-alt") :\r
+                       _eCommand == TPI_COMMAND_ADD     ? wxT("add-alt") :\r
+                       _eCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
+                       _eCommand == TPI_COMMAND_DELETE  ? wxT("delete-alt") : \r
+                       _eCommand == TPI_COMMAND_UPDATE  ? wxT("update-alt") : \r
+                       _eCommand == TPI_COMMAND_TEST    ? wxT("test-alt") : \r
+                       _eCommand == TPI_COMMAND_REPAIR  ? wxT("repair-alt") : \r
+                       _eCommand == TPI_COMMAND_MOVE    ? wxT("move-alt") : \r
+                       _eCommand == TPI_COMMAND_SFX     ? wxT("sfx-alt") : \r
+                       _eCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine);\r
+       g_LibInfo.fRunning\r
+               = g_LibInfo.node.GetAttribute(\r
+                       _eCommand == TPI_COMMAND_CREATE  ? wxT("create") :\r
+                       _eCommand == TPI_COMMAND_ADD     ? wxT("add") :\r
+                       _eCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
+                       _eCommand == TPI_COMMAND_DELETE  ? wxT("delete") : \r
+                       _eCommand == TPI_COMMAND_UPDATE  ? wxT("update") : \r
+                       _eCommand == TPI_COMMAND_TEST    ? wxT("test") : \r
+                       _eCommand == TPI_COMMAND_REPAIR  ? wxT("repair") : \r
+                       _eCommand == TPI_COMMAND_MOVE    ? wxT("move") : \r
+                       _eCommand == TPI_COMMAND_SFX     ? wxT("sfx") : \r
+                       _eCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx") : wxEmptyString, & szCommandLine);\r
+\r
+       FARPROC fpProc =\r
+               g_LibInfo.fRunning    ? ::GetAPIAddress(   "", true) :\r
+               g_LibInfoAlt.fRunning ? ::GetAPIAddressAlt("", true) : NULL;\r
        if (fpProc == NULL || szCommandLine.IsEmpty())\r
        {\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
 \r
-       // \83R\83}\83\93\83h\83\89\83C\83\93\81E\83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dì\90¬\81B\r
+       // コマンドライン・レスポンスファイル作成。\r
        wxString\r
-               szResponceFileName = MakeResponceFile(_szFiles, g_LibInfo.node.GetPropVal(wxT("quote-resp"), wxT("1")) == wxT("1")),\r
+               szResponceFileName = g_LibInfo.fRunning ?\r
+                       MakeResponceFile(_szFiles, g_LibInfo.node.GetAttribute(   wxT("quote-resp"), wxT("1")) == wxT("1"), g_LibInfo.fUnicode) :\r
+                       MakeResponceFile(_szFiles, g_LibInfoAlt.node.GetAttribute(wxT("quote-resp"), wxT("1")) == wxT("1"), g_LibInfoAlt.fUnicode),\r
                szCommandLineSend  = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
 \r
-       // \83R\83}\83\93\83h\83\89\83C\83\93\8eÀ\8ds\81B\r
+       // コマンドライン実行。\r
        int nErrorCode;\r
        wxString szOutput;\r
-       if (g_LibInfo.fUnicode)\r
+       if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
        {\r
                wchar_t szTmpOut[2049];\r
                nErrorCode = ((int (__stdcall *)(const HWND, const wchar_t *, wchar_t *, DWORD)) fpProc)(NULL, szCommandLineSend.wchar_str(), szTmpOut, 2048);\r
@@ -845,22 +879,18 @@ int __stdcall Command
        else\r
        {\r
                char szTmpOut[2049];\r
-               nErrorCode = ((int (__stdcall *)(const HWND, const char *, char *, DWORD)) fpProc)(NULL, g_fExistUnicodeMode ? szCommandLineSend.ToUTF8() : szCommandLineSend.char_str(), szTmpOut, 2048);\r
-               szOutput = MB2String(szTmpOut);\r
+               nErrorCode = ((int (__stdcall *)(const HWND, const char *, char *, DWORD)) fpProc)(NULL, szCommandLineSend.ToUTF8(), szTmpOut, 2048);\r
+               szOutput = UTF82String(szTmpOut);\r
        }\r
 \r
-       // \83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dí\8f\9c\81B\r
+       // レスポンスファイル削除。\r
        ::wxRemoveFile(szResponceFileName);\r
 \r
        if (nErrorCode != 0)\r
        {\r
-#ifdef __LINUX__\r
-               ::wxMessageBox(wxString::Format(wxT("Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()));\r
-#else\r
-               MessageBox(NULL, wxString::Format(wxT("Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()), NULL, 0);\r
-#endif\r
+               wxLogError(L"Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s", nErrorCode, szCommandLineSend.c_str(), szOutput.c_str());\r
        }\r
-       return CalErrorCodeConvert(nErrorCode);\r
+       return ErrorCodeConvert(nErrorCode);\r
 }\r
 \r
 int __stdcall SetCallbackProc\r
@@ -868,34 +898,16 @@ int __stdcall SetCallbackProc
        TPI_PROC _prArcProc\r
 )\r
 {\r
-       // \83|\83C\83\93\83^\82ð\95Û\91\81B\r
+       // ポインタを保存。\r
        if (_prArcProc == NULL)\r
        {\r
                return TPI_ERROR_D_PARAMETER;\r
        }\r
        g_prProc = * _prArcProc;\r
-       g_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_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
-       return fResult ? TPI_ERROR_SUCCESS : TPI_ERROR_UNDEFINED;\r
+       // コールバック関数を設定。\r
+       CalSetCallbackProc(true);\r
+       return CalSetCallbackProc(false);\r
 }\r
 \r
 #ifdef __cplusplus\r