OSDN Git Service

コードを整理。
[tpi/lychee.git] / src / plugin / calLibrary / calLibrary.cpp
index 06b8668..673698b 100644 (file)
@@ -26,6 +26,7 @@
 #include "../../common/header/plugin.h"\r
 #include "../../common/header/plugin-extra.h"\r
 #include "../../common/library/library.h"\r
+#include "../../common/library/xmldoc.h"\r
 #include <wx/dynlib.h>\r
 #include <wx/config.h>\r
 #include <wx/stdpaths.h>\r
@@ -49,34 +50,141 @@ struct g_LibInfo
 }      g_LibInfo, g_LibInfoAlt;\r
 \r
 TPI_PROC g_prProc;\r
-bool g_fExistUnicodeMode;\r
 \r
 //******************************************************************************\r
-//    Entry\r
+//    Inline Functions\r
 //******************************************************************************\r
 \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
+#define MyConvEI322PI(EI, strconv) \\r
+       EI * ex = (EI *) _lpEis; \\r
+       \\r
+       piInfo.fiInfo.dwCRC32           = ex->dwCRC; \\r
+       piInfo.fiInfo.tmModify.SetFromDOS(MAKELONG(ex->wTime, ex->wDate)); \\r
+       piInfo.fiInfo.nPackedSize       = ex->dwCompressedSize; \\r
+       piInfo.fiInfo.nUnpackedSize     = ex->exinfo.dwFileSize; \\r
+       piInfo.fiInfo.eOSType           = ex->uOSType; \\r
+       piInfo.fiInfo.wCompressRatio    = ex->wRatio; \\r
+       piInfo.fiInfo.szStoredName      = strconv(ex->exinfo.szSourceFileName); \\r
+       piInfo.fiInfo.szMethod          = strconv(ex->szMode); \\r
+       \\r
+       piInfo.nProcessedSize           = ex->exinfo.dwWriteSize; \\r
+       piInfo.fnDestination            = wxFileName(strconv(ex->exinfo.szDestFileName));\r
+\r
+#define MyConvEI642PI(EI, strconv) \\r
+       EI * ex = (EI *) _lpEis; \\r
+       \\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.tmModify          = FileTimeToWxDateTime(& ex->ftWriteTime); \\r
+       piInfo.fiInfo.nPackedSize       = ex->llCompressedSize; \\r
+       piInfo.fiInfo.nUnpackedSize     = ex->llFileSize; \\r
+       piInfo.fiInfo.eOSType           = ex->uOSType; \\r
+       piInfo.fiInfo.wCompressRatio    = ex->wRatio; \\r
+       piInfo.fiInfo.szStoredName      = strconv(ex->exinfo.szSourceFileName); \\r
+       piInfo.fiInfo.szMethod          = strconv(ex->szMode); \\r
+       \\r
+       piInfo.nProcessedSize           = ex->llWriteSize; \\r
+       piInfo.fnDestination            = wxFileName(strconv(ex->exinfo.szDestFileName));\r
+\r
+#define MyConvEM322PI(EM, strconv) \\r
+       EM * ex = (EM *) _lpEis; \\r
+       if (ex->uCommand != COMMAND_EXTRACT) \\r
+       { \\r
+               return TRUE; \\r
+       } \\r
+       \\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.tmModify          = FileTimeToWxDateTime(& ex->ftWriteTime); \\r
+       piInfo.fiInfo.nPackedSize       = ex->dwCompressedSize; \\r
+       piInfo.fiInfo.nUnpackedSize     = ex->dwOriginalSize; \\r
+       piInfo.fiInfo.eOSType           = ex->uOSType; \\r
+       piInfo.fiInfo.wCompressRatio    = ex->wRatio; \\r
+       piInfo.fiInfo.szStoredName      = strconv(ex->szFileName); \\r
+       piInfo.fiInfo.fnFileName        = wxFileName(piInfo.fiInfo.szStoredName); \\r
+       \\r
+       piInfo.fnDestination            = wxFileName(strconv(ex->szAddFileName)); \\r
+       g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+\r
+#define MyConvEM642PI(EM, strconv) \\r
+       EM * ex = (EM *) _lpEis; \\r
+       if (ex->uCommand != COMMAND_EXTRACT) \\r
+       { \\r
+               return TRUE; \\r
+       } \\r
+       \\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.tmModify          = FileTimeToWxDateTime(& ex->ftWriteTime); \\r
+       piInfo.fiInfo.nPackedSize       = ex->llCompressedSize; \\r
+       piInfo.fiInfo.nUnpackedSize     = ex->llOriginalSize; \\r
+       piInfo.fiInfo.eOSType           = ex->uOSType; \\r
+       piInfo.fiInfo.wCompressRatio    = ex->wRatio; \\r
+       piInfo.fiInfo.szStoredName      = strconv(ex->szFileName); \\r
+       piInfo.fiInfo.fnFileName        = wxFileName(piInfo.fiInfo.szStoredName); \\r
+       \\r
+       piInfo.fnDestination            = wxFileName(strconv(ex->szAddFileName)); \\r
+       g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+\r
+#define MySetArcSize(api_base, var) \\r
+       fpProc = ::GetAPIAddress(#api_base L"Ex", false); \\r
+       if (fpProc != NULL) \\r
+       { \\r
+               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->var); \\r
+       } \\r
+       else \\r
+       { \\r
+               fpProc = ::GetAPIAddress(#api_base, false); \\r
+               if (fpProc != NULL) \\r
+               { \\r
+                       _aiInfo->var = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive); \\r
+               } \\r
+       }\r
+\r
+#define MySetArcTime(api_base, var, ismod) \\r
+       fpProc = ::GetAPIAddress(#api_base L"64", false); \\r
+       if (fpProc != NULL) \\r
+       { \\r
+               ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, & ll); \\r
+               _aiInfo->var.Set((time_t) ll); \\r
+       } \\r
+       else \\r
+       { \\r
+               fpProc = ::GetAPIAddress(#api_base L"Ex", false); \\r
+               if (fpProc != NULL) \\r
+               { \\r
+                       ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft); \\r
+                       _aiInfo->var = FileTimeToWxDateTime(& ft); \\r
+               } \\r
+               else \\r
+               { \\r
+                       fpProc = ::GetAPIAddress(#api_base, false); \\r
+                       if (fpProc != NULL) \\r
+                       { \\r
+                               _aiInfo->var.Set((time_t) ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive)); \\r
+                       } \\r
+                       else \\r
+                       { \\r
+                               if (ismod) \\r
+                               { \\r
+                                       fpProc = ::GetAPIAddress("GetArcDate", false); \\r
+                                       WORD wDate = fpProc == NULL ? 0 : ((WORD (__stdcall *)(void *)) fpProc)(_hArchive); \\r
+                                       fpProc = ::GetAPIAddress("GetArcTime", false); \\r
+                                       WORD wTime = fpProc == NULL ? 0 : ((WORD (__stdcall *)(void *)) fpProc)(_hArchive); \\r
+                                       _aiInfo->var.SetFromDOS(MAKELONG(wTime, wDate)); \\r
+                               } \\r
+                       } \\r
+               } \\r
        }\r
