Frost Moon Project

Src/ArcDll.cpp-Ashley Ver.1.30- - Frost Moon Project アクセスランキング

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