Files
2026-08-07 17:38:18 +09:00

404 lines
8.6 KiB
C++

// SPConsole.cpp : 응용 프로그램에 대한 클래스 동작을 정의합니다.
//
#include "stdafx.h"
#include "ConsoleApp.h"
#include "MainFrm.h"
#include "CustomControlSite.h"
//#include "Options.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CSPConsoleApp
BEGIN_MESSAGE_MAP(CSPConsoleApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
END_MESSAGE_MAP()
// CSPConsoleApp 생성
CSPConsoleApp::CSPConsoleApp()
{
m_pimpldisp = NULL;
}
CSPConsoleApp::~CSPConsoleApp()
{
if (m_pimpldisp)
delete m_pimpldisp;
}
// 유일한 CSPConsoleApp 개체입니다.
CSPConsoleApp theApp;
// CSPConsoleApp 초기화
BOOL CSPConsoleApp::InitInstance()
{
// 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControls()가 필요합니다.
// InitCommonControls()를 사용하지 않으면 창을 만들 수 없습니다.
InitCommonControls();
CWinApp::InitInstance();
// OLE 라이브러리를 초기화합니다.
if (!AfxOleInit()) {
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
CCustomOccManager *poccmgr = new CCustomOccManager;
m_pimpldisp = new CImpIDispatch;
AfxEnableControlContainer(poccmgr);
CString strCmd = m_lpCmdLine;
if (strCmd.IsEmpty())
{
char szPath[MAX_PATH]={0};
GetCurrentPath(szPath);
CString strPath;
strPath.Format("%s\\SP-Updater.exe",szPath);
#ifndef _DEBUG
ShellExecute(NULL,"open",strPath,NULL,NULL,SW_SHOW);
return FALSE;
#endif
}
HANDLE hMutex;
do
{
hMutex = ::CreateMutex(NULL, TRUE, _T("SP-UpdaterXXXXXXXXXXXXXXX"));
}while(GetLastError() == ERROR_ALREADY_EXISTS);
CloseHandle(hMutex);
// 업데이터 업데이트 - 업데이터에 의해 실행되는 경우 뿐이다.
if (strCmd == "1")
{
char szPath[MAX_PATH]={0};
GetCurrentPath(szPath);
CString strSrcPath;
CString strDesPath;
strSrcPath.Format("%s\\update\\SP-Updater.exe",szPath);
strDesPath.Format("%s\\SP-Updater.exe",szPath);
if(CopyFile(strSrcPath,strDesPath,FALSE))
DeleteFile(strSrcPath);
}
char szPath[MAX_PATH]={0};
GetCurrentPath(szPath);
CString strPath;
strPath.Format(_T("%s\\%s"),szPath,CFG_FILENAME);
COptions::Init(strPath);
CMainFrame* pFrame = new CMainFrame;
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
if (pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW, NULL, NULL)) {
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
}
#ifdef _DEBUG
AfxCheckMemory();
#endif
return TRUE;
}
// CSPConsoleApp 메시지 처리기
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 대화 상자 데이터
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
// 구현
protected:
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// 대화 상자를 실행하기 위한 응용 프로그램 명령입니다.
void CSPConsoleApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
// CSPConsoleApp 메시지 처리기
// 사용자 정의 함수
CString GetErrorMessage(DWORD dwError)
{
CString sError;
LPVOID lpBuffer;
if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpBuffer, 0, NULL))
sError = "알 수 없는 오류입니다.";
else
sError = (LPCTSTR)lpBuffer;
LocalFree(lpBuffer);
return sError;
}
BOOL DeleteDirectory(CString sDirectory)
{
/*
// no UI
if (sDirectory.Right(1) != _T("\\"))
sDirectory += _T("\\");
sDirectory += _T("*");
CFileFind finder;
BOOL bFound = finder.FindFile(sDirectory);
while (bFound) {
bFound = finder.FindNextFile();
if (finder.IsDots())
continue;
if (finder.IsDirectory()) {
if (!DeleteDirectory(finder.GetFilePath()))
return false;
}
else {
if (!DeleteFile(finder.GetFilePath()))
return false;
}
}
finder.Close();
sDirectory = sDirectory.Left(sDirectory.ReverseFind('\\'));
RemoveDirectory(sDirectory);
return true;
*/
// UI
if (sDirectory.Right(1) == _T("\\"))
sDirectory.Delete(sDirectory.GetLength());
char szPath[MAX_PATH];
ZeroMemory(szPath, sizeof(szPath));
CopyMemory(szPath, sDirectory, sDirectory.GetLength());
SHFILEOPSTRUCT shfo = {0};
shfo.hwnd = NULL;
shfo.wFunc = FO_DELETE;
shfo.pFrom = szPath;
shfo.pTo = NULL;
shfo.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI;
shfo.fAnyOperationsAborted = false;
shfo.hNameMappings = NULL;
shfo.lpszProgressTitle = NULL;
return SHFileOperation(&shfo) == 0;
}
int KrCompare(LPCTSTR pszText1, LPCTSTR pszText2)
{
int nLen = (int)strlen(pszText1);
PBYTE pbyText1 = (PBYTE)pszText1;
PBYTE pbyText2 = (PBYTE)pszText2;
BOOL bText1Alpha, bText2Alpha;
for (int i = 0; i < nLen; i++) {
if (pbyText2[i] == NULL)
return 1;
if (pbyText1[i] == pbyText2[i])
continue;
bText1Alpha = isalpha(pbyText1[i]);
bText2Alpha = isalpha(pbyText2[i]);
if (!bText1Alpha && bText2Alpha)
return -1;
if (bText1Alpha && !bText2Alpha)
return 1;
if (pbyText1[i] < pbyText2[i])
return -1;
if (pbyText1[i] > pbyText2[i])
return 1;
}
if (pbyText2[nLen] != NULL)
return -1;
return 0;
}
CString NumericFormat(__int64 nNumeric)
{
CString sNumeric;
sNumeric.Format("%I64d", nNumeric);
int nStartPos = sNumeric.GetLength();
for (int i = nStartPos, j = 0; i > 0; i--, j++) {
if (i != nStartPos && (j % 3) == 0)
sNumeric.Insert(i, ',');
}
return sNumeric;
}
CString NumericFormatWithPoint(long double nNumeric)
{
CString sNumeric;
sNumeric.Format("%.2f", nNumeric);
int nStartPos = sNumeric.Find('.');
for (int i = nStartPos, j = 0; i > 0; i--, j++) {
if (i != nStartPos && (j % 3) == 0)
sNumeric.Insert(i, ',');
}
return sNumeric;
}
CString BYTE2KMBYTE(__int64 nBytes, int nFlag, bool bShowDecimalPoint)
{
CString sValue;
char* szUnit[] = {"Bytes", "KB", "MB", "GB", "TB", "PT"};
if (nFlag == 0) {
for (nFlag = 5; nFlag > 0; nFlag--)
if (((UINT64)nBytes >> (nFlag * 10)) >= 1)
break;
}
double nPow = pow(1024.0, (double)nFlag);
if (bShowDecimalPoint && nFlag > 0)
sValue = NumericFormatWithPoint((long double)nBytes / nPow) + szUnit[nFlag];
else
sValue = NumericFormat((__int64)ceil((long double)nBytes / nPow)) + szUnit[nFlag];
return sValue;
}
CString GetValidFileName(LPCTSTR pszFileName)
{
CString sFileName = pszFileName;
if (sFileName.Find('/') >= 0 || sFileName.Find('\\') >= 0 || sFileName.Find(':') >= 0
|| sFileName.Find('*') >= 0 || sFileName.Find('?') >= 0 || sFileName.Find('"') >= 0
|| sFileName.Find('<') >= 0 || sFileName.Find('>') >= 0 || sFileName.Find('|') >= 0) {
AfxMessageBox("파일명에 다음과 같은 문자가 올 수 없습니다:\n/ \\ : * ? \" < > |", MB_ICONEXCLAMATION);
return "";
}
sFileName.Trim();
return sFileName;
}
bool IsPathItself(CString sSrcPath, CString sDstPath)
{
int nSrcLen = sSrcPath.GetLength();
if (nSrcLen > sDstPath.GetLength())
return false;
int iPos = sDstPath.Find(nSrcLen, '/');
if (iPos > 0)
sDstPath = sDstPath.Left(iPos);
return sSrcPath == sDstPath;
}
bool WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite)
{
DWORD dwWritten;
while (nNumberOfBytesToWrite > 0) {
if (!WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, &dwWritten, NULL))
return false;
nNumberOfBytesToWrite -= dwWritten;
}
return true;
}
int GetCurrentPath(char* pszPath)
{
char szPath[MAX_PATH*2]={0};
char* pData;
GetModuleFileName(NULL,szPath,MAX_PATH);
pData = strrchr(szPath,'\\');
__w64 int len = pData-szPath;
strncpy(pszPath,szPath,len);
pszPath[len] = 0; //cause wcsncpy does not appent null character
return (int)len;
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
#ifdef _OPENDISK
SetWindowText("Opendisk Console 정보");
GetDlgItem(IDC_STATIC_ABOUT)->SetWindowText("Opendisk Console V1.0.1.0");
#else
SetWindowText("SP-Console 정보");
GetDlgItem(IDC_STATIC_ABOUT)->SetWindowText("ICS SP-Console V1.0.1.0");
#endif
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}