OSDN Git Service

C++11のauto, nullptrを導入。
[tpi/lychee.git] / src / plugin / eggArc / eggArc.cpp
index 992a92c..a1dd8bf 100644 (file)
@@ -39,72 +39,154 @@ TPI_SWITCHES * g_swInfo;
 const wxArrayString * g_asFiles;\r
 \r
 //******************************************************************************\r
+//    Inside Functions\r
+//******************************************************************************\r
+\r
+#define GetAPIAddress(name) GetProcAddress(g_hLib, "EGG_" name)\r
+\r
+int ErrorCodeConvert(int nErrorCode)\r
+{\r
+       switch (nErrorCode)\r
+       {\r
+       case EGG_ERROR_FAIL:        return TPI_ERROR_UNDEFINED;\r
+       case EGG_ERROR_SUCCESS:     return TPI_ERROR_SUCCESS;\r
+       case EGG_ERROR_SKIP:        return TPI_ERROR_D_SKIPPED;\r
+       case EGG_ERROR_CANCEL:      return TPI_ERROR_D_SKIPPED;\r
+       case EGG_ERROR_IO:          return TPI_ERROR_IO_MISC;\r
+       case EGG_ERROR_TYPEMISMATCH:return TPI_ERROR_ARC_UNSUPPORTED;\r
+       case EGG_ERROR_FILE:        return TPI_ERROR_IO_MISC;\r
+       case EGG_ERROR_FORMAT:      return TPI_ERROR_IO_ARC_MISC;\r
+       case EGG_ERROR_ALGORITHM:   return TPI_ERROR_UNDEFINED;\r
+       default:                    return TPI_ERROR_UNDEFINED;\r
+       }\r
+}\r
+\r
+int __stdcall GetFileInformation2\r
+(\r
+       void * _hArchive,\r
+       TPI_FILEINFO * _fiInfo,\r
+       wxULongLong_t _nIndex\r
+)\r
+{\r
+       static FARPROC fpProc = ::GetAPIAddress("GetFileHeader");\r
+       if (fpProc == nullptr)\r
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+\r
+       EGGFileHeader fhInfo;\r
+       int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t, EGGFileHeader *)) fpProc)(_hArchive, _nIndex, & fhInfo));\r
+       if (nErrorCode == TPI_ERROR_SUCCESS)\r
+       {\r
+               _fiInfo->dwAttribute    = fhInfo.attribute;\r
+               if (fhInfo.encrypted)\r
+               {\r
+                       _fiInfo->dwAttribute |= TPI_ATTRIBUTE_ENCRYPTED;\r
+               }\r
+               _fiInfo->dwCRC32        = fhInfo.crc;\r
+               _fiInfo->nPackedSize    = fhInfo.packedSize;\r
+               _fiInfo->nUnpackedSize  = fhInfo.unpackedSize;\r
+               _fiInfo->tmModify       = fhInfo.lastModified;\r
+               _fiInfo->szComment      = WC2String(fhInfo.comment);\r
+               _fiInfo->szStoredName   = WC2String(fhInfo.fileName);\r
+               _fiInfo->szMethod       = fhInfo.method == 2 ? wxT("ALZ") : fhInfo.method == 0 ? wxT("EGG") : wxT("unknown");\r
+               _fiInfo->nFileId        = _nIndex;\r
+               _fiInfo->fnFileName     = wxFileName(_fiInfo->szStoredName);\r
+       }\r
+\r
+       return nErrorCode;\r
+}\r
+\r
+//******************************************************************************\r
 //    Callback Wrapper\r
 //******************************************************************************\r
 \r
 UINT __cdecl CallbackProc(void * user, UINT code, void* param)\r
 {\r
-       // \8d\\91¢\91Ì\82ð\8f\89\8aú\89»\81B\r
+       // 構造体を初期化。\r
        static TPI_PROCESSINFO piInfo;\r
-       piInfo.uMessage = TPI_MESSAGE_STATUS;\r
+       piInfo.eMessage = TPI_MESSAGE_STATUS;\r
 \r
        switch (code)\r
        {\r
        case eggevent::Start::CODE:\r
-               piInfo.uStatus = TPI_STATUS_OPENARCHIVE;\r
+               piInfo.eStatus = TPI_STATUS_OPENARCHIVE;\r
                break;\r
        case eggevent::Extract::CODE:\r
        {\r
-               // \93W\8aJ\82·\82é\82©\82Ç\82¤\82©\94»\92f\81B\r
-               // TODO : \83A\83v\83\8a\83P\81[\83V\83\87\83\93\91¤\82Ö\81B\r
+               // 対象ファイルか確認。\r
                eggevent::Extract * p = (eggevent::Extract *) param;\r
-               wxString szFileName = WC2String(p->nameInArchive);\r
-               if (g_asFiles->Count() != 0 && g_asFiles->Index(szFileName) == wxNOT_FOUND)\r
+               GetFileInformation2(* (void **) user, & piInfo.fiInfo, p->index);\r
+               if (g_asFiles->Count() != 0 && g_asFiles->Index(piInfo.fiInfo.szStoredName) == wxNOT_FOUND)\r
                {\r
                        return EGG_ERROR_SKIP;\r
                }\r
 \r
-               // \93W\8aJ\82·\82é\81B\r
-               wcsncpy(p->fileName, (g_swInfo->fnDestinationDirectory.GetPathWithSep() + (g_swInfo->fStoreDirectoryPathes ? szFileName : wxFileName(szFileName).GetFullName())).wchar_str(), MAX_PATH - 1);\r
+               // 処理するかどうか確認。\r
+               piInfo.eMessage = TPI_MESSAGE_ASK;\r
+               piInfo.eStatus  = TPI_PARAM_DEST;\r
+               piInfo.fnDestination = wxFileName(g_swInfo->fnDestinationDirectory.GetPathWithSep() + (g_swInfo->fStoreDirectoryPathes ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetFullName()));\r
+               if (g_prProc != nullptr && g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CONTINUE)\r
+               {\r
+                       return EGG_ERROR_CANCEL;\r
+               }\r
+               if (! piInfo.fnDestination.IsOk())\r
+               {\r
+                       return EGG_ERROR_SKIP;\r
+               }\r
+\r
+               // 展開する。\r
+               wcsncpy(p->fileName, piInfo.fnDestination.GetFullPath().wchar_str(), MAX_PATH - 1);\r
+               return EGG_ERROR_SUCCESS;\r
+       }\r
+       case eggevent::Test::CODE:\r
+       {\r
+               // 対象ファイルか確認。\r
+               eggevent::Test * p = (eggevent::Test *) param;\r
+               GetFileInformation2(* (void **) user, & piInfo.fiInfo, p->index);\r
+               if (g_asFiles->Count() != 0 && g_asFiles->Index(piInfo.fiInfo.szStoredName) == wxNOT_FOUND)\r
+               {\r
+                       p->skipThisFile = true;\r
+                       return EGG_ERROR_SKIP;\r
+               }\r
                return EGG_ERROR_SUCCESS;\r
        }\r
        case eggevent::ActivityStart::CODE:\r
-               piInfo.uStatus = TPI_STATUS_BEGINPROCESS;\r
-               GetFileInformation(* (void **) user, & piInfo.fiInfo, ((eggevent::ActivityStart *) param)->index == 0);\r
+               piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
+               GetFileInformation2(* (void **) user, & piInfo.fiInfo, ((eggevent::ActivityStart *) param)->index);\r
                break;\r
        case eggevent::Progress::CODE:\r
-               piInfo.uStatus = TPI_STATUS_INPROCESS;\r
-               piInfo.llProcessedSize = ((eggevent::Progress *) param)->current * (piInfo.fiInfo.llUnpackedSize.ToULong() / 10000);\r
+               piInfo.eStatus = TPI_STATUS_INPROCESS;\r
+               piInfo.nProcessedSize = ((eggevent::Progress *) param)->current * (piInfo.fiInfo.nUnpackedSize / 10000);\r
                break;\r
        case eggevent::ActivityFinish::CODE:\r
-               piInfo.uStatus = TPI_STATUS_ENDPROCESS;\r
+               piInfo.eStatus = TPI_STATUS_ENDPROCESS;\r
                break;\r
        case eggevent::Finish::CODE:\r
-               piInfo.uStatus = TPI_STATUS_CLOSEARCHIVE;\r
+               piInfo.eStatus = TPI_STATUS_CLOSEARCHIVE;\r
                break;\r
        case eggevent::QueryPassword::CODE:\r
        {\r
-               // \83p\83X\83\8f\81[\83h\96â\82¢\8d\87\82í\82¹\81B\r
-               // TODO : \8cÂ\95Ê\83t\83@\83C\83\8b\82É\91Î\82·\82é\96â\82¢\8d\87\82í\82¹\82Ì\8eÀ\91\95\81B\r
-               piInfo.uMessage = TPI_MESSAGE_ASK;\r
-               piInfo.uStatus  = TPI_PARAM_PASSWORD;\r
+               // パスワード問い合わせ。\r
+               piInfo.eMessage = TPI_MESSAGE_ASK;\r
+               piInfo.eStatus  = TPI_PARAM_PASSWORD;\r
 \r
-               // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82É\91\97\90M\81B\r
+               // コールバック関数に送信。\r
                eggevent::QueryPassword * p = (eggevent::QueryPassword *) param;\r
-               // \8f\89\89ñ\82Í\8aù\92è\82Ì\83p\83X\83\8f\81[\83h\82ð\8e\8e\82·\81B\r
+               // 初回は既定のパスワードを試す。\r
                if (p->queryCount == 1)\r
                {\r
                        wcsncpy(p->password, g_swInfo->szPassword.wchar_str(), 1024 - 1);\r
                        return EGG_ERROR_SUCCESS;\r
                }\r
 \r
-               // 2\89ñ\96Ú\88È\8d~\82Í\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82É\91\97\90M\82·\82é\81B\r
-               if (g_prProc == NULL || g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CONTINUE)\r
+               // 2回目以降はコールバック関数に送信する。\r
+               if (g_prProc == nullptr || g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CONTINUE)\r
                {\r
                        return EGG_ERROR_CANCEL;\r
                }\r
 \r
-               // \8aù\92è\82Ì\83p\83X\83\8f\81[\83h\82à\95Ï\8dX\82µ\82Ä\82¨\82­\81B\r
+               // 既定のパスワードも変更しておく。\r
                g_swInfo->szPassword = piInfo.szParam;\r
                wcsncpy(p->password, piInfo.szParam.wchar_str(), 1024 - 1);\r
                return EGG_ERROR_SUCCESS;\r
@@ -113,8 +195,8 @@ UINT __cdecl CallbackProc(void * user, UINT code, void* param)
                return EGG_ERROR_SUCCESS;\r
        }\r
 \r
-       // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82É\91\97\90M\81B\r
-       if (g_prProc == NULL)\r
+       // コールバック関数に送信。\r
+       if (g_prProc == nullptr)\r
        {\r
                return EGG_ERROR_SUCCESS;\r
        }\r
@@ -123,29 +205,6 @@ UINT __cdecl CallbackProc(void * user, UINT code, void* param)
 }\r
 \r
 //******************************************************************************\r
-//    Inside Functions\r
-//******************************************************************************\r
-\r
-#define GetAPIAddress(name) GetProcAddress(g_hLib, "EGG_" name)\r
-\r
-int ErrorCodeConvert(int nErrorCode)\r
-{\r
-       switch (nErrorCode)\r
-       {\r
-       case EGG_ERROR_FAIL:        return TPI_ERROR_UNDEFINED;\r
-       case EGG_ERROR_SUCCESS:     return TPI_ERROR_SUCCESS;\r
-       case EGG_ERROR_SKIP:        return TPI_ERROR_D_SKIPPED;\r
-       case EGG_ERROR_CANCEL:      return TPI_ERROR_D_SKIPPED;\r
-       case EGG_ERROR_IO:          return TPI_ERROR_IO_MISC;\r
-       case EGG_ERROR_TYPEMISMATCH:return TPI_ERROR_ARC_UNSUPPORTED;\r
-       case EGG_ERROR_FILE:        return TPI_ERROR_IO_MISC;\r
-       case EGG_ERROR_FORMAT:      return TPI_ERROR_IO_ARC_MISC;\r
-       case EGG_ERROR_ALGORITHM:   return TPI_ERROR_UNDEFINED;\r
-       default:                    return TPI_ERROR_UNDEFINED;\r
-       }\r
-}\r
-\r
-//******************************************************************************\r
 //    Functions\r
 //******************************************************************************\r
 \r
@@ -157,11 +216,11 @@ extern "C"
 int __stdcall GetPluginInformation\r
 (\r
        unsigned int _uInfoId,\r
-       wxULongLong,\r
+       wxULongLong_t,\r
        void * _pPtr\r
 )\r
 {\r
-       if (_pPtr == NULL)\r
+       if (_pPtr == nullptr)\r
        {\r
                return TPI_ERROR_D_PARAMETER;\r
        }\r
@@ -174,6 +233,9 @@ int __stdcall GetPluginInformation
        case TPI_INFO_VERSION_API:\r
                * (int *) _pPtr = 2;\r
                break;\r
+       case TPI_INFO_HANDLE_ON_COMMAND:\r
+               * (int *) _pPtr = 1;\r
+               break;\r
        default:\r
                return TPI_ERROR_D_UNSUPPORTED;\r
        }\r
@@ -188,11 +250,11 @@ int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)
        }\r
 \r
        _fiInfo->szTypeName   = wxT("EGG/ALZ");\r