-       return TRUE;\r
-}\r
 \r
-wxDateTime FileTimeToWxDateTime(FILETIME * pft)\r
-{\r
-       FILETIME ftLocal;\r
-       SYSTEMTIME st;\r
-       if (! ::FileTimeToLocalFileTime(pft, & ftLocal) || ! ::FileTimeToSystemTime(& ftLocal, & st))\r
-       {\r
-               return (time_t) 0;\r
-       }\r
-       wxDateTime dt(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);\r
-       return dt;\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
 //******************************************************************************\r
 //    Callback Wrapper\r
@@ -84,7 +192,8 @@ wxDateTime FileTimeToWxDateTime(FILETIME * pft)
 \r
 BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void * _lpEis)\r
 {\r
-       if (_uMsg != ::RegisterWindowMessage((const wchar_t *) WM_ARCEXTRACT))\r
+       static unsigned int uWM = ::RegisterWindowMessage(WM_ARCEXTRACT);\r
+       if (_uMsg != uWM)\r
        {\r
                // 独自仕様などに対する予備コード。\r
                return TRUE;\r
@@ -100,41 +209,13 @@ BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void
                {\r
                        if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
                        {\r
-                               // 初期化。\r
-                               EXTRACTINGINFOEXW * ex = (EXTRACTINGINFOEXW *) _lpEis;\r
-\r
-                               // EXTRACTINGINFOEXW -> TPI_FILEINFO変換。\r
-                               piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
-                               piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\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変換。\r
-                               piInfo.nProcessedSize           = ex->exinfo.dwWriteSize;\r
-                               piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
+                               MyConvEI322PI(EXTRACTINGINFOEXW, WC2String);\r
                        }\r
                        else\r
                        {\r
-                               // 初期化。\r
-                               EXTRACTINGINFOEX * ex = (EXTRACTINGINFOEX *) _lpEis;\r
-\r
-                               // EXTRACTINGINFOEX -> TPI_FILEINFO変換。\r
-                               piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
-                               piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\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      = UTF82String(ex->exinfo.szSourceFileName);\r
-                               piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
-\r
                                // EXTRACTINGINFOEX -> TPI_PROCESSINFO変換。\r
-                               piInfo.nProcessedSize           = ex->exinfo.dwWriteSize;\r
-                               piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
+                               MyConvEI322PI(EXTRACTINGINFOEX, UTF82String);\r
                        }\r
                        piInfo.fiInfo.dwAttribute       = 0;\r
                }\r
@@ -142,47 +223,13 @@ BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void
                {\r
                        if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
                        {\r
-                               // 初期化。\r
-                               EXTRACTINGINFOEX64W * ex = (EXTRACTINGINFOEX64W *) _lpEis;\r
-\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.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変換。\r
-                               piInfo.nProcessedSize           = ex->llWriteSize;\r
-                               piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
+                               // EXTRACTINGINFOEX64W -> TPI_PROCESSINFO変換。\r
+                               MyConvEI642PI(EXTRACTINGINFOEX64W, WC2String);\r
                        }\r
                        else\r
                        {\r
-                               // 初期化。\r
-                               EXTRACTINGINFOEX64 * ex = (EXTRACTINGINFOEX64 *) _lpEis;\r
-\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.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      = UTF82String(ex->exinfo.szSourceFileName);\r
-                               piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
-\r
                                // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO変換。\r
-                               piInfo.nProcessedSize           = ex->llWriteSize;\r
-                               piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
+                               MyConvEI642PI(EXTRACTINGINFOEX64, UTF82String);\r
                        }\r
                }\r
                piInfo.fiInfo.fnFileName        = wxFileName(piInfo.fiInfo.szStoredName);\r
@@ -234,13 +281,58 @@ BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void
        return g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CANCEL;\r
 }\r
 \r
+BOOL __stdcall EnumMembersProc(void * _lpEis)\r
+{\r
+       // 構造体を初期化。\r
+       TPI_PROCESSINFO piInfo;\r
+       piInfo.eMessage = TPI_MESSAGE_ASK;\r
+       piInfo.eStatus  = TPI_PARAM_DEST;\r
+       if (g_prProc == NULL)\r
+       {\r
+               return TRUE;\r
+       }\r
+\r
+       if (_lpEis != NULL)\r
+       {\r
+               if ((g_LibInfo.fRunning && g_LibInfo.fCallback32bit) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fCallback32bit))\r
+               {\r
+                       if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
+                       {\r
+                               // ENUM_MEMBER_INFOW -> TPI_FILEINFO変換。\r
+                               MyConvEM322PI(ENUM_MEMBER_INFOW, WC2String);\r
+                               wcsncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().c_str(), FNAME_MAX32);\r
+                       }\r
+                       else\r
+                       {\r
+                               // ENUM_MEMBER_INFO -> TPI_FILEINFO変換。\r
+                               MyConvEM322PI(ENUM_MEMBER_INFO, UTF82String);\r
+                               strncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().ToUTF8(), FNAME_MAX32);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
+                       {\r
+                               // ENUM_MEMBER_INFO64W -> TPI_FILEINFO変換。\r
+                               MyConvEM642PI(ENUM_MEMBER_INFO64W, WC2String);\r
+                               wcsncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().c_str(), FNAME_MAX32);\r
+                       }\r
+                       else\r
+                       {\r
+                               // ENUM_MEMBER_INFO64 -> TPI_FILEINFO変換。\r
+                               MyConvEM642PI(ENUM_MEMBER_INFO64, UTF82String);\r
+                               strncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().ToUTF8(), FNAME_MAX32);\r
+                       }\r
+               }\r
+       }\r
+\r
+       return piInfo.fnDestination.IsOk();\r
+}\r
+\r
 //******************************************************************************\r
 //    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 ErrorCodeConvert(int nErrorCode)\r
 {\r
        switch (nErrorCode)\r
@@ -375,9 +467,62 @@ int CalSetCallbackProc(bool fAlt)
                }\r
        }\r
 \r
