mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-12 03:09:57 -06:00
Initialer Commit
This commit is contained in:
235
CPP/7zip/Bundles/SFXWin/SfxWin.cpp
Normal file
235
CPP/7zip/Bundles/SFXWin/SfxWin.cpp
Normal file
@@ -0,0 +1,235 @@
|
||||
// Main.cpp
|
||||
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "../../../Common/MyWindows.h"
|
||||
|
||||
#include <Shlwapi.h>
|
||||
|
||||
#include "../../../Common/MyInitGuid.h"
|
||||
|
||||
#include "../../../Common/CommandLineParser.h"
|
||||
#include "../../../Common/StringConvert.h"
|
||||
|
||||
#include "../../../Windows/DLL.h"
|
||||
#include "../../../Windows/ErrorMsg.h"
|
||||
#include "../../../Windows/FileDir.h"
|
||||
#include "../../../Windows/FileName.h"
|
||||
#include "../../../Windows/NtCheck.h"
|
||||
#include "../../../Windows/ResourceString.h"
|
||||
|
||||
#include "../../ICoder.h"
|
||||
#include "../../IPassword.h"
|
||||
#include "../../Archive/IArchive.h"
|
||||
#include "../../UI/Common/Extract.h"
|
||||
#include "../../UI/Common/ExitCode.h"
|
||||
#include "../../UI/Explorer/MyMessages.h"
|
||||
#include "../../UI/FileManager/MyWindowsNew.h"
|
||||
#include "../../UI/GUI/ExtractGUI.h"
|
||||
#include "../../UI/GUI/ExtractRes.h"
|
||||
|
||||
using namespace NWindows;
|
||||
using namespace NFile;
|
||||
using namespace NDir;
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
|
||||
#ifndef UNDER_CE
|
||||
|
||||
DWORD g_ComCtl32Version;
|
||||
|
||||
static DWORD GetDllVersion(LPCTSTR dllName)
|
||||
{
|
||||
DWORD dwVersion = 0;
|
||||
HINSTANCE hinstDll = LoadLibrary(dllName);
|
||||
if (hinstDll)
|
||||
{
|
||||
DLLGETVERSIONPROC pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion");
|
||||
if (pDllGetVersion)
|
||||
{
|
||||
DLLVERSIONINFO dvi;
|
||||
ZeroMemory(&dvi, sizeof(dvi));
|
||||
dvi.cbSize = sizeof(dvi);
|
||||
HRESULT hr = (*pDllGetVersion)(&dvi);
|
||||
if (SUCCEEDED(hr))
|
||||
dwVersion = MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
|
||||
}
|
||||
FreeLibrary(hinstDll);
|
||||
}
|
||||
return dwVersion;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
bool g_LVN_ITEMACTIVATE_Support = true;
|
||||
|
||||
static const wchar_t *kUnknownExceptionMessage = L"ERROR: Unknown Error!";
|
||||
|
||||
void ErrorMessageForHRESULT(HRESULT res)
|
||||
{
|
||||
ShowErrorMessage(HResultToMessage(res));
|
||||
}
|
||||
|
||||
int APIENTRY WinMain2()
|
||||
{
|
||||
// OleInitialize is required for ProgressBar in TaskBar.
|
||||
#ifndef UNDER_CE
|
||||
OleInitialize(NULL);
|
||||
#endif
|
||||
|
||||
#ifndef UNDER_CE
|
||||
g_ComCtl32Version = ::GetDllVersion(TEXT("comctl32.dll"));
|
||||
g_LVN_ITEMACTIVATE_Support = (g_ComCtl32Version >= MAKELONG(71, 4));
|
||||
#endif
|
||||
|
||||
UString password;
|
||||
bool assumeYes = false;
|
||||
bool outputFolderDefined = false;
|
||||
FString outputFolder;
|
||||
UStringVector commandStrings;
|
||||
NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
|
||||
|
||||
#ifndef UNDER_CE
|
||||
if (commandStrings.Size() > 0)
|
||||
commandStrings.Delete(0);
|
||||
#endif
|
||||
|
||||
FOR_VECTOR (i, commandStrings)
|
||||
{
|
||||
const UString &s = commandStrings[i];
|
||||
if (s.Len() > 1 && s[0] == '-')
|
||||
{
|
||||
wchar_t c = MyCharLower_Ascii(s[1]);
|
||||
if (c == 'y')
|
||||
{
|
||||
assumeYes = true;
|
||||
if (s.Len() != 2)
|
||||
{
|
||||
ShowErrorMessage(L"Bad command");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (c == 'o')
|
||||
{
|
||||
outputFolder = us2fs(s.Ptr(2));
|
||||
NName::NormalizeDirPathPrefix(outputFolder);
|
||||
outputFolderDefined = !outputFolder.IsEmpty();
|
||||
}
|
||||
else if (c == 'p')
|
||||
{
|
||||
password = s.Ptr(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FString path;
|
||||
NDLL::MyGetModuleFileName(path);
|
||||
|
||||
FString fullPath;
|
||||
if (!MyGetFullPathName(path, fullPath))
|
||||
{
|
||||
ShowErrorMessage(L"Error 1329484");
|
||||
return 1;
|
||||
}
|
||||
|
||||
CCodecs *codecs = new CCodecs;
|
||||
CMyComPtr<IUnknown> compressCodecsInfo = codecs;
|
||||
HRESULT result = codecs->Load();
|
||||
if (result != S_OK)
|
||||
{
|
||||
ErrorMessageForHRESULT(result);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// COpenCallbackGUI openCallback;
|
||||
|
||||
// openCallback.PasswordIsDefined = !password.IsEmpty();
|
||||
// openCallback.Password = password;
|
||||
|
||||
CExtractCallbackImp *ecs = new CExtractCallbackImp;
|
||||
CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
|
||||
ecs->Init();
|
||||
|
||||
#ifndef _NO_CRYPTO
|
||||
ecs->PasswordIsDefined = !password.IsEmpty();
|
||||
ecs->Password = password;
|
||||
#endif
|
||||
|
||||
CExtractOptions eo;
|
||||
|
||||
FString dirPrefix;
|
||||
if (!GetOnlyDirPrefix(path, dirPrefix))
|
||||
{
|
||||
ShowErrorMessage(L"Error 1329485");
|
||||
return 1;
|
||||
}
|
||||
|
||||
eo.OutputDir = outputFolderDefined ? outputFolder : dirPrefix;
|
||||
eo.YesToAll = assumeYes;
|
||||
eo.OverwriteMode = assumeYes ?
|
||||
NExtract::NOverwriteMode::kOverwrite :
|
||||
NExtract::NOverwriteMode::kAsk;
|
||||
eo.PathMode = NExtract::NPathMode::kFullPaths;
|
||||
eo.TestMode = false;
|
||||
|
||||
UStringVector v1, v2;
|
||||
v1.Add(fs2us(fullPath));
|
||||
v2.Add(fs2us(fullPath));
|
||||
NWildcard::CCensorNode wildcardCensor;
|
||||
wildcardCensor.AddItem(true, L"*", true, true, true, true);
|
||||
|
||||
bool messageWasDisplayed = false;
|
||||
result = ExtractGUI(codecs,
|
||||
CObjectVector<COpenType>(), CIntVector(),
|
||||
v1, v2,
|
||||
wildcardCensor, eo, (assumeYes ? false: true), messageWasDisplayed, ecs);
|
||||
|
||||
if (result == S_OK)
|
||||
{
|
||||
if (!ecs->IsOK())
|
||||
return NExitCode::kFatalError;
|
||||
return 0;
|
||||
}
|
||||
if (result == E_ABORT)
|
||||
return NExitCode::kUserBreak;
|
||||
if (!messageWasDisplayed)
|
||||
{
|
||||
if (result == S_FALSE)
|
||||
ShowErrorMessage(L"Error in archive");
|
||||
else
|
||||
ErrorMessageForHRESULT(result);
|
||||
}
|
||||
if (result == E_OUTOFMEMORY)
|
||||
return NExitCode::kMemoryError;
|
||||
return NExitCode::kFatalError;
|
||||
}
|
||||
|
||||
#define NT_CHECK_FAIL_ACTION ShowErrorMessage(L"Unsupported Windows version"); return NExitCode::kFatalError;
|
||||
|
||||
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
|
||||
#ifdef UNDER_CE
|
||||
LPWSTR
|
||||
#else
|
||||
LPSTR
|
||||
#endif
|
||||
/* lpCmdLine */, int /* nCmdShow */)
|
||||
{
|
||||
g_hInstance = (HINSTANCE)hInstance;
|
||||
|
||||
NT_CHECK
|
||||
|
||||
try
|
||||
{
|
||||
return WinMain2();
|
||||
}
|
||||
catch(const CNewException &)
|
||||
{
|
||||
ErrorMessageForHRESULT(E_OUTOFMEMORY);
|
||||
return NExitCode::kMemoryError;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
ShowErrorMessage(kUnknownExceptionMessage);
|
||||
return NExitCode::kFatalError;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user