-       _fiInfo->szSuffix     = wxT(".egg;.alz");\r
-       _fiInfo->szEngineName = wxT("UnEGG.dll");\r
+       _fiInfo->szSuffix     = wxT("egg;alz");\r
+       _fiInfo->szEngineName = wxT("UnEGG32.dll");\r
        _fiInfo->szTPIName    = wxT("eggArc");\r
-       _fiInfo->llTypeId     = 0;\r
-       _fiInfo->llSupportedCommand = TPI_COMMAND_EXTRACT;\r
+       _fiInfo->nTypeId      = 0;\r
+       _fiInfo->eSupportedCommand = TPI_COMMAND_EXTRACT | TPI_COMMAND_TEST;\r
        _fiInfo->fArchive     = true;\r
        _fiInfo->fComment     = true;\r
        _fiInfo->fSFX         = true;\r
@@ -205,17 +267,24 @@ int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)
 \r
 int __stdcall LoadPlugin\r
 (\r
-       const wxString & _szArcName,\r
-       wxULongLong\r
+       const wxString &,\r
+       TPI_PROC _prProc,\r
+       wxULongLong_t\r
 )\r
 {\r
-       g_hLib = ::LoadLibrary(L"UnEGG.dll");\r
-       if (g_hLib == NULL || CheckArchive(_szArcName, NULL) != TPI_ERROR_SUCCESS)\r
+       ::RemoveCwdFromSearchPath();\r
+       g_hLib = ::LoadLibrary(L"UnEGG32.dll");\r
+       if (g_hLib == nullptr)\r
        {\r
                ::FreeLibrary(g_hLib);\r
                return TPI_ERROR_U_LOAD_LIBRARY;\r
        }\r
 \r
+       // コールバック関数を設定。\r
+       if (_prProc != nullptr)\r
+       {\r
+               g_prProc = * _prProc;\r
+       }\r
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
@@ -228,50 +297,71 @@ int __stdcall FreePlugin
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
-int __stdcall CheckArchive\r
+int __stdcall OpenArchive\r
 (\r
        const wxString & _szArcName,\r
-       int * _nFileCount\r
+       void * * _hArchive,\r
+       wxULongLong_t * _nFileCount\r
 )\r
 {\r
        FARPROC fpProc = ::GetAPIAddress("IsValidArchive");\r
-       if (fpProc == NULL)\r
+       if (fpProc == nullptr)\r
        {\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
 \r
-       if (_nFileCount != NULL)\r
+       egg_type eType;\r
+       int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(const wchar_t *, egg_type *)) fpProc)(_szArcName.wchar_str(), & eType));\r
+       if (nErrorCode != TPI_ERROR_SUCCESS)\r
        {\r
-               * _nFileCount = 1;\r
+               return nErrorCode;\r
        }\r
 \r