-       return (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
+       if (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
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+\r
+       // EnumMembersProc系。\r
+       if (fAlt)\r
+       {\r
+               fpProc = ::GetAPIAddressAlt("ClearEnumMembersProc64", false);\r
+               g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfoAlt.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddressAlt("ClearEnumMembersProc", false);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               fpProc = ::GetAPIAddress("ClearEnumMembersProc64", false);\r
+               g_LibInfo.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfo.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddress("ClearEnumMembersProc", false);\r
+               }\r
+       }\r
+       if (fpProc == NULL)\r
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+       // エラーでも無視する。\r
+//     ((BOOL (__stdcall *)(void)) fpProc)();\r
+\r
+       // 続いて設定。\r
+       if (fAlt)\r
+       {\r
+               fpProc = ::GetAPIAddressAlt("SetEnumMembersProc64", false);\r
+               g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfoAlt.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddressAlt("SetEnumMembersProc", true);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               fpProc = ::GetAPIAddress("SetEnumMembersProc64", false);\r
+               g_LibInfo.fCallback32bit = fpProc == NULL;\r
+               if (g_LibInfo.fCallback32bit)\r
+               {\r
+                       fpProc = ::GetAPIAddress("SetEnumMembersProc", true);\r
+               }\r
+       }\r
+\r
+       return (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
+               ? ((BOOL (__stdcall *)(WND_ENUMMEMBPROC *       )) fpProc)((WND_ENUMMEMBPROC *) EnumMembersProc)\r
+               : ((BOOL (__stdcall *)(WND_ENUMMEMBPROC *, DWORD)) fpProc)((WND_ENUMMEMBPROC *) EnumMembersProc, (fAlt ? g_LibInfoAlt.fUnicode : g_LibInfo.fUnicode) ? sizeof(ENUM_MEMBER_INFO64W) : sizeof(ENUM_MEMBER_INFO))))\r
                ? TPI_ERROR_U_USE_LIBRARY : TPI_ERROR_SUCCESS;\r
 }\r
 \r
