TPI_PROC g_prProc;\r
\r
//******************************************************************************\r
-// Inside Functions\r
+// Inline Functions\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
+#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
- wxDateTime dt(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);\r
- return dt;\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
//******************************************************************************\r
// Callback Wrapper\r
\r
BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void * _lpEis)\r
{\r
- if (_uMsg != ::RegisterWindowMessage(WM_ARCEXTRACT))\r
+ static unsigned int uWM = ::RegisterWindowMessage(WM_ARCEXTRACT);\r
+ if (_uMsg != uWM)\r
{\r
// 独自仕様などに対する予備コード。\r
return TRUE;\r
{\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->uOSType;\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->uOSType;\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
{\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->uOSType;\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->uOSType;\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
{\r
if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
{\r
- // 初期化。\r
- ENUM_MEMBER_INFOW * ex = (ENUM_MEMBER_INFOW *) _lpEis;\r
- if (ex->uCommand != COMMAND_EXTRACT)\r
- {\r
- return TRUE;\r
- }\r
-\r
// ENUM_MEMBER_INFOW -> 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->dwCompressedSize;\r
- piInfo.fiInfo.nUnpackedSize = ex->dwOriginalSize;\r
- piInfo.fiInfo.eOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = WC2String(ex->szFileName);\r
- piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName);\r
-\r
- // ENUM_MEMBER_INFOW -> TPI_PROCESSINFO変換。\r
- piInfo.fnDestination = wxFileName(WC2String(ex->szAddFileName));\r
-\r
- // コールバック関数に送信。\r
- g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+ MyConvEM322PI(ENUM_MEMBER_INFOW, WC2String);\r
wcsncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().c_str(), FNAME_MAX32);\r
}\r
else\r
{\r
- // 初期化。\r
- ENUM_MEMBER_INFO * ex = (ENUM_MEMBER_INFO *) _lpEis;\r
- if (ex->uCommand != COMMAND_EXTRACT)\r
- {\r
- return TRUE;\r
- }\r
-\r
// ENUM_MEMBER_INFO -> 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->dwCompressedSize;\r
- piInfo.fiInfo.nUnpackedSize = ex->dwOriginalSize;\r
- piInfo.fiInfo.eOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = UTF82String(ex->szFileName);\r
- piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName);\r
-\r
- // ENUM_MEMBER_INFO -> TPI_PROCESSINFO変換。\r
- piInfo.fnDestination = wxFileName(UTF82String(ex->szAddFileName));\r
-\r
- // コールバック関数に送信。\r
- g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+ MyConvEM322PI(ENUM_MEMBER_INFO, UTF82String);\r
strncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().ToUTF8(), FNAME_MAX32);\r
}\r
}\r
{\r
if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
{\r
- // 初期化。\r
- ENUM_MEMBER_INFO64W * ex = (ENUM_MEMBER_INFO64W *) _lpEis;\r
- if (ex->uCommand != COMMAND_EXTRACT)\r
- {\r
- return TRUE;\r
- }\r
-\r
// ENUM_MEMBER_INFO64W -> 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->llOriginalSize;\r
- piInfo.fiInfo.eOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = WC2String(ex->szFileName);\r
- piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName);\r
-\r
- // ENUM_MEMBER_INFO64W -> TPI_PROCESSINFO変換。\r
- piInfo.fnDestination = wxFileName(WC2String(ex->szAddFileName));\r
-\r
- // コールバック関数に送信。\r
- g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+ MyConvEM642PI(ENUM_MEMBER_INFO64W, WC2String);\r
wcsncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().c_str(), FNAME_MAX32);\r
}\r
else\r
{\r
- // 初期化。\r
- ENUM_MEMBER_INFO64 * ex = (ENUM_MEMBER_INFO64 *) _lpEis;\r
- if (ex->uCommand != COMMAND_EXTRACT)\r
- {\r
- return TRUE;\r
- }\r
-\r
// ENUM_MEMBER_INFO64 -> 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->llOriginalSize;\r
- piInfo.fiInfo.eOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = UTF82String(ex->szFileName);\r
- piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName);\r
-\r
- // ENUM_MEMBER_INFO64 -> TPI_PROCESSINFO変換。\r
- piInfo.fnDestination = wxFileName(UTF82String(ex->szAddFileName));\r
-\r
- // コールバック関数に送信。\r
- g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+ MyConvEM642PI(ENUM_MEMBER_INFO64, UTF82String);\r
strncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().ToUTF8(), FNAME_MAX32);\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
int __stdcall LoadPlugin\r
(\r
const wxString & _szArcName,\r
+ TPI_PROC _prProc,\r
wxULongLong_t _nTypeId\r
)\r
{\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
? ((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
+ if (_prProc != NULL)\r
+ {\r
+ g_prProc = * _prProc;\r
+ CalSetCallbackProc(true);\r
+ CalSetCallbackProc(false);\r
+ }\r
return TPI_ERROR_SUCCESS;\r
}\r
::FreeLibrary(g_LibInfo.hLib);\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 n = g_LibInfo.fUnicode\r
- ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
- : ((int (__stdcall *)(const char *)) fpProc)(_szArcName.ToUTF8());\r
- if (n == -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
- * _nFileCount = n;\r
}\r
\r
fpProc = ::GetAPIAddress("OpenArchive", true);\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
_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
_aiInfo->fnArchive = wxFileName(s);\r
}\r
\r
- fpProc = ::GetAPIAddress("GetArcFileSizeEx", false);\r
- if (fpProc != NULL)\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
- ((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
+ _aiInfo->nPackedSize = _aiInfo->nFileSize;\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
- {\r
- fpProc = ::GetAPIAddress("GetArcCompressedSize", false);\r
- if (fpProc != NULL)\r
- {\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->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
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