-       egg_type eType;\r
-       return ErrorCodeConvert(((UINT (__cdecl *)(const wchar_t *, egg_type *)) fpProc)(_szArcName.wchar_str(), & eType));\r
-}\r
-\r
-int __stdcall OpenArchive\r
-(\r
-       const wxString & _szArcName,\r
-       void * * _hArchive\r
-)\r
-{\r
-       FARPROC fpProc = ::GetAPIAddress("CreateEgg");\r
-       if (fpProc == NULL)\r
+       fpProc = ::GetAPIAddress("CreateEgg");\r
+       if (fpProc == nullptr)\r
        {\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
-       int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void **, eggevent::Proc, void *)) fpProc)(_hArchive, CallbackProc, _hArchive));\r
+       nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void **, eggevent::Proc, void *)) fpProc)(_hArchive, CallbackProc, _hArchive));\r
        if (nErrorCode != TPI_ERROR_SUCCESS)\r
        {\r
                return nErrorCode;\r
        }\r
-       if (_hArchive == NULL)\r
+       if (_hArchive == nullptr)\r
        {\r
                return TPI_ERROR_UNDEFINED;\r
        }\r
 \r
        fpProc = ::GetAPIAddress("OpenArchive");\r
-       return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : ErrorCodeConvert(((UINT (__cdecl *)(void *, wchar_t *)) fpProc)(* _hArchive, _szArcName.wchar_str()));\r
+       if (fpProc == nullptr)\r
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+       nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, wchar_t *)) fpProc)(* _hArchive, _szArcName.wchar_str()));\r
+       if (nErrorCode != TPI_ERROR_SUCCESS)\r
+       {\r
+               return nErrorCode;\r
+       }\r
+\r
+       if (_nFileCount != nullptr)\r
+       {\r
+               fpProc = ::GetAPIAddress("GetFileCount");\r
+               if (fpProc == nullptr)\r
+               {\r
+                       CloseArchive(* _hArchive);\r
+                       return TPI_ERROR_U_USE_LIBRARY;\r
+               }\r
+               size_t n;\r
+               nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(* _hArchive, & n));\r
+               if (nErrorCode != TPI_ERROR_SUCCESS)\r
+               {\r
+                       CloseArchive(* _hArchive);\r
+                       return nErrorCode;\r
+               }\r
+               * _nFileCount = n;\r
+       }\r
+\r
+       return TPI_ERROR_SUCCESS;\r
 }\r
 \r
 int __stdcall CloseArchive\r