@@ -419,114 +564,123 @@ int __stdcall GetPluginInformation
 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
+       static wxXmlDocument xmlDoc(myMakeXMLName(wxT("calLibrary")));\r
+       static wxXmlNode * xmlLibrary;\r
        if (_bFirst)\r
        {\r
                // xml解析開始。\r
                s_nFileId = 0;\r
+               xmlLibrary = myGetFirstLib(& xmlDoc);\r
        }\r
        else\r
        {\r
-               for (wxULongLong_t i = 0; i < s_nFileId && xmlLibrary != NULL; i++)\r
-               {\r
-                       xmlLibrary = xmlLibrary->GetNext();\r
-               }\r
+               xmlLibrary = myGetNextLib(xmlLibrary);\r
        }\r
-\r
-       if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
+       if (xmlLibrary == NULL)\r
        {\r
                // データの終端に達した場合。\r
                return TPI_ERROR_S_ENDOFDATA;\r
        }\r
 \r
-       MakeFormatInfo(wxT("calLibrary"), _fiInfo, xmlLibrary, s_nFileId++);\r
-\r
+       MakeFormatInfo(xmlLibrary, wxT("calLibrary"), _fiInfo, s_nFileId++);\r
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
 int __stdcall LoadPlugin\r
 (\r
        const wxString & _szArcName,\r
-       wxULongLong_t _llTypeId\r
+       TPI_PROC _prProc,\r
+       wxULongLong_t _nTypeId\r
 )\r
 {\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
-       // 一気に先頭のライブラリの情報を取得。\r
-       wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
+       wxXmlDocument xmlDoc(myMakeXMLName(wxT("calLibrary")));\r
+       wxXmlNode * xmlLibrary;\r
 \r
        // 対象が存在するならば対応するライブラリを調査、\r
        // 対象が存在しないならば指示されたライブラリをロード。\r
+       ::RemoveCwdFromSearchPath();\r
        if (! ::wxFileExists(_szArcName))\r
        {\r
-               // 適当な位置まで移動。\r
-               for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < _llTypeId && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
-               {\r
-                       xmlLibrary = xmlLibrary->GetNext();\r
-               }\r
-               if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
+               xmlLibrary = myGetFirstLib(& xmlDoc, _nTypeId);\r
+               if (xmlLibrary == NULL)\r
                {\r
                        // xml文法エラー。\r
                        return TPI_ERROR_UNDEFINED;\r
                }\r
-               g_LibInfo.node = * xmlLibrary;\r
 \r
                // ライブラリをロード。\r
-               g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
+               g_LibInfo.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name"), wxEmptyString).wchar_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.szPrefix = xmlLibrary->GetAttribute(wxT("prefix"), wxEmptyString);\r
+               g_LibInfo.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode"));\r
+               g_LibInfo.node = * xmlLibrary;\r
+               g_LibInfo.nLibIndex = _nTypeId;\r
 \r
                // 代替ライブラリもロード。ロードできなくてもエラーにはしない。\r
-               g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
-               g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
-               g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
+               g_LibInfoAlt.szPrefix = xmlLibrary->GetAttribute(wxT("prefix-alt"), wxEmptyString);\r
+               g_LibInfoAlt.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode-alt"));\r
+               g_LibInfoAlt.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString).wchar_str());\r
 \r
