TNB Library
TnbArchiverDllHandler.h
[詳解]
1#pragma once
11#include "TnbStr.h"
12#include "TnbDynamicFunc.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
22#ifndef _TnbDOXYGEN //Document作成用シンボル
23#ifndef ARC_DECSTRACT
24 //[7ZIP]の提供ヘッダ
25 #include "other/7-zip32.h"
26#endif
27#endif //_TnbDOXYGEN
28
29
30
31#pragma pack(push, 1)
41{
44 DWORD dwCRC;
45 UINT uFlag;
46 UINT uOSType;
47 WORD wRatio;
48 WORD wDate;
49 WORD wTime;
50 char szFileName[FNAME_MAX32 + 1];
51 char dummy1[3];
52 char szAttribute[8];
53 char szMode[8];
54 #ifndef _UNICODE
57 {
58 ASSERT0( sizeof(TNB::TIndividualInfo) == sizeof(INDIVIDUALINFO), "TIndividualInfo()",
59 "ローカルで宣言している型(TNB::TIndividualInfo)と\n"
60 "インクルードしている型(INDIVIDUALINFO)で差異があります。\n");
61 }
62 #endif
63};
64#pragma pack(pop)
65
66
67
89{
90public:
91
94 {
99 };
100
106 CArchiverDllHandler(LPCSTR lpszDllName, LPCSTR lpszPrifix)
107 : m_hModule(NULL), m_strPrifix(lpszPrifix), m_hWnd(NULL)
108 {
109 m_Init(lpszDllName);
110 }
111
114 {
115 if ( m_hModule != NULL )
116 {
117 ::FreeLibrary(m_hModule);
118 m_hModule = NULL;
119 }
120 }
121
128 void SetParent(HWND hWnd)
129 {
130 m_hWnd = hWnd;
131 }
132
138 bool IsReady(void) const
139 {
140 return m_hModule != NULL;
141 }
142
150 template<typename R>
151 R Func(R& _r, LPCSTR lpszFuncName)
152 {
153 R (WINAPI *pFunc0)(void);
154 _r = m_GetFuncAdd(pFunc0, lpszFuncName)();
155 return _r;
156 }
157
166 template<typename R, typename T1>
167 R Func(R& _r, LPCSTR lpszFuncName, T1 t1)
168 {
169 R (WINAPI *pFunc1)(T1 t1);
170 _r = m_GetFuncAdd(pFunc1, lpszFuncName)(t1);
171 return _r;
172 }
173
183 template<typename R, typename T1, typename T2>
184 R Func(R& _r, LPCSTR lpszFuncName, T1 t1, T2 t2)
185 {
186 R (WINAPI *pFunc2)(T1, T2);
187 _r = m_GetFuncAdd(pFunc2, lpszFuncName)(t1, t2);
188 return _r;
189 }
190
201 template<typename R, typename T1, typename T2, typename T3>
202 R Func(R& _r, LPCSTR lpszFuncName, T1 t1, T2 t2, T3 t3)
203 {
204 R (WINAPI *pFunc3)(T1, T2, T3);
205 _r = m_GetFuncAdd(pFunc3, lpszFuncName)(t1, t2, t3);
206 return _r;
207 }
208
220 template<typename R, typename T1, typename T2, typename T3, typename T4>
221 R Func(R& _r, LPCSTR lpszFuncName, T1 t1, T2 t2, T3 t3, T4 t4)
222 {
223 R (WINAPI *pFunc4)(T1, T2, T3, T4);
224 _r = m_GetFuncAdd(pFunc4, lpszFuncName)(t1, t2, t3, t4);
225 return _r;
226 }
227
237 bool IsRunning(void)
238 {
239 BOOL r;
240 return !! Func(r, "GetRunning");
241 }
242
248 {
249 m_strResult.ReleaseBuffer();
250 return m_strResult;
251 }
252
264 int Command(LPCSTR lpszCmdLine, const DWORD dwOutputSize)
265 {
266 int r;
267 return Func(r, "", m_hWnd, lpszCmdLine, m_strResult.GetBuffer(dwOutputSize), dwOutputSize);
268 }
269
277 WORD GetVersion(void)
278 {
279 WORD r;
280 return Func(r, "GetVersion");
281 }
282
291 WORD GetSubVersion(void)
292 {
293 WORD r;
294 return Func(r, "GetSubVersion");
295 }
296
304 {
305 CStr s;
306 WORD w = GetVersion();
307 try
308 {
309 WORD v = GetSubVersion();
310 s.Format(_T("%d.%02d.%02d.%02d"), w / 100, w % 100, v / 100, v % 100);
311 }
312 catch(CNotSupportException& e)
313 {
314 e.OnCatch();
315 s.Format(_T("%d.%02d"), w / 100, w % 100);
316 }
317 return s;
318 }
319
330 DWORD ConfigDialog(LPSTR _lpszOptionBuffer = NULL, const int iMode = 0)
331 {
332 BOOL r;
333 return Func(r, "ConfigDialog", m_hWnd, _lpszOptionBuffer, iMode);
334 }
335
346 bool CheckArchive(LPCSTR lpszArcFile, const int iMode)
347 {
348 BOOL r;
349 return !! Func(r, "CheckArchive", lpszArcFile, iMode);
350 }
351
360 int GetFileCount(LPCSTR lpszArcFile)
361 {
362 int r;
363 return Func(r, "GetFileCount", lpszArcFile);
364 }
365
377 bool QueryFunctionList(const int iFunction)
378 {
379 BOOL r;
380 return !! Func(r, "QueryFunctionList", iFunction);
381 }
382
395 HARC OpenArchive(LPCSTR lpszArcFile, const DWORD dwMode = 0)
396 {
397 HARC r;
398 return Func(r, "OpenArchive", m_hWnd, lpszArcFile, dwMode);
399 }
400
409 int CloseArchive(HARC hArc)
410 {
411 int r;
412 return Func(r, "CloseArchive", hArc);
413 }
414
421 virtual CAscii MakeCommand(ECommand cmd, LPCSTR lpszOption = NULL)
422 {
423 CAscii strOpt = lpszOption;
424 if ( ! strOpt.IsEmpty() )
425 {
426 strOpt += " ";
427 }
428 CAscii strResult;
429 CAscii strCmd = MakeCommandOption(cmd);
430 if ( strCmd.IsEmpty() )
431 {
432 return strResult;
433 }
434 strResult.Format("%s%s\042%%s\042 \042%%s\\\042 \042%%s\042", strCmd, strOpt);
435 return strResult;
436 }
437
444
460 int Execute(ECommand cmd, LPCSTR lpszArcFile, LPCSTR lpszPath, LPCSTR lpszFilter, LPCSTR lpszOption = NULL)
461 {
462 CAscii strCmd;
463 switch ( cmd )
464 {
465 case EC_Delete: // 削除
466 case EC_Extract: // 抽出
467 case EC_ExtractDir: // 抽出(Directory付き)
468 case EC_Attract: // 格納
469 strCmd = MakeCommand(cmd, lpszOption);
470 break;
471 default:
472 ASSERT(false);
473 break;
474 }
475 if ( strCmd.IsEmpty() )
476 {
477 m_strResult.ReleaseBuffer();
478 m_strResult.Empty();
479 return -1;
480 }
481 CAscii s = CAscii::Fmt(strCmd, lpszArcFile, lpszPath, lpszFilter);
482 s.Replace("\\\\","\\");
483 return Command(s, RESULTMAX);
484 }
485
497 int ExtractMem(LPCSTR lpszArcFile, LPCSTR lpszName, BYTE* _lpBuf, size_t& dwSize, LPCSTR lpszOption = NULL)
498 {
499 ASSERT( ! ::IsBadWritePtr(_lpBuf, dwSize) );
500 CAscii strCmd = CAscii::Fmt("%s \042%s\042 \042%s\042", CAscii(lpszOption), lpszArcFile, lpszName);
501 strCmd.TrimLeft();
502 DWORD dwOriginalSize = 0;
503 int (WINAPI* pFunc)(const HWND, LPCSTR, BYTE*, const DWORD, time_t*, WORD*, DWORD*);
504 int r = m_GetFuncAdd(pFunc, "ExtractMem")
505 (m_hWnd, strCmd, _lpBuf, static_cast<DWORD>(dwSize), NULL, NULL, &dwOriginalSize);
506 dwSize = dwOriginalSize;
507 return r;
508 }
509
523 int CompressMem(LPCSTR lpszArcFile, LPCSTR lpszName, time_t time, WORD wAttr,
524 const BYTE* lpBuf, DWORD& _dwSize, LPCSTR lpszOption = NULL)
525 {
526 ASSERT( ! ::IsBadReadPtr(lpBuf, _dwSize) );
527 CAscii strCmd = CAscii::Fmt("%s \042%s\042 \042%s\042", CAscii(lpszOption), lpszArcFile, lpszName);
528 strCmd.TrimLeft();
529 DWORD dwCompreSize = 0;
530 int (WINAPI* pFunc)
531 (const HWND, LPCSTR, const BYTE*, const DWORD, const time_t*, const WORD*, DWORD*);
532 int r = m_GetFuncAdd(pFunc, "CompressMem")
533 (m_hWnd, strCmd, lpBuf, _dwSize, &time, &wAttr, &dwCompreSize);
534 _dwSize = dwCompreSize;
535 return r;
536 }
537
538private:
539 enum
540 {
541 RESULTMAX = 1024
542 };
543 // DLLの読み込み(最初の1回目のみ)とワークエリアの初期化を行います。
544 bool m_Init(LPCSTR lpszDllName)
545 {
546 if ( m_hModule != NULL )
547 {
548 return true;
549 }
550 HINSTANCE h = ::LoadLibraryA(lpszDllName);
551 if ( h == NULL )
552 {
553 return false;
554 }
555 // エクスポート関数の確認
556 bool r = true;
557 WORD (WINAPI *pGetVersion)(void);
558 r &= GetFuncAddress(pGetVersion, h, m_strPrifix + "GetVersion");
559 if ( r )
560 {
561 m_hModule = h;
562 }
563 else
564 {
565 ::FreeLibrary(h);
566 }
567 return r;
568 }
575 template<typename T>
576 T& m_GetFuncAdd(T& _t, LPCSTR lpszFuncName)
577 {
578 if ( m_hModule == NULL )
579 {
580 throw CNullPointerException();
581 }
582 if ( ! GetFuncAddress(_t, m_hModule, m_strPrifix + lpszFuncName) )
583 {
584 throw CNotSupportException();
585 }
586 return _t;
587 }
588 HMODULE m_hModule;
589 CAscii m_strPrifix;
590 CAscii m_strResult;
591 HWND m_hWnd;
592};
593
594
595
614{
615 DEFSUPER(CArchiverDllHandler);
616public:
617
619 CUnZipDllHandler(void) : _super("UnZip32.dll", "UnZip")
620 {
621 }
622
629 {
630 CAscii strCmd;
631 switch ( cmd )
632 {
633 case EC_Delete: // 削除
634 strCmd = "-d ";
635 break;
636 case EC_Extract: // 抽出
637 strCmd = " ";
638 break;
639 case EC_ExtractDir: // 抽出(Directory付き)
640 strCmd = " ";
641 break;
642 case EC_Attract: // 格納
643 strCmd = "";
644 break;
645 default:
646 ASSERT(false);
647 break;
648 }
649 return strCmd;
650 }
651};
652
653
654
670{
671 DEFSUPER(CArchiverDllHandler);
672public:
673
675 C7zDllHandler(void) : _super("7-zip32.dll", "SevenZip")
676 {
677 }
678
687 int GetArchiveType(LPCSTR lpszArcFile)
688 {
689 int r;
690 return Func(r, "GetArchiveType", lpszArcFile);
691 }
692
700 bool SetUnicodeMode(bool boIsUtf8)
701 {
702 BOOL r = boIsUtf8;
703 return !! Func(r, "SetUnicodeMode", boIsUtf8);
704 }
705
712 {
713 CAscii strCmd;
714 switch ( cmd )
715 {
716 case EC_Delete: // 削除
717 strCmd = "d ";
718 break;
719 case EC_Extract: // 抽出
720 strCmd = "e ";
721 break;
722 case EC_ExtractDir: // 抽出(Directory付き)
723 strCmd = "x ";
724 break;
725 case EC_Attract: // 格納
726 strCmd = "a ";
727 break;
728 default:
729 ASSERT(false);
730 break;
731 }
732 return strCmd;
733 }
734};
735
736
737
755{
756 DEFSUPER(CArchiverDllHandler);
757public:
758
760 CUnLhaDllHandler(void) : _super("UnLha32.dll", "Unlha")
761 {
762 }
763
770 {
771 CAscii strCmd;
772 switch ( cmd )
773 {
774 case EC_Delete: // 削除
775 strCmd = "d ";
776 break;
777 case EC_Extract: // 抽出
778 strCmd = "e ";
779 break;
780 case EC_ExtractDir: // 抽出(Directory付き)
781 strCmd = "x ";
782 break;
783 case EC_Attract: // 格納
784 strCmd = "a -r1 -x1 ";
785 break;
786 default:
787 ASSERT(false);
788 break;
789 }
790 return strCmd;
791 }
792};
793
794
795
815{
816 DEFSUPER(CArchiverDllHandler);
817public:
818
820 CCabDllHandler(void) : _super("Cab32.dll", "Cab")
821 {
822 }
823
830 {
831 CAscii strCmd;
832 switch ( cmd )
833 {
834 case EC_Delete: // 削除 -- 未サポート
835 break;
836 case EC_Extract: // 抽出
837 strCmd = "-x -j";
838 break;
839 case EC_ExtractDir: // 抽出(Directory付き)
840 strCmd = "-x ";
841 break;
842 case EC_Attract: // 格納
843 strCmd = "-a -r ";
844 break;
845 default:
846 ASSERT(false);
847 break;
848 }
849 return strCmd;
850 }
851};
852
853
854
872{
873 DEFSUPER(CArchiverDllHandler);
874public:
875
877 CTarDllHandler(void) : _super("Tar32.dll", "Tar")
878 {
879 }
880
887 {
888 CAscii strCmd;
889 switch ( cmd )
890 {
891 case EC_Delete: // 削除 -- 未サポート
892 break;
893 case EC_Extract: // 抽出
894 strCmd = "-x ";
895 break;
896 case EC_ExtractDir: // 抽出(Directory付き)
897 strCmd = "-xf ";
898 break;
899 case EC_Attract: // 格納
900 strCmd = "-cf ";
901 break;
902 default:
903 break;
904 }
905 return strCmd;
906 }
907};
908
909
910
911}; // TNB
912
913#if 0
914アーカイバDLL 圧縮 N圧縮 解凍 F解凍 更新 検査 一覧 SFX 詳細 削除 注釈 ヘ変
915------------------------------------------------------------------------------------------------------------
9167-Zip32.DLL a **** e x u t l **** **** d **** ****
917UNLHA32.DLL a u e x f t l s v d c y
918CAB32.DLL a **** x x **** c,t l f **** **** **** ****
919TAR32.DLL -cvf **** -xvf -xvf **** **** -tvf **** **** **** **** ****
920------------------------------------------------------------------------------------------------------------
921UNZIP32.DLL **** **** -x,-xv -x,-xv **** -t -l,-lv **** -v -d -z,-Z ****
922ZIP32J.DLL -r -r **** **** -f,-u **** **** -sfx **** -d -z ****
923UNARJ32J.DLL **** **** e,ev x,xv **** t l,lv **** v **** **** ****
924UNRAR32.DLL **** **** -e -x **** **** -l **** -v **** **** ****
925BGA32.DLL a **** x x **** t l,lv s **** d **** ****
926YZ1.DLL c **** x x **** **** **** **** **** **** **** ****
927UNGCA32.DLL **** **** e,ex e,ex **** t l **** **** **** **** ****
928UNIMP32.DLL **** **** **** -o **** **** **** **** **** **** **** ****
929UNBEL32.DLL <<コマンドは不要>>
930 備考:N圧縮:新規追加圧縮, F解凍:フォルダ解凍, SFX:自己解凍書庫を作成, へ変:ヘッダ変更, **** は未対応
931
932#endif
動的関数管理関係のヘッダ
文字列管理関係のヘッダ
7-Zip32.dll 管理クラス
virtual CAscii MakeCommandOption(ECommand cmd)
[作成] コマンドオプション文字列作成
int GetArchiveType(LPCSTR lpszArcFile)
[確認] ファイル形式確認
bool SetUnicodeMode(bool boIsUtf8)
[設定] 使用文字設定
C7zDllHandler(void)
コンストラクタ
アーカイバDLL管理クラス
WORD GetSubVersion(void)
[取得] DLLのサブバージョン取得.
@ EC_ExtractDir
抽出(Directory付き)
int GetFileCount(LPCSTR lpszArcFile)
[確認] アーカイブ数確認
CArchiverDllHandler(LPCSTR lpszDllName, LPCSTR lpszPrifix)
コンストラクタ
virtual CAscii MakeCommand(ECommand cmd, LPCSTR lpszOption=NULL)
[作成] コマンド文字列作成
virtual ~CArchiverDllHandler(void)
デストラクタ
bool IsRunning(void)
[確認] 動作中確認
int CloseArchive(HARC hArc)
[処理] アーカイブClose.
DWORD ConfigDialog(LPSTR _lpszOptionBuffer=NULL, const int iMode=0)
[設定] オプション画面
CStr GetVersionString(void)
[取得] DLLのバージョン取得.
bool IsReady(void) const
[確認] DLL準備確認
bool QueryFunctionList(const int iFunction)
[確認] ファンクションチェック.
bool CheckArchive(LPCSTR lpszArcFile, const int iMode)
[確認] ファイル形式確認
R Func(R &_r, LPCSTR lpszFuncName, T1 t1)
[実行] DLL関数実行
WORD GetVersion(void)
[取得] DLLのバージョン取得.
int Execute(ECommand cmd, LPCSTR lpszArcFile, LPCSTR lpszPath, LPCSTR lpszFilter, LPCSTR lpszOption=NULL)
[実行] コマンド実行
void SetParent(HWND hWnd)
[設定] 関連 Windowハンドル
int CompressMem(LPCSTR lpszArcFile, LPCSTR lpszName, time_t time, WORD wAttr, const BYTE *lpBuf, DWORD &_dwSize, LPCSTR lpszOption=NULL)
[実行] メモリから格納
R Func(R &_r, LPCSTR lpszFuncName, T1 t1, T2 t2, T3 t3, T4 t4)
[実行] DLL関数実行
int Command(LPCSTR lpszCmdLine, const DWORD dwOutputSize)
[処理] コマンド処理.
R Func(R &_r, LPCSTR lpszFuncName)
[実行] DLL関数実行
HARC OpenArchive(LPCSTR lpszArcFile, const DWORD dwMode=0)
[処理] アーカイブOpen.
int ExtractMem(LPCSTR lpszArcFile, LPCSTR lpszName, BYTE *_lpBuf, size_t &dwSize, LPCSTR lpszOption=NULL)
[実行] メモリに抽出
virtual CAscii MakeCommandOption(ECommand cmd)=0
[作成] コマンドオプション文字列作成.
R Func(R &_r, LPCSTR lpszFuncName, T1 t1, T2 t2, T3 t3)
[実行] DLL関数実行
R Func(R &_r, LPCSTR lpszFuncName, T1 t1, T2 t2)
[実行] DLL関数実行
CAscii GetResultString(void)
[取得] 結果
Cab32.dll 管理クラス
virtual CAscii MakeCommandOption(ECommand cmd)
[作成] コマンドオプション文字列作成
CCabDllHandler(void)
コンストラクタ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
サポート外例外
Definition: TnbException.h:185
NULLポインタ例外
Definition: TnbException.h:172
CStrT & TrimLeft(TYP t=' ')
[処理] 先頭から文字をトリム.
Definition: TnbStr.h:968
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
static CStrT Fmt(const char *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
int Replace(TYP tOld, TYP tNew)
[処理] 文字置換.
Definition: TnbStr.h:1038
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
Definition: TnbStr.h:359
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
Tar32.dll 管理クラス
CTarDllHandler(void)
コンストラクタ
virtual CAscii MakeCommandOption(ECommand cmd)
[作成] コマンドオプション文字列作成
void OnCatch(void) const
[表示] 内容表示
Definition: TnbException.h:69
UnLha32.dll 管理クラス
virtual CAscii MakeCommandOption(ECommand cmd)
[作成] コマンドオプション文字列作成
CUnLhaDllHandler(void)
コンストラクタ
UnZip32.dll 管理クラス
virtual CAscii MakeCommandOption(ECommand cmd)
[作成] コマンドオプション文字列作成.
CUnZipDllHandler(void)
コンストラクタ
bool GetFuncAddress(FUNC &_pFnc, HINSTANCE hInstance, LPCSTR lpszName)
動的関数アドレス取得関数
TNB::CStrT< char > CAscii
ASCII文字列クラス
Definition: TnbStr.h:1758
TNB Library
Definition: TnbDoxyTitle.txt:2
アーカイバDLL用情報構造体
char szFileName[FNAME_MAX32+1]
格納ファイル名
DWORD dwOriginalSize
ファイルのサイズ
WORD wTime
格納ファイルの時刻(〃)
TIndividualInfo(void)
コンストラクタ
DWORD dwCompressedSize
圧縮後のサイズ
char szMode[8]
格納ファイルの格納モード(〃)
char szAttribute[8]
格納ファイルの属性(書庫固有)
DWORD dwCRC
格納ファイルのチェックサム
UINT uOSType
書庫作成に使われた OS
WORD wDate
格納ファイルの日付(DOS 形式)