@@ -280,7 +370,7 @@ int __stdcall CloseArchive
 )\r
 {\r
        FARPROC fpProc = ::GetAPIAddress("CloseArchive");\r
-       if (fpProc == NULL || _hArchive == NULL)\r
+       if (fpProc == nullptr || _hArchive == nullptr)\r
        {\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
@@ -291,7 +381,7 @@ int __stdcall CloseArchive
        }\r
 \r
        fpProc = ::GetAPIAddress("DestroyEgg");\r
-       return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : ErrorCodeConvert(((UINT (__cdecl *)(void **)) fpProc)(& _hArchive));\r
+       return fpProc == nullptr ? TPI_ERROR_U_USE_LIBRARY : ErrorCodeConvert(((UINT (__cdecl *)(void **)) fpProc)(& _hArchive));\r
 }\r
 \r
 int __stdcall GetFileInformation\r
@@ -301,51 +391,23 @@ int __stdcall GetFileInformation
        bool _bFirst\r
 )\r
 {\r
-       static unsigned int s_uFileID, s_uFileCount;\r
-       static FARPROC fpProc;\r
-       int nErrorCode;\r
-\r
+       static wxULongLong_t s_nFileId;\r
+       static size_t s_nFileCount;\r
        if (_bFirst)\r
        {\r
-               s_uFileID = 0;\r
-               fpProc = ::GetAPIAddress("GetFileCount");\r
-               if (fpProc == NULL)\r
+               s_nFileId = 0;\r
+               FARPROC fpProc = ::GetAPIAddress("GetFileCount");\r
+               if (fpProc == nullptr)\r
                {\r
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
-               nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(_hArchive, & s_uFileCount));\r
+               int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(_hArchive, & s_nFileCount));\r
                if (nErrorCode != TPI_ERROR_SUCCESS)\r
                {\r
                        return nErrorCode;\r
                }\r
-\r
-               fpProc = ::GetAPIAddress("GetFileHeader");\r
-               if (fpProc == NULL)\r
-               {\r
-                       return TPI_ERROR_U_USE_LIBRARY;\r
-               }\r
-       }\r
-       if (s_uFileID >= s_uFileCount)\r
-       {\r
-               return TPI_ERROR_S_ENDOFDATA;\r
        }\r