+               // コールバック関数を設定。\r
+               if (_prProc != NULL)\r
+               {\r
+                       g_prProc = * _prProc;\r
+                       CalSetCallbackProc(true);\r
+                       CalSetCallbackProc(false);\r
+               }\r
                return TPI_ERROR_SUCCESS;\r
        }\r
 \r
        // 無限ループに陥らないよう上限を設定。\r
+       xmlLibrary = myGetFirstLib(& xmlDoc);\r
        for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
        {\r
                // ライブラリをロード。\r
-               g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
+               g_LibInfo.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name"), wxEmptyString).wchar_str());\r
                if (g_LibInfo.hLib == NULL)\r
                {\r
-                       xmlLibrary = xmlLibrary->GetNext();\r
+                       xmlLibrary = myGetNextLib(xmlLibrary);\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.szPrefix = xmlLibrary->GetAttribute(wxT("prefix"), wxEmptyString);\r
+               g_LibInfo.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode"));\r
+               g_LibInfo.node = * xmlLibrary;\r
 \r
                // 代替ライブラリもロード。ロードできなくてもエラーにはしない。\r
-               g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
-               g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
-               g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
-               g_LibInfo.node = * xmlLibrary;\r
+               g_LibInfoAlt.szPrefix = xmlLibrary->GetAttribute(wxT("prefix-alt"), wxEmptyString);\r
+               g_LibInfoAlt.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode-alt"));\r
+               g_LibInfoAlt.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString).wchar_str());\r
+\r
+               // Unicodeモードに設定。\r
+               FARPROC fpProc = ::GetAPIAddress("SetUnicodeMode", false);\r
+               if (fpProc != NULL)\r
+               {\r
+                       ((BOOL (__stdcall *)(BOOL)) fpProc)(TRUE);\r
+               }\r
 \r
                // 書庫に対応しているかチェック。\r
-               if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
+               fpProc = ::GetAPIAddress("CheckArchive", true);\r
+               if (fpProc != NULL && (g_LibInfo.fUnicode\r
+                               ? ((BOOL (__stdcall *)(const wchar_t *, const int)) fpProc)(_szArcName.wchar_str(), 0)\r
+                               : ((BOOL (__stdcall *)(const char    *, const int)) fpProc)(_szArcName.ToUTF8(),    0)))\r
                {\r
-                       // 対応していれば処理を終了。\r
+                       // コールバック関数を設定。\r
+                       if (_prProc != NULL)\r
+                       {\r
+                               g_prProc = * _prProc;\r
+                               CalSetCallbackProc(true);\r
+                               CalSetCallbackProc(false);\r
+                       }\r
                        return TPI_ERROR_SUCCESS;\r
                }\r
