Home > ソフトウェア > Ashley > Ashley130.zip/Ashley130.exe > Src > ArcDll.cpp
//ArcDll.cpp //統合アーカイバDll操作クラス //一部の関数のみに対応 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# Ashley Ver.1.30 Coded by x@rgs This code is released under NYSL Version 0.9982 See NYSL_withfaq.TXT for further details. Ashleyは、アップローダからダウンロードしたZIPやRAR等のファイル名を元に戻すソフトです。 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/ #include"Pch.h" #include"ArcDll.h" //コンストラクタ CArcDll::CArcDll(){ m_hDll=NULL; } //デストラクタ CArcDll::~CArcDll(){ UnloadDll(); } //DLLをロードします bool CArcDll::LoadDll(LPCTSTR lpszDllName,LPCTSTR lpszDllPrefix){ UnloadDll(); m_lpszDllName=lpszDllName; m_lpszDllPrefix=lpszDllPrefix; if(m_hDll==NULL){ m_hDll=::LoadLibrary(m_lpszDllName); if(m_hDll==NULL)return false; } return true; } //DLLを開放します bool CArcDll::UnloadDll(){ if (m_hDll!=NULL){ ::FreeLibrary(m_hDll); m_hDll=NULL; return true; } return false; } //関数名を投げるだけで良いGetProcAddress FARPROC CArcDll::GetProcAddress(LPCTSTR lpszProcName){ if(m_hDll==NULL||lpszProcName==NULL){ ::SetLastError(ERROR_INVALID_PARAMETER); return NULL; } bool bSuccess=false; const int iBuffer=MAX_PATH*2;//適当... std::vector<char> szProcName(iBuffer); //UNICODE以外でビルドされる事を想定していないので#ifndef UNICODEは未実装 LPWSTR lpszProcNameW=(LPWSTR)malloc(iBuffer); ::wsprintf(lpszProcNameW,_T("%s%s"),m_lpszDllPrefix,lpszProcName); DWORD dwLen=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)lpszProcNameW,-1,NULL,0,NULL,NULL); if(!::WideCharToMultiByte(CP_ACP,0,(LPCWSTR)lpszProcNameW,-1,&szProcName[0],dwLen,NULL,NULL)){ ::SetLastError(ERROR_INVALID_PARAMETER); }else{ bSuccess=true; } free(lpszProcNameW); return ::GetProcAddress(m_hDll,&szProcName[0]); } //DLLの動作中にカーソルを表示するモードか否かを設定します bool CArcDll::SetCursorMode(const bool _CursorMode){ typedef bool(WINAPI*PSETCURSORMODE)(const bool); PSETCURSORMODE pSetCursorMode; bool bResult=false; if(QueryFunctionList(ISARC_SET_CURSOR_MODE)==true){ if((pSetCursorMode=(PSETCURSORMODE)GetProcAddress(_T("SetCursorMode")))!=NULL){ bResult=pSetCursorMode(_CursorMode); } } return bResult; } //現在DLLが動作中か否かを得ます bool CArcDll::GetRunning(){ typedef bool(WINAPI*PGETRUNNING)(void); PGETRUNNING pGetRunning; bool bResult=false; if(QueryFunctionList(ISARC_GET_RUNNING)==true){ if((pGetRunning=(PGETRUNNING)GetProcAddress(_T("GetRunning")))!=NULL){ bResult=pGetRunning(); } } return bResult; } //指定ファイルがサポートしている書庫ファイルとして //正しいかどうかを返します。 bool CArcDll::CheckArchive(LPCTSTR _szFileName,const int _iMode){ typedef bool(WINAPI*PCHECKARCHIVE)(LPCTSTR,const int); PCHECKARCHIVE pCheckArchive; bool bResult=false; if(QueryFunctionList(ISARC_CHECK_ARCHIVE)==true){ if((pCheckArchive=(PCHECKARCHIVE)GetProcAddress(_T("CheckArchive")))!=NULL){ bResult=pCheckArchive(_szFileName,_iMode); } } return bResult; } //指定ファイルがサポートしている書庫ファイルとして //正しいかどうかを返します。[ANSI] bool CArcDll::CheckArchiveA(LPCSTR _szFileName,const int _iMode){ typedef bool(WINAPI*PCHECKARCHIVEA)(LPCSTR,const int); PCHECKARCHIVEA pCheckArchiveA; bool bResult=false; if(QueryFunctionList(ISARC_CHECK_ARCHIVE)==true){ if((pCheckArchiveA=(PCHECKARCHIVEA)GetProcAddress(_T("CheckArchiveA")))==NULL){ pCheckArchiveA=(PCHECKARCHIVEA)GetProcAddress(_T("CheckArchive")); } if(pCheckArchiveA!=NULL){ bResult=pCheckArchiveA(_szFileName,_iMode); } } return bResult; } //指定ファイルがサポートしている書庫ファイルとして //正しいかどうかを返します。[Unicode] bool CArcDll::CheckArchiveW(LPCWSTR _szFileName,const int _iMode){ typedef bool(WINAPI*PCHECKARCHIVEW)(LPCWSTR,const int); PCHECKARCHIVEW pCheckArchiveW; bool bResult=false; if(QueryFunctionList(ISARC_CHECK_ARCHIVE)==true){ if((pCheckArchiveW=(PCHECKARCHIVEW)GetProcAddress(_T("CheckArchiveW")))==NULL){ pCheckArchiveW=(PCHECKARCHIVEW)GetProcAddress(_T("CheckArchive")); } if(pCheckArchiveW!=NULL){ bResult=pCheckArchiveW(_szFileName,_iMode); } } return bResult; } //指定したアーカイブファイルの形式を得ます。 int CArcDll::GetArchiveType(LPCSTR _szFileName){ typedef int(WINAPI*PGETARCHIVETYPE)(LPCSTR); PGETARCHIVETYPE pGetArchiveType; int iResult=-1; if((pGetArchiveType=(PGETARCHIVETYPE)GetProcAddress(_T("GetArchiveType")))!=NULL){ iResult=pGetArchiveType(_szFileName); } return iResult; } //指定されたAPIが使用可能かどうかを得ます bool CArcDll::QueryFunctionList(const int _iFunction){ typedef bool(WINAPI*PQUERYFUNCTIONLIST)(const int); PQUERYFUNCTIONLIST pQueryFunctionList; bool bResult=false; if((pQueryFunctionList=(PQUERYFUNCTIONLIST)GetProcAddress(_T("QueryFunctionList")))!=NULL){ bResult=pQueryFunctionList(_iFunction); } return bResult; } //指定ファイルが有効な書庫ファイルかどうか調べ、 //有効であればオープンし、一意の数値(ハンドル)を返します。 HARC CArcDll::OpenArchive(const HWND _hwnd, LPCTSTR _szFileName,const DWORD _dwMode){ typedef HARC(WINAPI*POPENARCHIVE)(const HWND, LPCTSTR,const DWORD); POPENARCHIVE pOpenArchive; m_hArc=NULL; if(QueryFunctionList(ISARC_OPEN_ARCHIVE)==true){ if((pOpenArchive=(POPENARCHIVE)GetProcAddress(_T("OpenArchive")))!=NULL){ if(GetRunning()==false){ m_hArc=pOpenArchive(_hwnd,_szFileName,_dwMode); } } } return m_hArc; } //指定ファイルが有効な書庫ファイルかどうか調べ、 //有効であればオープンし、一意の数値(ハンドル)を返します。[ANSI] HARC CArcDll::OpenArchiveA(const HWND _hwnd, LPCSTR _szFileName,const DWORD _dwMode){ typedef HARC(WINAPI*POPENARCHIVEA)(const HWND, LPCSTR,const DWORD); POPENARCHIVEA pOpenArchiveA; m_hArc=NULL; if(QueryFunctionList(ISARC_OPEN_ARCHIVE)==true){ if((pOpenArchiveA=(POPENARCHIVEA)GetProcAddress(_T("OpenArchiveA")))==NULL){ pOpenArchiveA=(POPENARCHIVEA)GetProcAddress(_T("OpenArchive")); } if(pOpenArchiveA!=NULL){ if(GetRunning()==false){ m_hArc=pOpenArchiveA(_hwnd,_szFileName,_dwMode); } } } return m_hArc; } //指定ファイルが有効な書庫ファイルかどうか調べ、 //有効であればオープンし、一意の数値(ハンドル)を返します。[Unicode] HARC CArcDll::OpenArchiveW(const HWND _hwnd, LPCWSTR _szFileName,const DWORD _dwMode){ typedef HARC(WINAPI*POPENARCHIVEW)(const HWND, LPCWSTR,const DWORD); POPENARCHIVEW pOpenArchiveW; m_hArc=NULL; if(QueryFunctionList(ISARC_OPEN_ARCHIVE)==true){ if((pOpenArchiveW=(POPENARCHIVEW)GetProcAddress(_T("OpenArchiveW")))==NULL){ pOpenArchiveW=(POPENARCHIVEW)GetProcAddress(_T("OpenArchive")); } if(pOpenArchiveW!=NULL){ if(GetRunning()==false){ m_hArc=pOpenArchiveW(_hwnd,_szFileName,_dwMode); } } } return m_hArc; } //OpenArchive()で割り付けたハンドルを解放する int CArcDll::CloseArchive(){ typedef int(WINAPI*PCLOSEARCHIVE)(HARC); PCLOSEARCHIVE pCloseArchive; int iResult=-1; if(QueryFunctionList(ISARC_CLOSE_ARCHIVE)==true){ if((pCloseArchive=(PCLOSEARCHIVE)GetProcAddress(_T("CloseArchive")))!=NULL){ iResult=pCloseArchive(m_hArc); } } m_hArc=NULL; return iResult; } //最初の格納ファイルの情報を得ます int CArcDll::FindFirst(LPCTSTR _szWildName,INDIVIDUALINFO FAR *lpSubInfo){ typedef int(WINAPI*PFINDFIRST)(HARC,LPCTSTR,INDIVIDUALINFO FAR *); PFINDFIRST pFindFirst; int iResult=-1; if(QueryFunctionList(ISARC_FIND_FIRST)==true){ if((pFindFirst=(PFINDFIRST)GetProcAddress(_T("FindFirst")))!=NULL){ iResult=pFindFirst(m_hArc,_szWildName,lpSubInfo); } } return iResult; } //最初の格納ファイルの情報を得ます[ANSI] int CArcDll::FindFirstA(LPCSTR _szWildName,INDIVIDUALINFOA FAR *lpSubInfo){ typedef int(WINAPI*PFINDFIRSTA)(HARC,LPCSTR,INDIVIDUALINFOA FAR *); PFINDFIRSTA pFindFirstA; int iResult=-1; if(QueryFunctionList(ISARC_FIND_FIRST)==true){ if((pFindFirstA=(PFINDFIRSTA)GetProcAddress(_T("FindFirstA")))==NULL){ pFindFirstA=(PFINDFIRSTA)GetProcAddress(_T("FindFirst")); } if(pFindFirstA!=NULL){ iResult=pFindFirstA(m_hArc,_szWildName,lpSubInfo); } } return iResult; } //最初の格納ファイルの情報を得ます[Unicode] int CArcDll::FindFirstW(LPCWSTR _szWildName,INDIVIDUALINFOW FAR *lpSubInfo){ typedef int(WINAPI*PFINDFIRSTW)(HARC,LPCWSTR,INDIVIDUALINFOW FAR *); PFINDFIRSTW pFindFirstW; int iResult=-1; if(QueryFunctionList(ISARC_FIND_FIRST)==true){ if((pFindFirstW=(PFINDFIRSTW)GetProcAddress(_T("FindFirstW")))==NULL){ pFindFirstW=(PFINDFIRSTW)GetProcAddress(_T("FindFirst")); } if(pFindFirstW!=NULL){ iResult=pFindFirstW(m_hArc,_szWildName,lpSubInfo); } } return iResult; } //次の格納ファイルの情報を得ます int CArcDll::FindNext(INDIVIDUALINFO FAR *_lpSubInfo){ typedef int(WINAPI*PFINDNEXT)(HARC,INDIVIDUALINFO FAR *); PFINDNEXT pFindNext; int iResult=2; if(QueryFunctionList(ISARC_FIND_NEXT)==true){ if((pFindNext=(PFINDNEXT)GetProcAddress(_T("FindNext")))!=NULL){ iResult=pFindNext(m_hArc,_lpSubInfo); } } return iResult; } //次の格納ファイルの情報を得ます int CArcDll::FindNextA(INDIVIDUALINFOA FAR *_lpSubInfo){ typedef int(WINAPI*PFINDNEXTA)(HARC,INDIVIDUALINFOA FAR *); PFINDNEXTA pFindNextA; int iResult=2; if(QueryFunctionList(ISARC_FIND_NEXT)==true){ if((pFindNextA=(PFINDNEXTA)GetProcAddress(_T("FindNextA")))==NULL){ pFindNextA=(PFINDNEXTA)GetProcAddress(_T("FindNext")); } if(pFindNextA!=NULL){ iResult=pFindNextA(m_hArc,_lpSubInfo); } } return iResult; } //次の格納ファイルの情報を得ます[Unicode] int CArcDll::FindNextW(INDIVIDUALINFOW FAR *_lpSubInfo){ typedef int(WINAPI*PFINDNEXTW)(HARC,INDIVIDUALINFOW FAR *); PFINDNEXTW pFindNextW; int iResult=2; if(QueryFunctionList(ISARC_FIND_NEXT)==true){ if((pFindNextW=(PFINDNEXTW)GetProcAddress(_T("FindNextW")))==NULL){ pFindNextW=(PFINDNEXTW)GetProcAddress(_T("FindNext")); } if(pFindNextW!=NULL){ iResult=pFindNextW(m_hArc,_lpSubInfo); } } return iResult; } //格納ファイルのファイル名を得ます int CArcDll::GetFileName(LPTSTR _lpBuffer,const int _nSize){ typedef int(WINAPI*PGETFILENAME)(HARC,LPTSTR,const int); PGETFILENAME pGetFileName; int iResult=-1; if(QueryFunctionList(ISARC_GET_FILE_NAME)==true){ if((pGetFileName=(PGETFILENAME)GetProcAddress(_T("GetFileName")))!=NULL){ iResult=pGetFileName(m_hArc,_lpBuffer,_nSize); } } return iResult; } //格納ファイルのファイル名を得ます[ANSI] int CArcDll::GetFileNameA(LPSTR _lpBuffer,const int _nSize){ typedef int(WINAPI*PGETFILENAMEA)(HARC,LPSTR,const int); PGETFILENAMEA pGetFileNameA; int iResult=-1; if(QueryFunctionList(ISARC_GET_FILE_NAME)==true){ if((pGetFileNameA=(PGETFILENAMEA)GetProcAddress(_T("GetFileNameA")))==NULL){ pGetFileNameA=(PGETFILENAMEA)GetProcAddress(_T("GetFileName")); } if(pGetFileNameA!=NULL){ iResult=pGetFileNameA(m_hArc,_lpBuffer,_nSize); } } return iResult; } //格納ファイルのファイル名を得ます[Unicode] int CArcDll::GetFileNameW(LPWSTR _lpBuffer,const int _nSize){ typedef int(WINAPI*PGETFILENAMEW)(HARC,LPWSTR,const int); PGETFILENAMEW pGetFileNameW; int iResult=-1; if(QueryFunctionList(ISARC_GET_FILE_NAME)==true){ if((pGetFileNameW=(PGETFILENAMEW)GetProcAddress(_T("GetFileNameW")))==NULL){ pGetFileNameW=(PGETFILENAMEW)GetProcAddress(_T("GetFileName")); } if(pGetFileNameW!=NULL){ iResult=pGetFileNameW(m_hArc,_lpBuffer,_nSize); } } return iResult; } //格納ファイルのサイズを64ビット整数で得ます bool CArcDll::GetOriginalSizeEx(ULHA_INT64* lpllSize){ typedef bool(WINAPI*PGETORIGINALSIZEEX)(HARC,ULHA_INT64*); PGETORIGINALSIZEEX pGetOriginalSizeEx; bool bResult=false; if(QueryFunctionList(ISARC_GET_ARC_ORIGINAL_SIZE_EX)==true){ if((pGetOriginalSizeEx=(PGETORIGINALSIZEEX)GetProcAddress(_T("GetOriginalSizeEx")))!=NULL){ bResult=pGetOriginalSizeEx(m_hArc,lpllSize); } } return bResult; } //格納ファイルの圧縮サイズを得ます bool CArcDll::GetCompressedSizeEx(ULHA_INT64* lpllSize){ typedef bool(WINAPI*PGETCOMPRESSEDSIZEEX)(HARC,ULHA_INT64*); PGETCOMPRESSEDSIZEEX pGetCompressedSizeEx; bool bResult=false; if(QueryFunctionList(ISARC_GET_ARC_COMPRESSED_SIZE_EX)==true){ if((pGetCompressedSizeEx=(PGETCOMPRESSEDSIZEEX)GetProcAddress(_T("GetCompressedSizeEx")))!=NULL){ bResult=pGetCompressedSizeEx(m_hArc,lpllSize); } } return bResult; } //格納ファイルの属性を得ます int CArcDll::GetAttribute(){ typedef int(WINAPI*PGETATTRIBUTE)(HARC); PGETATTRIBUTE pGetAttribute; int iResult=-1; if(QueryFunctionList(ISARC_GET_ATTRIBUTE)==true){ if((pGetAttribute=(PGETATTRIBUTE)GetProcAddress(_T("GetAttribute")))!=NULL){ iResult=pGetAttribute(m_hArc); } } return iResult; } //メモリーバッファへ展開します int CArcDll::ExtractMem(HWND hwnd,LPCTSTR szCmdLine,LPBYTE szBuffer,const DWORD dwSize,time_t* lpTime,LPWORD lpwAttr,LPDWORD lpdwWriteSize){ typedef int(WINAPI*PEXTRACTMEM)(HWND,LPCTSTR,LPBYTE,const DWORD,time_t*,LPWORD,LPDWORD); PEXTRACTMEM pExtractMem; int iResult=-1; if((pExtractMem=(PEXTRACTMEM)GetProcAddress(_T("ExtractMem")))!=NULL){ iResult=pExtractMem(hwnd,szCmdLine,szBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize); } return iResult; } //メモリーバッファへ展開します[ANSI] int CArcDll::ExtractMemA(HWND hwnd,LPCSTR szCmdLine,LPBYTE szBuffer,const DWORD dwSize,time_t* lpTime,LPWORD lpwAttr,LPDWORD lpdwWriteSize){ typedef int(WINAPI*PEXTRACTMEMA)(HWND,LPCSTR,LPBYTE,const DWORD,time_t*,LPWORD,LPDWORD); PEXTRACTMEMA pExtractMemA; int iResult=-1; if((pExtractMemA=(PEXTRACTMEMA)GetProcAddress(_T("ExtractMemA")))==NULL){ pExtractMemA=(PEXTRACTMEMA)GetProcAddress(_T("ExtractMem")); } if(pExtractMemA!=NULL){ iResult=pExtractMemA(hwnd,szCmdLine,szBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize); } return iResult; } //メモリーバッファへ展開します[Unicode] int CArcDll::ExtractMemW(HWND hwnd,LPCWSTR szCmdLine,LPBYTE szBuffer,const DWORD dwSize,time_t* lpTime,LPWORD lpwAttr,LPDWORD lpdwWriteSize){ typedef int(WINAPI*PEXTRACTMEMW)(HWND,LPCWSTR,LPBYTE,const DWORD,time_t*,LPWORD,LPDWORD); PEXTRACTMEMW pExtractMemW; int iResult=-1; if((pExtractMemW=(PEXTRACTMEMW)GetProcAddress(_T("ExtractMemW")))==NULL){ pExtractMemW=(PEXTRACTMEMW)GetProcAddress(_T("ExtractMem")); } if(pExtractMemW!=NULL){ iResult=pExtractMemW(hwnd,szCmdLine,szBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize); } return iResult; }
Home > ソフトウェア > Ashley > Ashley130.zip/Ashley130.exe > Src > ArcDll.cpp