-\r
-       EGGFileHeader fhInfo;\r
-       nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t, EGGFileHeader *)) fpProc)(_hArchive, s_uFileID, & fhInfo));\r
-       if (nErrorCode == TPI_ERROR_SUCCESS)\r
-       {\r
-               _fiInfo->dwAttribute    = fhInfo.attribute;\r
-               _fiInfo->dwCRC32        = fhInfo.crc;\r
-               _fiInfo->llPackedSize   = fhInfo.packedSize;\r
-               _fiInfo->llUnpackedSize = fhInfo.unpackedSize;\r
-               _fiInfo->tmModified     = fhInfo.lastModified;\r
-               _fiInfo->szStoredName   = WC2String(fhInfo.fileName);\r
-               _fiInfo->szMethod       = fhInfo.method == 2 ? wxT("ALZ") : fhInfo.method == 0 ? wxT("EGG") : wxT("unknown");\r
-               _fiInfo->llFileID       = s_uFileID++;\r
-               _fiInfo->fnFileName     = wxFileName(_fiInfo->szStoredName);\r
-       }\r
-\r
-       return nErrorCode;\r
+       return s_nFileId >= s_nFileCount ? TPI_ERROR_S_ENDOFDATA : GetFileInformation2(_hArchive, _fiInfo, s_nFileId++);\r
 }\r
 \r
 int __stdcall GetArchiveInformation\r