-\r
                ::FreeLibrary(g_LibInfo.hLib);\r
-               xmlLibrary = xmlLibrary->GetNext();\r
+               ::FreeLibrary(g_LibInfoAlt.hLib);\r
+               xmlLibrary = myGetNextLib(xmlLibrary);\r
        }\r
-\r
        return TPI_ERROR_U_LOAD_LIBRARY;\r
 }\r
 \r
@@ -540,62 +694,28 @@ int __stdcall FreePlugin
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
-int __stdcall CheckArchive\r
+int __stdcall OpenArchive\r
 (\r
        const wxString & _szArcName,\r
-       wxULongLong_t * _llFileCount\r
+       void * * _hArchive,\r
+       wxULongLong_t * _nFileCount\r
 )\r
 {\r
-       // Unicodeモードに設定。\r
-       FARPROC fpProc = ::GetAPIAddress("SetUnicodeMode", false);\r
-       g_fExistUnicodeMode = fpProc != NULL;\r
-       if (g_fExistUnicodeMode)\r
-       {\r
-               ((BOOL (__stdcall *)(BOOL)) fpProc)(TRUE);\r
-       }\r
-\r
-       fpProc = ::GetAPIAddress("CheckArchive", true);\r
-       if (fpProc == NULL)\r
-       {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
-       }\r
-\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)(_szArcName.ToUTF8(),    0)\r
-       ))\r
-       {\r
-               return TPI_ERROR_D_UNSUPPORTED;\r
-       }\r
-\r
-       if (_llFileCount != NULL)\r
+       // ファイル数を取得。\r
+       FARPROC fpProc;\r
+       if (_nFileCount != NULL)\r
        {\r
                fpProc = ::GetAPIAddress("GetFileCount", true);\r
-               if (fpProc == NULL)\r
-               {\r
-                       return TPI_ERROR_U_USE_LIBRARY;\r
-               }\r
-\r
-               int nFileCount = g_LibInfo.fUnicode\r
-                       ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
-                       : ((int (__stdcall *)(const char *)) fpProc)(_szArcName.ToUTF8());\r
-               if (nFileCount == -1)\r
+               if (fpProc != NULL)\r
                {\r
-                       return TPI_ERROR_ARC_UNSUPPORTED;\r
+                       int n = g_LibInfo.fUnicode\r
+                               ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
+                               : ((int (__stdcall *)(const char    *)) fpProc)(_szArcName.ToUTF8());\r
+                       * _nFileCount = n < 0 ? 0 : n;\r
                }\r
-               * _llFileCount = nFileCount;\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
@@ -624,7 +744,7 @@ int __stdcall GetFileInformation
 )\r
 {\r
        static wxULongLong_t s_nFileId;\r
-       static FARPROC fpNext, fpAttr;\r
+       static FARPROC fpNext, fpAttr, fpName;\r
        int nErrorCode;\r
        INDIVIDUALINFO iiInfo;\r
        INDIVIDUALINFOW iiInfoW;\r
@@ -637,6 +757,7 @@ int __stdcall GetFileInformation
                FARPROC fpProc = ::GetAPIAddress("FindFirst", true);\r
                fpNext = ::GetAPIAddress("FindNext", true);\r
                fpAttr = ::GetAPIAddress("GetAttribute", false);\r
+               fpName = ::GetAPIAddress("GetFileName", true);\r
                if (fpProc == NULL)\r
                {\r
                        return TPI_ERROR_U_USE_LIBRARY;\r
@@ -662,7 +783,7 @@ int __stdcall GetFileInformation
        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
@@ -670,22 +791,34 @@ int __stdcall GetFileInformation
                if (g_LibInfo.fUnicode)\r
                {\r
                        _fiInfo->dwCRC32        = iiInfoW.dwCRC;\r
-                       _fiInfo->eOSType        = iiInfoW.eOSType;\r
+                       _fiInfo->eOSType        = iiInfoW.uOSType;\r
                        _fiInfo->nPackedSize    = iiInfoW.dwCompressedSize;\r
                        _fiInfo->nUnpackedSize  = iiInfoW.dwOriginalSize;\r
-                       _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfoW.wTime, iiInfoW.wDate));\r
+                       _fiInfo->tmModify.SetFromDOS(MAKELONG(iiInfoW.wTime, iiInfoW.wDate));\r
                        _fiInfo->szStoredName   = WC2String(iiInfoW.szFileName);\r
+                       if (wcslen(iiInfoW.szFileName) >= 510 && fpName)\r
+                       {\r
+                               ((int (__stdcall *)(void *, wchar_t *, const int)) fpName)(_hArchive, wxStringBuffer(_fiInfo->szStoredName, 32769), 32768);\r
+                       }\r
                        _fiInfo->szMethod       = WC2String(iiInfoW.szMode);\r
                        _fiInfo->wCompressRatio = iiInfoW.wRatio;\r
                }\r
                else\r
                {\r
                        _fiInfo->dwCRC32        = iiInfo.dwCRC;\r
-                       _fiInfo->eOSType        = iiInfo.eOSType;\r
+                       _fiInfo->eOSType        = iiInfo.uOSType;\r
                        _fiInfo->nPackedSize    = iiInfo.dwCompressedSize;\r
                        _fiInfo->nUnpackedSize  = iiInfo.dwOriginalSize;\r
-                       _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfo.wTime, iiInfo.wDate));\r
+                       _fiInfo->tmModify.SetFromDOS(MAKELONG(iiInfo.wTime, iiInfo.wDate));\r
                        _fiInfo->szStoredName   = UTF82String(iiInfo.szFileName);\r
+                       if (strlen(iiInfo.szFileName) >= 510 && fpName)\r
+                       {\r
+                               char * sz = (char *) malloc(32769);\r
+                               memset(sz, 0, 32769);\r
+                               ((int (__stdcall *)(void *, char *, const int)) fpName)(_hArchive, sz, 32768);\r
+                               _fiInfo->szStoredName = UTF82String(sz);\r
+                               free(sz);\r
+                       }\r
                        _fiInfo->szMethod       = UTF82String(iiInfo.szMode);\r
                        _fiInfo->wCompressRatio = iiInfo.wRatio;\r
                }\r
@@ -726,88 +859,31 @@ int __stdcall GetArchiveInformation
                _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->nFileSize);\r
-       }\r
-       else\r
-       {\r
-               fpProc = ::GetAPIAddress("GetArcFileSize", false);\r
-               if (fpProc != NULL)\r
-               {\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->nUnpackedSize);\r
-       }\r
-       else\r
-       {\r
-               fpProc = ::GetAPIAddress("GetArcOriginalSize", false);\r
-               if (fpProc != NULL)\r
-               {\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->nPackedSize);\r
-       }\r
-       else\r
+       wxLongLong_t ll = 0;\r
+       MySetArcSize(GetArcFileSize,       nFileSize);\r
+       MySetArcSize(GetArcOriginalSize,   nUnpackedSize);\r
+       MySetArcSize(GetArcCompressedSize, nPackedSize);\r
+       MySetArcSize(GetArcReadSize,       nReadSize);\r
+       if (_aiInfo->nPackedSize == (DWORD) -1)\r
        {\r
-               fpProc = ::GetAPIAddress("GetArcCompressedSize", false);\r
-               if (fpProc != NULL)\r
-               {\r
-                       _aiInfo->nPackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
-               }\r
+               // 圧縮後サイズの取得に対応していない場合、書庫のサイズで代替。\r
+               _aiInfo->nPackedSize = _aiInfo->nFileSize;\r
        }\r
 \r