@@ -360,56 +422,23 @@ int __stdcall GetArchiveInformation
 \r
 int __stdcall Command\r
 (\r
-       unsigned int _uCommand,\r
+       wxULongLong_t _eCommand,\r
        TPI_SWITCHES * _swInfo,\r
-       const wxString & _szArcName,\r
+       void * _hArchive,\r
        const wxArrayString & _szFiles\r
 )\r
 {\r
-       if (_uCommand != TPI_COMMAND_EXTRACT)\r
+       if (_eCommand != TPI_COMMAND_EXTRACT && _eCommand != TPI_COMMAND_TEST)\r
        {\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
 \r
-       // \8aJ\82«\82È\82¨\82·\81B\r
-       void * hArc;\r
-       int nErrorCode = OpenArchive(_szArcName, & hArc);\r
-       if (nErrorCode != TPI_ERROR_SUCCESS)\r
-       {\r
-               return nErrorCode;\r
-       }\r
-\r
-       // \83O\83\8d\81[\83o\83\8b\95Ï\90\94\82É\83|\83C\83\93\83^\82ð\95Û\91\81B\r
+       // グローバル変数にポインタを保存。\r
        g_swInfo = _swInfo;\r
        g_asFiles = & _szFiles;\r
 \r
-       FARPROC fpProc = ::GetAPIAddress("Extract");\r
-       if (fpProc == NULL)\r
-       {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
-       }\r
-       nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *)) fpProc)(hArc));\r
-       if (nErrorCode != TPI_ERROR_SUCCESS)\r
-       {\r
-               return nErrorCode;\r
-       }\r
-\r
-       return CloseArchive(hArc);\r
-}\r
-\r
-int __stdcall SetCallbackProc\r
-(\r
-       TPI_PROC _prArcProc\r
-)\r
-{\r
-       // \83|\83C\83\93\83^\82ð\95Û\91\81B\r
-       if (_prArcProc == NULL)\r
-       {\r
-               return TPI_ERROR_D_PARAMETER;\r
-       }\r
-       g_prProc = * _prArcProc;\r
-\r
-       return TPI_ERROR_SUCCESS;\r
+       FARPROC fpProc = _eCommand == TPI_COMMAND_EXTRACT ? ::GetAPIAddress("Extract") : ::GetAPIAddress("Test");\r
+       return fpProc == nullptr ? TPI_ERROR_U_USE_LIBRARY : ErrorCodeConvert(((UINT (__cdecl *)(void *)) fpProc)(_hArchive));\r
 }\r
 \r
 #ifdef __cplusplus\r