-       fpProc = ::GetAPIAddress("GetArcReadSizeEx", false);\r
-       if (fpProc != NULL)\r
-       {\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->nReadSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
-               }\r
-       }\r
+       FILETIME ft;\r
+       MySetArcTime(GetArcAccessTime, tmAccess, false);\r
+       MySetArcTime(GetArcCreateTime, tmCreate, false);\r
+       MySetArcTime(GetArcWriteTime,  tmModify, true);\r
 \r
        fpProc = ::GetAPIAddress("GetArcRatio", false);\r
        if (fpProc != NULL)\r
        {\r
                _aiInfo->wCompressRatio = ((WORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
-       }\r
-\r
-       FILETIME ft;\r
-       fpProc = ::GetAPIAddress("GetArcAccessTimeEx", false);\r
-       if (fpProc != NULL)\r
-       {\r
-               ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
-               _aiInfo->tmAccess = FileTimeToWxDateTime(& ft);\r
-       }\r
-\r
-       fpProc = ::GetAPIAddress("GetArcCreatedTimeEx", false);\r
-       if (fpProc != NULL)\r
-       {\r
-               ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
-               _aiInfo->tmCreate = FileTimeToWxDateTime(& ft);\r
-       }\r
-\r
-       fpProc = ::GetAPIAddress("GetArcWriteTimeEx", false);\r
-       if (fpProc != NULL)\r
-       {\r
-               ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
-               _aiInfo->tmModified = FileTimeToWxDateTime(& ft);\r
+               if (_aiInfo->wCompressRatio == (WORD) -1)\r
+               {\r
+                       // エラーなら0にしておく。\r
+                       _aiInfo->wCompressRatio = 0;\r
+               }\r
        }\r
 \r
        fpProc = ::GetAPIAddress("GetArcOSType", false);\r
@@ -817,10 +893,10 @@ int __stdcall GetArchiveInformation
        }\r
 \r
        fpProc = ::GetAPIAddress("IsSFXFile", false);\r
-       _aiInfo->fSFX = fpProc != NULL && ((int (__stdcall *)(void *)) fpProc)(_hArchive) != 0;\r
+       _aiInfo->fSFX = fpProc != NULL && ((int (__stdcall *)(void *)) fpProc)(_hArchive) > 0;\r
 \r
        // 形式に関する情報を取得。\r
-       MakeFormatInfo(wxT("calLibrary"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
+       MakeFormatInfo(& g_LibInfo.node, wxT("calLibrary"), & _aiInfo->fiInfo, 0);\r
 \r
        return TPI_ERROR_SUCCESS;\r
 }\r
@@ -833,12 +909,12 @@ int __stdcall Command
        const wxArrayString & _szFiles\r
 )\r
 {\r
-       // Iniからコマンドラインを取得。\r
+       // xmlからコマンドラインを取得。\r
        wxString szPath, szCommandLine;\r
 \r
        // APIアドレス取得。\r
        g_LibInfoAlt.fRunning\r
-               = g_LibInfo.node.GetPropVal(\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
@@ -850,7 +926,7 @@ int __stdcall Command
                        _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.GetPropVal(\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
@@ -872,7 +948,9 @@ int __stdcall Command
 \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, myGetAttributeBool(& g_LibInfo.node,    wxT("quote-resp"), true), g_LibInfo.fUnicode) :\r
+                       MakeResponceFile(_szFiles, myGetAttributeBool(& g_LibInfoAlt.node, wxT("quote-resp"), true), g_LibInfoAlt.fUnicode),\r
                szCommandLineSend  = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
 \r
        // コマンドライン実行。\r
@@ -896,28 +974,11 @@ int __stdcall Command
 \r
        if (nErrorCode != 0)\r
        {\r
-               ::wxLogError(L"Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s", nErrorCode, szCommandLineSend.c_str(), szOutput.c_str());\r
+               wxLogError(L"Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s", nErrorCode, szCommandLineSend.c_str(), szOutput.c_str());\r
        }\r
        return ErrorCodeConvert(nErrorCode);\r
 }\r
 \r
-int __stdcall SetCallbackProc\r
-(\r
-       TPI_PROC _prArcProc\r
-)\r
-{\r
-       // ポインタを保存。\r
-       if (_prArcProc == NULL)\r
-       {\r
-               return TPI_ERROR_D_PARAMETER;\r
-       }\r
-       g_prProc = * _prArcProc;\r
-\r
-       // コールバック関数を設定。\r
-       CalSetCallbackProc(true);\r
-       return CalSetCallbackProc(false);\r
-}\r
-\r
 #ifdef __cplusplus\r
 }\r
 #endif\r