Restructure repository to include all source folders

Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
// ManageSetup.cpp : 응용 프로그램에 대한 클래스 동작을 정의합니다.
//
#include "stdafx.h"
#include "ManageSetup.h"
#include "./Dialog/ManageSetupDlg.h"
#include <DB/ManageServerDB.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CManageSetupApp
BEGIN_MESSAGE_MAP(CManageSetupApp, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
// CManageSetupApp 생성
CManageSetupApp::CManageSetupApp()
{
// TODO: 여기에 생성 코드를 추가합니다.
// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}
// 유일한 CManageSetupApp 개체입니다.
CManageSetupApp theApp;
// CManageSetupApp 초기화
BOOL CManageSetupApp::InitInstance()
{
// 제일 먼저 해 줘야 한다.
if(!CManageServerDB::GetInstance().Initialize())
{
return FALSE;
}
// 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControls()가 필요합니다.
// InitCommonControls()를 사용하지 않으면 창을 만들 수 없습니다.
InitCommonControls();
CWinApp::InitInstance();
AfxEnableControlContainer();
// 표준 초기화
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
// 아래에서 필요 없는 특정 초기화 루틴을 제거해야 합니다.
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
// 적절한 내용으로 수정해야 합니다.
SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성한 응용 프로그램"));
CManageSetupDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 여기에 대화 상자가 확인을 눌러 없어지는 경우 처리할
// 코드를 배치합니다.
}
else if (nResponse == IDCANCEL)
{
// TODO: 여기에 대화 상자가 취소를 눌러 없어지는 경우 처리할
// 코드를 배치합니다.
}
// 대화 상자가 닫혔으므로 응용 프로그램의 메시지 펌프를 시작하지 않고
// 응용 프로그램을 끝낼 수 있도록 FALSE를 반환합니다.
return FALSE;
}

View File

@@ -0,0 +1,31 @@
// ManageSetup.h : PROJECT_NAME 응용 프로그램에 대한 주 헤더 파일입니다.
//
#pragma once
#ifndef __AFXWIN_H__
#error PCH에서 이 파일을 포함하기 전에 'stdafx.h'를 포함하십시오.
#endif
#include "resource.h" // 주 기호
// CManageSetupApp:
// 이 클래스의 구현에 대해서는 ManageSetup.cpp을 참조하십시오.
//
class CManageSetupApp : public CWinApp
{
public:
CManageSetupApp();
// 재정의
public:
virtual BOOL InitInstance();
// 구현
DECLARE_MESSAGE_MAP()
};
extern CManageSetupApp theApp;

View File

@@ -0,0 +1,380 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 한국어 resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
#ifdef _WIN32
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
#pragma code_page(949)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)\r\n"
"LANGUAGE 18, 1\r\n"
"#pragma code_page(949)\r\n"
"#include ""res\\ManageSetup.rc2"" // Microsoft Visual C++에서 편집되지 않은 리소스\r\n"
"#include ""afxres.rc"" // 표준 구성 요소\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\ManageSetup.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "ManageSetup Info"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "ManageSetup Version 1.0",IDC_STATIC,40,10,119,8,
SS_NOPREFIX
LTEXT "Copyright (C) 2008 Youxiland.",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "확인",IDOK,178,7,50,16,WS_GROUP
END
IDD_MANAGECLIENTSETUPDLG DIALOGEX 0, 0, 498, 360
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP |
WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_WINDOWEDGE | WS_EX_APPWINDOW
CAPTION "ManageSetup"
MENU IDR_MENU
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
EDITTEXT IDC_NEWMACHINEIP_EDIT,52,28,67,12
EDITTEXT IDC_NEWMACHINENAME_EDIT,52,44,67,12,ES_AUTOHSCROLL
PUSHBUTTON "Add Server",IDC_MACHINEADD_BTN,41,63,61,13,BS_FLAT
CONTROL "",IDC_MACHINE_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT |
WS_BORDER | WS_TABSTOP,9,88,120,216
EDITTEXT IDC_SELSERVERNAME_EDIT,11,321,81,12,ES_AUTOHSCROLL
PUSHBUTTON "Modify",IDC_MACHINEMODIFY_BTN,93,321,36,12,BS_FLAT
PUSHBUTTON "Delete Server",IDC_MACHINEDEL_BTN,68,338,61,13,BS_FLAT
EDITTEXT IDC_EXEPATH_EDIT,144,27,230,12,ES_AUTOHSCROLL
PUSHBUTTON "Add Path",IDC_ADDEXEPATH_BTN,375,27,51,12,BS_FLAT
CONTROL "",IDC_EXECUTEPATH_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT |
WS_BORDER | WS_TABSTOP,144,42,345,109
EDITTEXT IDC_SELEXEPATH_EDIT,144,166,230,12,ES_AUTOHSCROLL
PUSHBUTTON "Modify Path",IDC_MODIFYEXEPATH_BTN,375,166,51,12,
BS_FLAT
PUSHBUTTON "Delete Path",IDC_DELEXEPATH_BTN,431,166,58,14,BS_FLAT
EDITTEXT IDC_NEWOPTION_EDIT,144,215,230,12,ES_AUTOHSCROLL
PUSHBUTTON "Add Option",IDC_ADDOPTION_BTN,374,215,65,12,BS_FLAT,
WS_EX_ACCEPTFILES
CONTROL "",IDC_OPTION_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_EDITLABELS |
LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,144,232,345,92
EDITTEXT IDC_SELOPTION_EDIT,144,337,230,12,ES_AUTOHSCROLL
PUSHBUTTON "Modify Option",IDC_MODIFYOPTION_BTN,374,337,49,12,
BS_FLAT
PUSHBUTTON "Delete Option",IDC_DELOPTION_BTN,429,336,60,14,BS_FLAT
GROUPBOX "▷ Server Machine List",IDC_STATIC,4,4,130,352,BS_FLAT
GROUPBOX "▶ Execute Path List",IDC_STATIC,138,4,356,181,BS_FLAT
GROUPBOX "▶ Execute Option List",IDC_STATIC,138,192,356,164,
BS_FLAT
LTEXT "IP:",IDC_STATIC,23,30,10,8
LTEXT "NAME:",IDC_STATIC,23,46,22,8
GROUPBOX "New Server Info",IDC_STATIC,13,15,112,67
LTEXT "New Execute Path",IDC_STATIC,144,17,60,8
LTEXT "Selected Path",IDC_STATIC,144,156,45,8
LTEXT "New Option",IDC_STATIC,144,204,39,8
LTEXT "Selected Option",IDC_STATIC,144,327,52,8
LTEXT "Selected Server Name",IDC_STATIC,11,311,71,8
END
IDD_RUNINFOEDITDLG DIALOGEX 0, 0, 491, 350
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "RunInfo Edit"
FONT 9, "MS Shell Dlg", 0, 0, 0x0
BEGIN
COMBOBOX IDC_SERVERIP_CB,35,17,253,224,CBS_DROPDOWNLIST |
CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Server",IDC_STATIC,10,19,21,8
COMBOBOX IDC_EXEPATH_CB,35,32,446,218,CBS_DROPDOWNLIST | CBS_SORT |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Bind",IDC_BIND_BTN,290,48,61,13,BS_FLAT
CONTROL "",IDC_RUNINFO_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT |
WS_BORDER | WS_TABSTOP,9,136,472,188
LTEXT "Path",IDC_STATIC,10,34,15,8
LTEXT "Option",IDC_STATIC,10,50,22,8
GROUPBOX "▶ RunInfo List",IDC_STATIC,4,68,483,278,BS_FLAT
GROUPBOX "▶ RunInfo Binding Info",IDC_STATIC,4,4,483,61,BS_FLAT
PUSHBUTTON "Delete",IDC_DELETERUNINFO_BTN,418,328,61,13,BS_FLAT
EDITTEXT IDC_SELRUNINFOIP_EDIT,14,117,96,12,ES_AUTOHSCROLL |
ES_READONLY
EDITTEXT IDC_SELRUNINFOPATH_EDIT,112,117,265,12,ES_AUTOHSCROLL |
ES_READONLY
EDITTEXT IDC_SELRUNINFOOPT_EDIT,378,117,96,12,ES_AUTOHSCROLL |
ES_READONLY
COMBOBOX IDC_EXEOPT_CB,35,48,253,223,CBS_DROPDOWNLIST | CBS_SORT |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Modify RunInfo",IDC_MODIFYRUNINFO_BTN,413,101,61,13,
BS_FLAT
EDITTEXT IDC_SELRUNINFOINDEX_EDIT,46,98,40,12,ES_CENTER |
ES_AUTOHSCROLL | ES_READONLY
LTEXT "Index:",IDC_STATIC,18,100,21,8
GROUPBOX "▷ Selected RunInfo",IDC_STATIC,9,85,471,48
END
IDD_USERREGEDITDLG DIALOGEX 0, 0, 197, 183
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
FONT 9, "MS Shell Dlg", 0, 0, 0x0
BEGIN
EDITTEXT IDC_USERID,89,25,80,12,ES_AUTOHSCROLL
EDITTEXT IDC_USERNAME,89,50,80,12,ES_AUTOHSCROLL
CONTROL "",IDC_USERIP,"SysIPAddress32",WS_TABSTOP,89,75,80,12
COMBOBOX IDC_USERLV,89,100,80,52,CBS_DROPDOWNLIST | CBS_SORT |
WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_USERPASS,89,125,80,12,ES_PASSWORD | ES_AUTOHSCROLL
PUSHBUTTON "OK",IDC_REGEDITOK_BTN,38,165,52,14,BS_FLAT
PUSHBUTTON "Cancel",IDC_CANCEL,99,165,52,14,BS_FLAT
LTEXT "ID:",IDC_STATIC,28,27,10,8
LTEXT "NAME:",IDC_STATIC,28,52,22,8
LTEXT "IP:",IDC_STATIC,28,77,10,8
LTEXT "ADMIN LV:",IDC_STATIC,28,102,35,8
GROUPBOX "",IDC_STATIC,4,4,189,150,BS_FLAT
EDITTEXT IDC_GROUPNAME_EDIT,16,4,54,12,ES_AUTOHSCROLL |
ES_READONLY | NOT WS_BORDER
LTEXT "PASSWORD:",IDC_STATIC,28,127,40,8
END
IDD_USERMANAGEMENTDLG DIALOGEX 0, 0, 346, 224
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "Admin Management"
FONT 9, "MS Shell Dlg", 0, 0, 0x0
BEGIN
CONTROL "",IDC_USERINFO_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT |
WS_BORDER | WS_TABSTOP,9,16,243,199
GROUPBOX "▶ Admin Infomation",IDC_STATIC,4,4,253,216,BS_FLAT
PUSHBUTTON "Admin Registration",IDC_USER_REG,262,13,80,14,BS_FLAT
PUSHBUTTON "Delete Admin",IDC_USER_DEL,262,206,80,14,BS_FLAT
PUSHBUTTON "Edit Admin Info",IDC_USER_EDIT,262,31,80,14,BS_FLAT
END
IDD_MANAGESETUPCLIENT DIALOGEX 0, 0, 189, 65
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "ManageSetupClient"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
PUSHBUTTON "Generate MangeSetupClient.ini !",
ID_GENERATE_MANAGE_CLIENT_SETUP,7,44,175,14
CONTROL "",IDC_MANAGE_SERVER_IP,"SysIPAddress32",WS_TABSTOP,73,7,
109,14
EDITTEXT IDC_MANAGE_SERVER_PORT,73,24,109,14,ES_AUTOHSCROLL |
ES_READONLY
LTEXT "ManageServerIP",IDC_STATIC,11,10,54,8
LTEXT "ManageServerPort",IDC_STATIC,8,27,61,8
END
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "000004b0"
BEGIN
VALUE "CompanyName", "(C) Youxiland"
VALUE "FileDescription", "Youxiland Inner Tool"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "ManageSetup.exe"
VALUE "LegalCopyright", "(c) Youxiland. All rights reserved."
VALUE "OriginalFilename", "ManageSetup.exe"
VALUE "ProductName", "SetupManage"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 228
TOPMARGIN, 7
BOTTOMMARGIN, 48
END
IDD_MANAGECLIENTSETUPDLG, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 494
TOPMARGIN, 4
BOTTOMMARGIN, 356
END
IDD_RUNINFOEDITDLG, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 487
TOPMARGIN, 4
BOTTOMMARGIN, 346
END
IDD_USERREGEDITDLG, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 193
TOPMARGIN, 4
BOTTOMMARGIN, 179
END
IDD_USERMANAGEMENTDLG, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 342
TOPMARGIN, 4
BOTTOMMARGIN, 220
END
IDD_MANAGESETUPCLIENT, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 182
TOPMARGIN, 7
BOTTOMMARGIN, 58
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MENU MENU
BEGIN
POPUP "Functions(&F)"
BEGIN
MENUITEM "ManageSetupClient(&C)", ID_FUNCTIONS_MANAGESETUPCLIENT
MENUITEM SEPARATOR
MENUITEM "RunInfo Edit(&R)", ID_FUNCTIONS_RUNINFOEDIT
MENUITEM "User Management(&U)", ID_FUNCTIONS_USERMANAGEMENT
MENUITEM SEPARATOR
MENUITEM "Exit(&X)", ID_FUNCTIONS_EXIT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDS_ABOUTBOX "ManageSetup Info(&A)..."
END
#endif // 한국어 resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
LANGUAGE 18, 1
#pragma code_page(949)
#include "res\ManageSetup.rc2" // Microsoft Visual C++에서 편집되지 않은 리소스
#include "afxres.rc" // 표준 구성 요소
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -0,0 +1,211 @@
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="SetupManage"
ProjectGUID="{AB5A4B5A-08AC-4AD8-9453-A95673AA68BE}"
Keyword="MFCProj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="../Executable/$(ConfigurationName)"
IntermediateDirectory="../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="./;../;../../RylServerProject/BaseLibrary;../../RylServerProject/RylServerLibrary;../ManageLibrary"
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
TreatWChar_tAsBuiltInType="TRUE"
UsePrecompiledHeader="2"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="FALSE"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1042"
AdditionalIncludeDirectories="$(IntDir)"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../Executable/$(ConfigurationName)"
IntermediateDirectory="../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="./;../;../../RylServerProject/BaseLibrary;../../RylServerProject/RylServerLibrary;../ManageLibrary"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
MinimalRebuild="FALSE"
RuntimeLibrary="0"
TreatWChar_tAsBuiltInType="TRUE"
UsePrecompiledHeader="2"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="FALSE"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1042"
AdditionalIncludeDirectories="$(IntDir)"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Dialog"
Filter="">
<File
RelativePath=".\ManageSetupClient.cpp">
</File>
<File
RelativePath=".\ManageSetupClient.h">
</File>
<File
RelativePath=".\dialog\ManageSetupDlg.cpp">
</File>
<File
RelativePath=".\dialog\ManageSetupDlg.h">
</File>
<File
RelativePath=".\Dialog\RunInfoEditDlg.cpp">
</File>
<File
RelativePath=".\Dialog\RunInfoEditDlg.h">
</File>
<File
RelativePath=".\Dialog\ServerToolUserManagementDlg.cpp">
</File>
<File
RelativePath=".\Dialog\ServerToolUserManagementDlg.h">
</File>
<File
RelativePath=".\Dialog\UserRegEditDlg.cpp">
</File>
<File
RelativePath=".\Dialog\UserRegEditDlg.h">
</File>
</Filter>
<Filter
Name="Resource"
Filter="">
<File
RelativePath=".\res\ManageSetup.ico">
</File>
<File
RelativePath=".\res\ManageSetup.manifest">
</File>
<File
RelativePath=".\ManageSetup.rc">
</File>
<File
RelativePath=".\res\ManageSetup.rc2">
</File>
</Filter>
<File
RelativePath=".\ManageSetup.cpp">
</File>
<File
RelativePath=".\ManageSetup.h">
</File>
<File
RelativePath=".\ReadMe.txt">
</File>
<File
RelativePath=".\Resource.h">
</File>
<File
RelativePath=".\stdafx.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
<File
RelativePath=".\stdafx.h">
</File>
</Files>
<Globals>
<Global
Name="RESOURCE_FILE"
Value="ManageSetup.rc"/>
</Globals>
</VisualStudioProject>

View File

@@ -0,0 +1,87 @@
// ManageSetupClient.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "ManageSetup.h"
#include "ManageSetupClient.h"
#include ".\managesetupclient.h"
#include <Setup/SetupClient.h>
// CManageSetupClient 대화 상자입니다.
IMPLEMENT_DYNAMIC(CManageSetupClient, CDialog)
CManageSetupClient::CManageSetupClient(CWnd* pParent /*=NULL*/)
: CDialog(CManageSetupClient::IDD, pParent)
, m_Port(0)
, m_IP(0)
{
}
CManageSetupClient::~CManageSetupClient()
{
}
void CManageSetupClient::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_IPAddress(pDX, IDC_MANAGE_SERVER_IP, m_IP);
DDX_Text(pDX, IDC_MANAGE_SERVER_PORT, m_Port);
DDV_MinMaxUInt(pDX, m_Port, 1024, 49151);
DDX_Control(pDX, ID_GENERATE_MANAGE_CLIENT_SETUP, m_GenerateButton);
}
BEGIN_MESSAGE_MAP(CManageSetupClient, CDialog)
ON_BN_CLICKED(ID_GENERATE_MANAGE_CLIENT_SETUP, OnBnClickedGenerateManageClientSetup)
END_MESSAGE_MAP()
// CManageSetupClient 메시지 처리기입니다.
BOOL CManageSetupClient::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
INET_Addr& serverAddr = ManageSetup::ClientSetup::GetInstance().GetManageServerAddr();
m_IP = ntohl(serverAddr.get_addr_in().sin_addr.S_un.S_addr);
m_Port = serverAddr.get_port_in();
char szFileName[MAX_PATH];
char szExtension[MAX_PATH];
_splitpath(ManageSetup::ClientSetup::GetInstance().GetSetupFileName(),
0, 0, szFileName, szExtension);
CString buttonText;
buttonText.Format("Generate %s%s!", szFileName, szExtension);
m_GenerateButton.SetWindowText(buttonText);
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CManageSetupClient::OnBnClickedGenerateManageClientSetup()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(true);
INET_Addr& serverAddr = ManageSetup::ClientSetup::GetInstance().GetManageServerAddr();
in_addr addr;
addr.S_un.S_addr = htonl(m_IP);
serverAddr.set_addr(addr, static_cast<unsigned short>(m_Port));
ManageSetup::ClientSetup::GetInstance().Save();
OnOK();
}

View File

@@ -0,0 +1,33 @@
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
// CManageSetupClient 대화 상자입니다.
class CManageSetupClient : public CDialog
{
DECLARE_DYNAMIC(CManageSetupClient)
public:
CManageSetupClient(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CManageSetupClient();
// 대화 상자 데이터입니다.
enum { IDD = IDD_MANAGESETUPCLIENT };
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedGenerateManageClientSetup();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
private:
CIPAddressCtrl m_IPAddress;
DWORD m_IP;
UINT m_Port;
CButton m_GenerateButton;
};

View File

@@ -0,0 +1,81 @@
================================================================================
MFC 라이브러리 : ManageSetup 프로젝트 개요
================================================================================
응용 프로그램 마법사를 사용하여 ManageSetup 응용 프로그램을 만듭니다. 이 응용
프로그램에서는 기본적인 MFC 사용 밥법과 응용 프로그램 작성 방법을 설명합니다.
이 파일에는 ManageSetup 응용 프로그램을 구성하는 각 파일에 대한 개요가 포함되어
있습니다.
ManageSetup.vcproj
응용 프로그램 마법사를 사용하여 생성된 VC++ 프로젝트의 주 프로젝트 파일입니다.
이 파일에는 파일을 생성한 Visual C++ 버전 정보 및 응용 프로그램 마법사에서 선택한 플랫폼,
구성, 프로젝트 기능 등의 정보가 포함됩니다.
ManageSetup.h
응용 프로그램의 주 헤더 파일입니다. 이 파일에는 다른 프로젝트에 관련된 Resource.h와 같은
특정 헤더가 포함되며 CManageSetupApp 응용 프로그램 클래스가 선언됩니다.
ManageSetup.cpp
CManageSetupApp 응용 프로그램 클래스를 포함하는 주 응용 프로그램의 소스 파일입니다.
ManageSetup.rc
프로그램에서 사용하는 모든 Microsoft Windows 리소스가 나열된 파일입니다.
이 파일에는 RES 하위 디렉터리에 저장된 아이콘, 비트맵 및 커서가 포함되며
Microsoft Visual C++에서 직접 이 파일을 편집할 수도 있습니다. 사용자의 프로젝트
리소스는 1042에 들어 있습니다.
res\ManageSetup.ico
응용 프로그램의 아이콘으로 사용되는 아이콘 파일입니다.
이 아이콘은 주 리소스 파일인 ManageSetup.rc에 포함됩니다.
res\ManageSetup.rc2
Microsoft Visual C++에서 편집할 수 없는 리소스가 포함된 파일입니다.
리소스 편집기에서 편집할 수 없는 모든 리소스는 이 파일에 포함되어 있습니다.
/////////////////////////////////////////////////////////////////////////////
응용 프로그램 마법사에서는 단일 대화 상자 클래스를 만듭니다.
ManageSetupDlg.h, ManageSetupDlg.cpp - 대화 상자
CManageSetupDlg 클래스를 포함하는 파일입니다. 이 클래스에는 응용 프로그램의
주 대화 상자에 대한 동작이 정의됩니다. 대화 상자의 템플릿은 ManageSetup.rc에
있으며 Microsoft Visual C++에서 편집할 수 있습니다.
/////////////////////////////////////////////////////////////////////////////
기타 기능
ActiveX 컨트롤
응용 프로그램에서 ActiveX 컨트롤을 사용할 수 있습니다.
인쇄 및 인쇄 미리보기 지원
응용 프로그램 마법사에서 MFC 라이브러리의 CView 클래스에 있는 멤버 함수를 호출하여
인쇄, 인쇄 설정, 인쇄 미리보기 명령을 처리할 수 있는 코드를 생성합니다.
/////////////////////////////////////////////////////////////////////////////
기타 표준 파일
StdAfx.h, StdAfx.cpp
미리 컴파일된 헤더 파일(PCH) ManageSetup.pch 및 미리 컴파일된
형식 파일 StdAfx.obj를 빌드할 때 사용되는 파일입니다.
Resource.h
새로운 리소스 ID를 정의하는 표준 헤더 파일입니다.
Microsoft Visual C++에서 이 파일을 읽고 업데이트합니다.
/////////////////////////////////////////////////////////////////////////////
기타 정보
응용 프로그램 마법사에서는 "TODO:"를 사용하여 추가하거나 사용자 지정해야 하는
소스 코드를 나타냅니다.
응용 프로그램에서 공유 DLL에 MFC를 사용하고 응용 프로그램의 언어가 운영 체제의
언어와 다른 경우 Microsoft Visual C++ CD-ROM의 Win\System 디렉터리에 있는
해당 지역의 리소스인 MFC70XXX.DLL을 컴퓨터의 system 또는 system32 디렉터리에
복사한 다음 MFCLOC.DLL로 이름을 바꾸어야 합니다. "XXX"는 해당 언어를 나타내는
약어입니다. 예를 들어 MFC70DEU.DLL에는 독일어로 변환된 리소스가 포함됩니다.
이런 작업을 하지 않으면 응용 프로그램의 일부 UI 요소가 운영 체제의 언어로
남아 있게 됩니다.
/////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,729 @@
// ManageSetupDlg.cpp : 구현 파일
//
#include "stdafx.h"
#include "ManageSetup.h"
#include "ManageSetupDlg.h"
#include "ManageSetupClient.h"
#include "ServerToolUserManagementDlg.h"
#include "RunInfoEditDlg.h"
#include <ServerManage/ManageClientManager.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 대화 상자 데이터
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
// 구현
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CManageSetupDlg 대화 상자
CManageSetupDlg::CManageSetupDlg(CWnd* pParent /*=NULL*/)
: CDialog(CManageSetupDlg::IDD, pParent)
, m_strNewServerIP(_T(""))
, m_strNewServerName(_T(""))
, m_strNewExePath(_T(""))
, m_strSelExePath(_T(""))
, m_strSelServerName(_T(""))
, m_strNewOption(_T(""))
, m_strSelOption(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CManageSetupDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control (pDX, IDC_MACHINE_LIST, m_ctrlMachine);
DDX_Control (pDX, IDC_EXECUTEPATH_LIST, m_ctrlExecutePath);
DDX_Text (pDX, IDC_NEWMACHINEIP_EDIT, m_strNewServerIP);
DDX_Text (pDX, IDC_NEWMACHINENAME_EDIT, m_strNewServerName);
DDX_Text (pDX, IDC_EXEPATH_EDIT, m_strNewExePath);
DDX_Text (pDX, IDC_SELEXEPATH_EDIT, m_strSelExePath);
DDX_Text (pDX, IDC_SELSERVERNAME_EDIT, m_strSelServerName);
DDX_Text(pDX, IDC_NEWOPTION_EDIT, m_strNewOption);
DDX_Text(pDX, IDC_SELOPTION_EDIT, m_strSelOption);
DDX_Control(pDX, IDC_OPTION_LIST, m_ctrlOption);
}
BEGIN_MESSAGE_MAP(CManageSetupDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_MACHINEADD_BTN, OnBnClickedMachineaddBtn)
ON_BN_CLICKED(IDC_MACHINEMODIFY_BTN, OnBnClickedMachinemodifyBtn)
ON_BN_CLICKED(IDC_MACHINEDEL_BTN, OnBnClickedMachinedelBtn)
ON_BN_CLICKED(IDC_ADDEXEPATH_BTN, OnBnClickedAddexepathBtn)
ON_BN_CLICKED(IDC_DELEXEPATH_BTN, OnBnClickedDelexepathBtn)
ON_BN_CLICKED(IDC_MODIFYEXEPATH_BTN, OnBnClickedModifyexepathBtn)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_EXECUTEPATH_LIST, OnLvnItemchangedExecutepathList)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_MACHINE_LIST, OnLvnItemchangedMachineList)
ON_COMMAND(ID_FUNCTIONS_RUNINFOEDIT, OnFunctionsRuninfoedit)
ON_COMMAND(ID_FUNCTIONS_USERMANAGEMENT, OnFunctionsUsermanagement)
ON_BN_CLICKED(IDC_ADDOPTION_BTN, OnBnClickedAddoptionBtn)
ON_BN_CLICKED(IDC_MODIFYOPTION_BTN, OnBnClickedModifyoptionBtn)
ON_BN_CLICKED(IDC_DELOPTION_BTN, OnBnClickedDeloptionBtn)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_OPTION_LIST, OnLvnItemchangedOptionList)
ON_COMMAND(ID_FUNCTIONS_MANAGESETUPCLIENT, OnFunctionsManagesetupclient)
ON_COMMAND(ID_FUNCTIONS_EXIT, OnFunctionsExit)
END_MESSAGE_MAP()
// CManageSetupDlg 메시지 처리기
BOOL CManageSetupDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
// 프레임워크가 이 작업을 자동으로 수행합니다.
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
// 각종 컨트롤 초기화 및 설정
m_ctrlMachine.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB );
m_ctrlMachine.SetBkColor ( COLORREF RGB( 255, 170, 170) );
m_ctrlMachine.SetTextBkColor ( COLORREF RGB( 255, 170, 170) );
m_ctrlMachine.InsertColumn ( 0, _T("IP"), LVCFMT_LEFT, 105 );
m_ctrlMachine.InsertColumn ( 1, _T("Name"), LVCFMT_LEFT, 80 );
m_ctrlExecutePath.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB );
m_ctrlExecutePath.SetBkColor ( COLORREF RGB( 230, 243, 254) );
m_ctrlExecutePath.SetTextBkColor ( COLORREF RGB( 230, 243, 254) );
m_ctrlExecutePath.InsertColumn ( 0, _T("Index"), LVCFMT_LEFT, 55 );
m_ctrlExecutePath.InsertColumn ( 1, _T("Full Path"), LVCFMT_LEFT, 510 );
m_ctrlOption.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB );
m_ctrlOption.SetBkColor ( COLORREF RGB( 255, 255, 193) );
m_ctrlOption.SetTextBkColor ( COLORREF RGB( 255, 255, 193) );
m_ctrlOption.InsertColumn ( 0, _T("Index"), LVCFMT_LEFT, 55 );
m_ctrlOption.InsertColumn ( 1, _T("Run Option"), LVCFMT_LEFT, 510 );
ServerListSet();
ExecutePathListSet();
OptionListSet();
return TRUE; // 컨트롤에 대한 포커스를 설정하지 않을 경우 TRUE를 반환합니다.
}
void CManageSetupDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
// 프레임워크에서 이 작업을 자동으로 수행합니다.
void CManageSetupDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
// 이 함수를 호출합니다.
HCURSOR CManageSetupDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
// -----------------------------------------------------------------------------------
// 리스트 컨트롤 갱신
void CManageSetupDlg::ServerListSet()
{
m_ctrlMachine.DeleteAllItems();
CManageClientManager::RunTable runTable;
CManageClientManager::GetInstance().Get(CManageClientManager::SERVER_INFO, runTable);
CManageClientManager::RunTable::iterator pos = runTable.begin();
CManageClientManager::RunTable::iterator end = runTable.end();
unsigned int nIndex = 0;
in_addr addr;
for(; pos != end; ++pos, ++nIndex)
{
ServerManage::RunInfo& runInfo = pos->second;
addr.S_un.S_addr = runInfo.m_dwServerIP;
m_ctrlMachine.InsertItem(nIndex, inet_ntoa(addr));
m_ctrlMachine.SetItemText(nIndex, 1, runInfo.m_szServerName);
}
}
void CManageSetupDlg::ExecutePathListSet()
{
m_ctrlExecutePath.DeleteAllItems();
CManageClientManager::RunTable runTable;
CManageClientManager::GetInstance().Get(CManageClientManager::RUN_PATH_INFO, runTable);
CManageClientManager::RunTable::iterator pos = runTable.begin();
CManageClientManager::RunTable::iterator end = runTable.end();
const int MIN_BUFFER = 64;
char szPathID[MIN_BUFFER];
unsigned int nIndex = 0;
for(; pos != end; ++pos, ++nIndex)
{
ServerManage::RunInfo& runInfo = pos->second;
_snprintf(szPathID, MIN_BUFFER - 1, "%lu", runInfo.m_dwPathID);
szPathID[MIN_BUFFER - 1] = 0;
m_ctrlExecutePath.InsertItem(nIndex, szPathID);
m_ctrlExecutePath.SetItemText(nIndex, 1, runInfo.m_szPath);
}
}
void CManageSetupDlg::OptionListSet()
{
m_ctrlOption.DeleteAllItems();
CManageClientManager::RunTable runTable;
CManageClientManager::GetInstance().Get(CManageClientManager::OPTION_INFO, runTable);
CManageClientManager::RunTable::iterator pos = runTable.begin();
CManageClientManager::RunTable::iterator end = runTable.end();
const int MIN_BUFFER = 64;
char szOptionID[MIN_BUFFER];
unsigned int nIndex = 0;
for(; pos != end; ++pos, ++nIndex)
{
ServerManage::RunInfo& runInfo = pos->second;
_snprintf(szOptionID, MIN_BUFFER - 1, "%lu", runInfo.m_dwOptionID);
szOptionID[MIN_BUFFER - 1] = 0;
m_ctrlOption.InsertItem(nIndex, szOptionID);
m_ctrlOption.SetItemText(nIndex, 1, runInfo.m_szOption);
}
}
//-----------------------------------------------------------------------------
// 서버 정보 추가, 수정, 삭제
void CManageSetupDlg::OnBnClickedMachineaddBtn()
{
UpdateData(true);
if( (m_strNewServerIP != "") && (m_strNewServerName != "") )
{
unsigned long dwServerID = 0;
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwServerIP = inet_addr(m_strNewServerIP);
_snprintf(runInfo.m_szServerName, ServerManage::RunInfo::MAX_SERVER_NAME - 1,
"%s", m_strNewServerName);
runInfo.m_szServerName[ServerManage::RunInfo::MAX_SERVER_NAME - 1] = 0;
if(CManageClientManager::GetInstance().Add(
CManageClientManager::SERVER_INFO, runInfo, dwServerID))
{
m_strNewServerIP = _T("");
m_strNewServerName = _T("");
ServerListSet();
UpdateData(false);
GetDlgItem(IDC_NEWMACHINEIP_EDIT)->SetFocus();
}
else
{
AfxMessageBox( _T("Add server failed"), MB_OK | MB_ICONINFORMATION );
}
}
else
{
AfxMessageBox( _T("Empty value"), MB_OK | MB_ICONINFORMATION );
}
}
void CManageSetupDlg::OnBnClickedMachinemodifyBtn()
{
UpdateData(true);
// 서버 이름 수정
int nSelIndex = m_ctrlMachine.GetNextItem( -1, LVNI_SELECTED );
if(-1 != nSelIndex)
{
unsigned long dwServerIP = inet_addr(m_ctrlMachine.GetItemText(nSelIndex, 0));
if(0 != dwServerIP)
{
UpdateData(true);
unsigned long dwServerID = 0;
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwServerIP = dwServerIP;
_snprintf(runInfo.m_szServerName, ServerManage::RunInfo::MAX_SERVER_NAME - 1,
"%s", m_strSelServerName);
runInfo.m_szServerName[ServerManage::RunInfo::MAX_SERVER_NAME - 1] = 0;
if(CManageClientManager::GetInstance().Modify(
CManageClientManager::SERVER_INFO, runInfo))
{
ServerListSet();
return;
}
}
AfxMessageBox( _T("Add server failed"), MB_OK | MB_ICONINFORMATION );
}
}
void CManageSetupDlg::OnBnClickedMachinedelBtn()
{
int nSelIndex = m_ctrlMachine.GetNextItem( -1, LVNI_SELECTED );
if( -1 != nSelIndex )
{
unsigned long dwServerIP = inet_addr(m_ctrlMachine.GetItemText(nSelIndex, 0));
if(0 != dwServerIP)
{
if(CManageClientManager::GetInstance().Remove(
CManageClientManager::SERVER_INFO, dwServerIP, true))
{
ServerListSet();
return;
}
}
AfxMessageBox( _T("Remove machine failed"), MB_OK | MB_ICONINFORMATION );
}
}
void CManageSetupDlg::OnLvnItemchangedMachineList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int nSelIndex = m_ctrlMachine.GetNextItem(-1, LVNI_SELECTED);
if( -1 != nSelIndex )
{
m_strSelServerName.SetString(m_ctrlMachine.GetItemText(nSelIndex, 1));
UpdateData(false);
}
*pResult = 0;
}
//-----------------------------------------------------------------------------
// 실행 경로 추가, 수정, 삭제
void CManageSetupDlg::OnBnClickedAddexepathBtn()
{
UpdateData(true);
if(m_strNewExePath != _T(""))
{
unsigned long dwPathID = 0;
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
_snprintf(runInfo.m_szPath, ServerManage::RunInfo::MAX_PATH_LEN - 1, "%s", m_strNewExePath);
runInfo.m_szPath[ServerManage::RunInfo::MAX_PATH_LEN - 1] = 0;
if(CManageClientManager::GetInstance().Add(
CManageClientManager::RUN_PATH_INFO, runInfo, dwPathID))
{
m_strNewExePath = _T("");
ExecutePathListSet();
UpdateData(false);
GetDlgItem(IDC_EXEPATH_EDIT)->SetFocus();
}
else
{
AfxMessageBox( _T("Add run path failed"), MB_OK | MB_ICONINFORMATION );
}
}
else
{
AfxMessageBox( _T("Empty value"), MB_OK | MB_ICONINFORMATION );
}
}
void CManageSetupDlg::OnBnClickedModifyexepathBtn()
{
UpdateData(true);
int nSelIndex = m_ctrlExecutePath.GetNextItem( -1, LVNI_SELECTED );
if( -1 != nSelIndex )
{
unsigned long dwPathID = 0;
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwPathID = atol(m_ctrlExecutePath.GetItemText(nSelIndex, 0));
_snprintf(runInfo.m_szPath, ServerManage::RunInfo::MAX_PATH_LEN - 1, "%s", m_strSelExePath);
runInfo.m_szPath[ServerManage::RunInfo::MAX_PATH_LEN - 1] = 0;
if(CManageClientManager::GetInstance().Modify(
CManageClientManager::RUN_PATH_INFO, runInfo))
{
ExecutePathListSet();
}
else
{
AfxMessageBox( _T("Modify run path failed"), MB_OK | MB_ICONINFORMATION );
}
}
}
void CManageSetupDlg::OnBnClickedDelexepathBtn()
{
int nSelIndex = m_ctrlExecutePath.GetNextItem( -1, LVNI_SELECTED );
if( -1 != nSelIndex )
{
if(CManageClientManager::GetInstance().Remove(
CManageClientManager::RUN_PATH_INFO,
atol(m_ctrlExecutePath.GetItemText(nSelIndex, 0)), true))
{
ExecutePathListSet();
}
else
{
AfxMessageBox( _T("Remove run path failed"), MB_OK | MB_ICONINFORMATION );
}
}
}
void CManageSetupDlg::OnLvnItemchangedExecutepathList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int nSelIndex = m_ctrlExecutePath.GetNextItem(-1, LVNI_SELECTED);
if( -1 != nSelIndex )
{
m_strSelExePath = m_ctrlExecutePath.GetItemText(nSelIndex, 1);
UpdateData(false);
}
*pResult = 0;
}
// -------------------------------------------------------------------------
// 옵션 관련 처리 함수들
void CManageSetupDlg::OnBnClickedAddoptionBtn()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(true);
if(m_strNewOption != _T(""))
{
unsigned long dwOptionID = 0;
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
_snprintf(runInfo.m_szOption, ServerManage::RunInfo::MAX_PATH_LEN - 1, "%s", m_strNewOption);
runInfo.m_szOption[ServerManage::RunInfo::MAX_PATH_LEN - 1] = 0;
if(CManageClientManager::GetInstance().Add(
CManageClientManager::OPTION_INFO, runInfo, dwOptionID))
{
m_strNewOption = _T("");
OptionListSet();
UpdateData(false);
GetDlgItem(IDC_NEWOPTION_EDIT)->SetFocus();
}
else
{
AfxMessageBox( _T("Add option failed"), MB_OK | MB_ICONINFORMATION );
}
}
else
{
AfxMessageBox( _T("Empty value"), MB_OK | MB_ICONINFORMATION );
}
}
void CManageSetupDlg::OnBnClickedModifyoptionBtn()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(true);
int nSelIndex = m_ctrlOption.GetNextItem( -1, LVNI_SELECTED );
if( -1 != nSelIndex )
{
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwOptionID = atol(m_ctrlOption.GetItemText(nSelIndex, 0));
_snprintf(runInfo.m_szOption, ServerManage::RunInfo::MAX_PATH_LEN - 1, "%s", m_strSelOption);
runInfo.m_szOption[ServerManage::RunInfo::MAX_PATH_LEN - 1] = 0;
if(CManageClientManager::GetInstance().Modify(
CManageClientManager::OPTION_INFO, runInfo))
{
OptionListSet();
}
else
{
AfxMessageBox( _T("Modify option failed"), MB_OK | MB_ICONINFORMATION );
}
}
}
void CManageSetupDlg::OnBnClickedDeloptionBtn()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int nSelIndex = m_ctrlOption.GetNextItem( -1, LVNI_SELECTED );
if( -1 != nSelIndex )
{
if(CManageClientManager::GetInstance().Remove(
CManageClientManager::OPTION_INFO,
atol(m_ctrlOption.GetItemText(nSelIndex, 0)), true))
{
OptionListSet();
}
else
{
AfxMessageBox( _T("Remove option failed"), MB_OK | MB_ICONINFORMATION );
}
}
}
void CManageSetupDlg::OnLvnItemchangedOptionList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int nSelIndex = m_ctrlOption.GetNextItem(-1, LVNI_SELECTED);
if( -1 != nSelIndex )
{
m_strSelOption = m_ctrlOption.GetItemText(nSelIndex, 1);
UpdateData(false);
}
*pResult = 0;
}
// ---------------------------------------------------------------------------
BOOL CManageSetupDlg::PreTranslateMessage(MSG* pMsg)
{
// Enter키 눌렀을때
if( ( pMsg->message == WM_KEYDOWN ) && ( pMsg->wParam == VK_RETURN ) )
{
UpdateData( true );
if( ( GetFocus() == GetDlgItem(IDC_NEWMACHINENAME_EDIT) )
&& (m_strNewServerIP != "") && (m_strNewServerName != "") )
OnBnClickedMachineaddBtn();
else if( ( GetFocus() == GetDlgItem(IDC_EXEPATH_EDIT) ) && (m_strNewExePath != _T("")) )
OnBnClickedAddexepathBtn();
else if( ( GetFocus() == GetDlgItem(IDC_NEWEXEINFO_EDIT) ) && (m_strNewOption != _T("")) )
OnBnClickedAddoptionBtn();
else if( GetFocus() == GetDlgItem(IDC_SELSERVERNAME_EDIT) )
OnBnClickedMachinemodifyBtn();
else if( GetFocus() == GetDlgItem(IDC_SELEXEPATH_EDIT) )
OnBnClickedModifyexepathBtn();
else if( GetFocus() == GetDlgItem(IDC_SELOPTION_EDIT) )
OnBnClickedModifyoptionBtn();
}
return CDialog::PreTranslateMessage(pMsg);
}
void CManageSetupDlg::GetMachineList(CComboBox& cbCombo)
{
int nMaxItemCount = m_ctrlMachine.GetItemCount();
CString szString;
TCHAR szIP[MAX_PATH];
TCHAR szServerName[MAX_PATH];
for(int nItemCount = 0; nItemCount < nMaxItemCount; ++nItemCount)
{
m_ctrlMachine.GetItemText(nItemCount, 0, szIP, MAX_PATH);
m_ctrlMachine.GetItemText(nItemCount, 1, szServerName, MAX_PATH);
szString.Format("%s : %s", szIP, szServerName);
cbCombo.InsertString(nItemCount, szString);
cbCombo.SetItemData(nItemCount, inet_addr(szIP));
}
}
void CManageSetupDlg::GetPathList(CComboBox& cbCombo)
{
int nMaxItemCount = m_ctrlExecutePath.GetItemCount();
CString szString;
TCHAR szID[MAX_PATH];
TCHAR szValue[MAX_PATH];
for(int nItemCount = 0; nItemCount < nMaxItemCount; ++nItemCount)
{
m_ctrlExecutePath.GetItemText(nItemCount, 0, szID, MAX_PATH);
m_ctrlExecutePath.GetItemText(nItemCount, 1, szValue, MAX_PATH);
szString.Format("%s", szValue);
cbCombo.InsertString(nItemCount, szString);
cbCombo.SetItemData(nItemCount, atol(szID));
}
}
void CManageSetupDlg::GetOptionList(CComboBox& cbCombo)
{
int nMaxItemCount = m_ctrlOption.GetItemCount();
CString szString;
TCHAR szID[MAX_PATH];
TCHAR szValue[MAX_PATH];
for(int nItemCount = 0; nItemCount < nMaxItemCount; ++nItemCount)
{
m_ctrlOption.GetItemText(nItemCount, 0, szID, MAX_PATH);
m_ctrlOption.GetItemText(nItemCount, 1, szValue, MAX_PATH);
szString.Format("%s", szValue);
cbCombo.InsertString(nItemCount, szString);
cbCombo.SetItemData(nItemCount, atol(szID));
}
}
void CManageSetupDlg::OnFunctionsRuninfoedit()
{
CRunInfoEditDlg dlg;
dlg.DoModal();
}
void CManageSetupDlg::OnFunctionsUsermanagement()
{
CServerToolUserManagementDlg dlg;
dlg.DoModal();
}
void CManageSetupDlg::OnOK()
{
//CDialog::OnOK();
}
void CManageSetupDlg::OnFunctionsManagesetupclient()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
CManageSetupClient dlg;
dlg.DoModal();
}
void CManageSetupDlg::OnFunctionsExit()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
PostQuitMessage(0);
}

View File

@@ -0,0 +1,86 @@
// ManageSetupDlg.h : 헤더 파일
//
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
// CManageSetupDlg 대화 상자
class CManageSetupDlg : public CDialog
{
// 생성
public:
CManageSetupDlg(CWnd* pParent = NULL); // 표준 생성자
void GetMachineList(CComboBox& cbCombo);
void GetPathList(CComboBox& cbCombo);
void GetOptionList(CComboBox& cbCombo);
// 대화 상자 데이터
enum { IDD = IDD_MANAGECLIENTSETUPDLG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
// 구현
protected:
HICON m_hIcon;
// 메시지 맵 함수를 생성했습니다.
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
virtual void OnOK();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
afx_msg void OnBnClickedMachineaddBtn(); // 서버 정보 추가
afx_msg void OnBnClickedMachinemodifyBtn(); // 서버 이름 수정
afx_msg void OnBnClickedMachinedelBtn(); // 서버 정보 삭제
afx_msg void OnBnClickedAddexepathBtn(); // 실행 경로 추가
afx_msg void OnBnClickedModifyexepathBtn(); // 실행 경로 수정
afx_msg void OnBnClickedDelexepathBtn(); // 실행 경로 삭제
afx_msg void OnBnClickedAddoptionBtn(); // 옵션 추가
afx_msg void OnBnClickedModifyoptionBtn(); // 옵션 수정
afx_msg void OnBnClickedDeloptionBtn(); // 옵션 삭제
afx_msg void OnLvnItemchangedMachineList(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnLvnItemchangedExecutepathList(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnLvnItemchangedOptionList(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnFunctionsRuninfoedit();
afx_msg void OnFunctionsUsermanagement();
afx_msg void OnFunctionsManagesetupclient();
afx_msg void OnFunctionsExit();
private:
CString m_strNewServerIP;
CString m_strNewServerName;
CString m_strSelServerName;
CString m_strNewExePath;
CString m_strSelExePath;
CString m_strNewOption;
CString m_strSelOption;
CListCtrl m_ctrlMachine; // 서버 정보 리스트
CListCtrl m_ctrlExecutePath; // 실행 경로 리스트
CListCtrl m_ctrlOption; // 옵션 리스트
// 리스트 컨트롤 갱신 함수
void ServerListSet(); // 서버 정보 리스트 갱신
void ExecutePathListSet(); // 실행 경로 리스트 갱신
void OptionListSet(); // 옵션 리스트 갱신
};

View File

@@ -0,0 +1,279 @@
// RunInfoEditDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "ManageSetup.h"
#include "RuninfoEditDlg.h"
#include "ManageSetupDlg.h"
#include <ServerManage/ManageClientManager.h>
// CRunInfoEditDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CRunInfoEditDlg, CDialog)
CRunInfoEditDlg::CRunInfoEditDlg(CWnd* pParent /*=NULL*/)
: CDialog(CRunInfoEditDlg::IDD, pParent)
, m_strSelRunInfoIndex(_T(""))
, m_strSelRunInfoIP(_T(""))
, m_strSelRunInfoPath(_T(""))
, m_strSelRunInfoOPT(_T(""))
{
}
CRunInfoEditDlg::~CRunInfoEditDlg()
{
}
void CRunInfoEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SERVERIP_CB, m_ctrlServerIPCb);
DDX_Control(pDX, IDC_EXEPATH_CB, m_ctrlExePathCb);
DDX_Control(pDX, IDC_EXEOPT_CB, m_ctrlExeOptCb);
DDX_Control(pDX, IDC_RUNINFO_LIST, m_ctrlRunInfoListCtrl);
DDX_Text(pDX, IDC_SELRUNINFOINDEX_EDIT, m_strSelRunInfoIndex);
DDX_Text(pDX, IDC_SELRUNINFOIP_EDIT, m_strSelRunInfoIP);
DDX_Text(pDX, IDC_SELRUNINFOPATH_EDIT, m_strSelRunInfoPath);
DDX_Text(pDX, IDC_SELRUNINFOOPT_EDIT, m_strSelRunInfoOPT);
}
BEGIN_MESSAGE_MAP(CRunInfoEditDlg, CDialog)
ON_BN_CLICKED(IDC_BIND_BTN, OnBnClickedBindBtn)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_RUNINFO_LIST, OnLvnItemchangedRuninfoList)
ON_CBN_SELCHANGE(IDC_SERVERIP_CB, OnCbnSelchangeServeripCb)
ON_CBN_SELCHANGE(IDC_EXEPATH_CB, OnCbnSelchangeExepathCb)
ON_CBN_SELCHANGE(IDC_EXEOPT_CB, OnCbnSelchangeExeoptCb)
ON_BN_CLICKED(IDC_MODIFYRUNINFO_BTN, OnBnClickedModifyruninfoBtn)
ON_BN_CLICKED(IDC_DELETERUNINFO_BTN, OnBnClickedDeleteruninfoBtn)
END_MESSAGE_MAP()
// CRunInfoEditDlg 메시지 처리기입니다.
BOOL CRunInfoEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 메인 다이얼로그 핸들 얻어오기
CManageSetupDlg* lpMainDlg = static_cast<CManageSetupDlg*>(this->GetParent());
lpMainDlg->GetMachineList(m_ctrlServerIPCb);
lpMainDlg->GetPathList(m_ctrlExePathCb);
lpMainDlg->GetOptionList(m_ctrlExeOptCb);
m_ctrlServerIPCb.SetCurSel(0);
m_ctrlExePathCb.SetCurSel(0);
m_ctrlExeOptCb.SetCurSel(0);
m_ctrlRunInfoListCtrl.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB );
//m_ctrlRunInfoListCtrl.SetBkColor ( COLORREF RGB( 255, 190, 125) );
//m_ctrlRunInfoListCtrl.SetTextBkColor ( COLORREF RGB( 255, 190, 125) );
m_ctrlRunInfoListCtrl.InsertColumn ( 0, _T("RunID"), LVCFMT_LEFT, 50 );
m_ctrlRunInfoListCtrl.InsertColumn ( 1, _T("IP"), LVCFMT_LEFT, 105 );
m_ctrlRunInfoListCtrl.InsertColumn ( 2, _T("Name"), LVCFMT_LEFT, 100 );
m_ctrlRunInfoListCtrl.InsertColumn ( 3, _T("Path"), LVCFMT_LEFT, 400 );
m_ctrlRunInfoListCtrl.InsertColumn ( 4, _T("Option"), LVCFMT_LEFT, 140 );
RunInfoListSet();
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
class CRefreshRunInfoList
{
public:
CRefreshRunInfoList(CListCtrl& ctrlList) : m_ctrlList(ctrlList) { }
bool operator () (const ServerManage::RunInfo& runInfo)
{
const int MIN_BUFFER = 32;
char szRunID[MIN_BUFFER];
int nPosition = m_ctrlList.GetItemCount();
in_addr addr;
addr.S_un.S_addr = runInfo.m_dwServerIP;
_snprintf(szRunID, MIN_BUFFER - 1, "%d", runInfo.m_dwRunID);
szRunID[MIN_BUFFER - 1] = 0;
m_ctrlList.InsertItem (nPosition, "");
m_ctrlList.SetItemText (nPosition, 0, szRunID);
m_ctrlList.SetItemText (nPosition, 1, inet_ntoa(addr));
m_ctrlList.SetItemText (nPosition, 2, runInfo.m_szServerName);
m_ctrlList.SetItemText (nPosition, 3, runInfo.m_szPath);
m_ctrlList.SetItemText (nPosition, 4, runInfo.m_szOption);
m_ctrlList.SetItemData(nPosition, runInfo.m_dwRunID);
return true;
}
private:
CListCtrl& m_ctrlList;
};
void CRunInfoEditDlg::RunInfoListSet()
{
// RunInfo 리스트 컨트롤 갱신
m_ctrlRunInfoListCtrl.DeleteAllItems();
CManageClientManager::GetInstance().EnumRunInfo(CRefreshRunInfoList(m_ctrlRunInfoListCtrl));
}
// ( RunInfo 추가, 수정, 삭제 )____________________________________________________________________________
void CRunInfoEditDlg::OnBnClickedBindBtn()
{
// RunInfo 추가
if((-1 != m_ctrlServerIPCb.GetCurSel())
&& (-1 != m_ctrlExePathCb.GetCurSel())
&& (-1 != m_ctrlExeOptCb.GetCurSel()))
{
unsigned long dwRunID = 0;
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwPathID = static_cast<unsigned long>(m_ctrlExePathCb.GetItemData(m_ctrlExePathCb.GetCurSel()));
runInfo.m_dwOptionID = static_cast<unsigned long>(m_ctrlExeOptCb.GetItemData(m_ctrlExeOptCb.GetCurSel()));
runInfo.m_dwServerIP = static_cast<unsigned long>(m_ctrlServerIPCb.GetItemData(m_ctrlServerIPCb.GetCurSel()));
if(CManageClientManager::GetInstance().Add(
CManageClientManager::RUN_INFO, runInfo, dwRunID))
{
RunInfoListSet();
}
else
{
AfxMessageBox("Add run info failed");
}
}
}
void CRunInfoEditDlg::OnBnClickedModifyruninfoBtn()
{
// RunInfo 수정
UpdateData( true );
int nSelIndex = m_ctrlRunInfoListCtrl.GetNextItem( -1, LVNI_SELECTED );
if( -1 != nSelIndex )
{
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwServerIP = static_cast<unsigned long>(m_ctrlServerIPCb.GetItemData(m_ctrlServerIPCb.GetCurSel()));
runInfo.m_dwPathID = static_cast<unsigned long>(m_ctrlExePathCb.GetItemData(m_ctrlExePathCb.GetCurSel()));
runInfo.m_dwOptionID = static_cast<unsigned long>(m_ctrlExeOptCb.GetItemData(m_ctrlExeOptCb.GetCurSel()));
if( CManageClientManager::GetInstance().Modify( CManageClientManager::RUN_INFO, runInfo) )
{
RunInfoListSet();
}
else
{
AfxMessageBox( "Modify run info failed" );
}
}
}
void CRunInfoEditDlg::OnBnClickedDeleteruninfoBtn()
{
// RunInfo 삭제
UpdateData( true );
int nSelIndex = m_ctrlRunInfoListCtrl.GetNextItem( -1, LVNI_SELECTED );
if( -1 != nSelIndex )
{
if(CManageClientManager::GetInstance().Remove(CManageClientManager::RUN_INFO,
static_cast<unsigned long>(m_ctrlRunInfoListCtrl.GetItemData(nSelIndex)), true))
{
m_strSelRunInfoIndex = _T("");
m_strSelRunInfoIP = _T("");
m_strSelRunInfoPath = _T("");
m_strSelRunInfoOPT = _T("");
RunInfoListSet();
UpdateData(false);
}
else
{
AfxMessageBox( "Remove run info failed" );
}
}
}
//_________________________________________________________________________________________________________
void CRunInfoEditDlg::OnLvnItemchangedRuninfoList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
CString strSelRunInfoName;
int nSelIndex = m_ctrlRunInfoListCtrl.GetNextItem(-1, LVNI_SELECTED);
if( -1 != nSelIndex )
{
m_strSelRunInfoIndex = m_ctrlRunInfoListCtrl.GetItemText( nSelIndex, 0 );
m_strSelRunInfoIP = m_ctrlRunInfoListCtrl.GetItemText( nSelIndex, 1 );
strSelRunInfoName = m_ctrlRunInfoListCtrl.GetItemText( nSelIndex, 2 );
m_strSelRunInfoPath = m_ctrlRunInfoListCtrl.GetItemText( nSelIndex, 3 );
m_strSelRunInfoOPT = m_ctrlRunInfoListCtrl.GetItemText( nSelIndex, 4 );
}
CString strFindingKey;
strFindingKey.Format( "%s : %s", m_strSelRunInfoIP, strSelRunInfoName );
m_ctrlServerIPCb.SetCurSel ( m_ctrlServerIPCb.FindString ( 0, strFindingKey ) );
m_ctrlExePathCb.SetCurSel ( m_ctrlExePathCb.FindString ( 0, m_strSelRunInfoPath ) );
m_ctrlExeOptCb.SetCurSel ( m_ctrlExeOptCb.FindString ( 0, m_strSelRunInfoOPT ) );
UpdateData(false);
*pResult = 0;
}
void CRunInfoEditDlg::OnCbnSelchangeServeripCb()
{
if( m_strSelRunInfoIndex != "" )
{
m_ctrlServerIPCb.GetLBText(m_ctrlServerIPCb.GetCurSel(), m_strSelRunInfoIP);
UpdateData(false);
}
}
void CRunInfoEditDlg::OnCbnSelchangeExepathCb()
{
if( m_strSelRunInfoIndex != "" )
{
m_ctrlExePathCb.GetLBText(m_ctrlExePathCb.GetCurSel(), m_strSelRunInfoPath);
UpdateData(false);
}
}
void CRunInfoEditDlg::OnCbnSelchangeExeoptCb()
{
if( m_strSelRunInfoIndex != "" )
{
m_ctrlExeOptCb.GetLBText(m_ctrlExeOptCb.GetCurSel(), m_strSelRunInfoOPT);
UpdateData(false);
}
}
void CRunInfoEditDlg::OnOK()
{
// CDialog::OnOK();
}

View File

@@ -0,0 +1,49 @@
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
// CRunInfoEditDlg 대화 상자입니다.
class CRunInfoEditDlg : public CDialog
{
DECLARE_DYNAMIC(CRunInfoEditDlg)
public:
CRunInfoEditDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CRunInfoEditDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_RUNINFOEDITDLG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedBindBtn();
afx_msg void OnLvnItemchangedRuninfoList(NMHDR *pNMHDR, LRESULT *pResult);
virtual void OnOK();
afx_msg void OnCbnSelchangeServeripCb();
afx_msg void OnCbnSelchangeExepathCb();
afx_msg void OnCbnSelchangeExeoptCb();
afx_msg void OnBnClickedModifyruninfoBtn();
afx_msg void OnBnClickedDeleteruninfoBtn();
private:
CComboBox m_ctrlServerIPCb;
CComboBox m_ctrlExePathCb;
CComboBox m_ctrlExeOptCb;
CListCtrl m_ctrlRunInfoListCtrl;
CString m_strSelRunInfoIndex;
CString m_strSelRunInfoIP;
CString m_strSelRunInfoPath;
CString m_strSelRunInfoOPT;
void RunInfoListSet(); // RunInfo 리스트 컨트롤 갱신
};

View File

@@ -0,0 +1,160 @@
// ServerToolUserManagementDlg.cpp : 구현 파일
//
#include "stdafx.h"
#include "ManageSetup.h"
#include "ServerToolUserManagementDlg.h"
#include "UserRegEditDlg.h"
#include <UserManage/ToolUserManageTable.h>
const TCHAR* GetLVString( int nLVIndex )
{
switch( nLVIndex )
{
case CToolUserManager::MASTER: return _T("MASTER");
case CToolUserManager::GENERAL: return _T("GENERAL");
case CToolUserManager::MONITORING: return _T("MONITORING");
}
return _T("UNKNOWN");
}
// CServerToolUserManagementDlg 대화 상자
CServerToolUserManagementDlg::CServerToolUserManagementDlg(CWnd* pParent /*=NULL*/)
: CDialog(CServerToolUserManagementDlg::IDD, pParent)
{
}
void CServerToolUserManagementDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_USERINFO_LIST, m_ctrlUserInfoList);
}
BEGIN_MESSAGE_MAP(CServerToolUserManagementDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_USER_REG, OnBnClickedUserReg)
ON_BN_CLICKED(IDC_USER_EDIT, OnBnClickedUserEdit)
ON_BN_CLICKED(IDC_USER_DEL, OnBnClickedUserDel)
END_MESSAGE_MAP()
// CServerToolUserManagementDlg 메시지 처리기
BOOL CServerToolUserManagementDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_ctrlUserInfoList.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB );
//m_ctrlUserInfoList.SetBkColor ( COLORREF RGB( 255, 190, 125) );
//m_ctrlUserInfoList.SetTextBkColor ( COLORREF RGB( 255, 190, 125) );
m_ctrlUserInfoList.InsertColumn ( 0, _T("ID"), LVCFMT_LEFT, 100 );
m_ctrlUserInfoList.InsertColumn ( 1, _T("NAME"), LVCFMT_LEFT, 80 );
m_ctrlUserInfoList.InsertColumn ( 2, _T("IP"), LVCFMT_LEFT, 110 );
m_ctrlUserInfoList.InsertColumn ( 3, _T("ADMIN LV"), LVCFMT_LEFT, 100 );
UserListSet(); // 운영자 정보 DB를 읽어서 리스트에 표시
return true;
}
struct SORT_BY_ID
{
bool operator () (const ServerManage::UserInfo& lhs, const ServerManage::UserInfo& rhs)
{
return std::lexicographical_compare(lhs.szID, lhs.szID + strlen(lhs.szID),
rhs.szID, rhs.szID + strlen(rhs.szID));
}
};
bool CServerToolUserManagementDlg::UserListSet()
{
// 리스트 컨트롤 클리어
m_ctrlUserInfoList.DeleteAllItems();
CToolUserManager::UserList userList;
// DB를 읽어서 리스트 컨트롤에 셋팅
CToolUserManager::GetInstance().GetUserInfo(userList);
userList.sort(SORT_BY_ID());
CToolUserManager::UserList::iterator pos = userList.begin();
CToolUserManager::UserList::iterator end = userList.end();
in_addr userIP;
int nCount = 0;
for(;pos != end; ++pos, ++nCount)
{
ServerManage::UserInfo& userInfo = *pos;
m_ctrlUserInfoList.InsertItem(nCount, userInfo.szID );
m_ctrlUserInfoList.SetItemText(nCount, 1, userInfo.szFullName );
userIP.S_un.S_addr = userInfo.dwIP;
m_ctrlUserInfoList.SetItemText(nCount, 2, inet_ntoa(userIP));
m_ctrlUserInfoList.SetItemText(nCount, 3, GetLVString(userInfo.usAdminLevel));
}
return true;
}
void CServerToolUserManagementDlg::OnBnClickedUserReg()
{
CUserRegEditDlg RegDlg(0);
RegDlg.DoModal();
UserListSet();
}
void CServerToolUserManagementDlg::OnBnClickedUserEdit()
{
int nSelectedIndex = m_ctrlUserInfoList.GetNextItem(-1, LVIS_SELECTED);
if(-1 != nSelectedIndex)
{
char szID[ServerManage::UserInfo::ID_LEN];
m_ctrlUserInfoList.GetItemText(nSelectedIndex, 0, szID, ServerManage::UserInfo::ID_LEN);
ServerManage::UserInfo userInfo;
if(CToolUserManager::GetInstance().GetUserInfo(szID, userInfo))
{
CUserRegEditDlg EditDlg(&userInfo);
EditDlg.DoModal();
UserListSet();
}
}
}
void CServerToolUserManagementDlg::OnBnClickedUserDel()
{
int nSelectedIndex = m_ctrlUserInfoList.GetNextItem( -1, LVIS_SELECTED );
if( -1 != nSelectedIndex )
{
// 계정 삭제시에는 ID만 채워서 보냄
ServerManage::UserInfo stDelUserInfo;
m_ctrlUserInfoList.GetItemText(nSelectedIndex, 0,
stDelUserInfo.szID, ServerManage::UserInfo::ID_LEN);
CToolUserManager::GetInstance().DelUser(stDelUserInfo.szID);
UserListSet();
}
}

View File

@@ -0,0 +1,34 @@
// ServerToolUserManagementDlg.h : 헤더 파일
//
#pragma once
#include "afxwin.h"
// CServerToolUserManagementDlg 대화 상자
class CServerToolUserManagementDlg : public CDialog
{
// 생성
public:
CServerToolUserManagementDlg(CWnd* pParent = NULL); // 표준 생성자
// 대화 상자 데이터
enum { IDD = IDD_USERMANAGEMENTDLG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
// 구현
protected:
DECLARE_MESSAGE_MAP()
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedUserReg();
afx_msg void OnBnClickedUserEdit();
afx_msg void OnBnClickedUserDel();
private:
CListCtrl m_ctrlUserInfoList;
bool UserListSet();
};

View File

@@ -0,0 +1,152 @@
// AdminRegEditDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "ManageSetup.h"
#include "UserRegEditDlg.h"
#include "ServerToolUserManagementDlg.h"
#include <UserManage/ToolUserManageTable.h>
#include ".\userregeditdlg.h"
// AdminRegEditDlg 대화 상자입니다.
enum UserRegEditConst
{
REGISTER,
EDIT
};
IMPLEMENT_DYNAMIC(CUserRegEditDlg, CDialog)
CUserRegEditDlg::CUserRegEditDlg(ServerManage::UserInfo* lpUserInfo,
CWnd* pParent /*=NULL*/)
: CDialog(CUserRegEditDlg::IDD, pParent)
, m_szTitleName( _T("") )
, m_szGroupName( _T("") )
, m_strTempUserID(_T(""))
, m_strUserName(_T(""))
, m_strUserPass(_T(""))
, m_strUserIP(_T(""))
, m_usUserLevel(CToolUserManager::MONITORING)
, m_usMode(REGISTER)
{
if(0 != lpUserInfo)
{
in_addr addr;
addr.S_un.S_addr = lpUserInfo->dwIP;
m_strTempUserID.SetString(lpUserInfo->szID);
m_strUserName.SetString(lpUserInfo->szFullName);
m_strUserPass.SetString(lpUserInfo->szPassword);
m_strUserIP.SetString(inet_ntoa(addr));
m_usUserLevel = lpUserInfo->usAdminLevel;
m_usMode = EDIT;
}
}
CUserRegEditDlg::~CUserRegEditDlg()
{
}
void CUserRegEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_GROUPNAME_EDIT, m_szGroupName);
DDX_Text(pDX, IDC_USERNAME, m_strUserName);
DDX_Text(pDX, IDC_USERPASS, m_strUserPass);
DDX_Text(pDX, IDC_USERIP, m_strUserIP);
DDX_Control(pDX, IDC_USERLV, m_ctrlUserLV);
DDX_Control(pDX, IDC_USERID, m_strUserID);
}
BEGIN_MESSAGE_MAP(CUserRegEditDlg, CDialog)
ON_BN_CLICKED(IDC_REGEDITOK_BTN, OnBnClickedRegeditokBtn)
ON_BN_CLICKED(IDC_CANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()
// AdminRegEditDlg 메시지 처리기입니다.
BOOL CUserRegEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_ctrlUserLV.InsertString( CToolUserManager::MASTER, _T("MASTER") );
m_ctrlUserLV.InsertString( CToolUserManager::GENERAL, _T("GENERAL") );
m_ctrlUserLV.InsertString( CToolUserManager::MONITORING, _T("MONITORING") );
m_ctrlUserLV.SetCurSel(m_usUserLevel);
if(m_strTempUserID.IsEmpty())
{
SetWindowText( _T("Admin Registaration") );
m_szGroupName = _T("New Admin Info");
}
else
{
m_strUserID.SetWindowText(m_strTempUserID);
m_strUserID.SetReadOnly();
SetWindowText( _T("Admin Edit") );
m_szGroupName = _T("Edit Admin Info");
}
UpdateData( false );
return true;
}
void CUserRegEditDlg::OnBnClickedRegeditokBtn()
{
UpdateData( true );
ServerManage::UserInfo stNewUserInfo;
m_strUserID.GetWindowText(m_strTempUserID);
// 수정 또는 등록 할 운영자 정보 수집
_snprintf(stNewUserInfo.szID,
ServerManage::UserInfo::ID_LEN - 1, "%s", m_strTempUserID); // 운영자 ID
stNewUserInfo.szID[ServerManage::UserInfo::ID_LEN - 1] = 0;
_snprintf(stNewUserInfo.szFullName,
ServerManage::UserInfo::NAME_LEN - 1, "%s", m_strUserName ); // 운영자 이름
stNewUserInfo.szFullName[ServerManage::UserInfo::NAME_LEN - 1] = 0;
stNewUserInfo.dwIP = inet_addr(m_strUserIP); // 운영자 IP
stNewUserInfo.usAdminLevel = m_ctrlUserLV.GetCurSel(); // 운영자 레벨
_snprintf(stNewUserInfo.szPassword,
ServerManage::UserInfo::PASS_LEN - 1, "%s", m_strUserPass ); // 운영자 패스워드
stNewUserInfo.szPassword[ServerManage::UserInfo::PASS_LEN - 1] = 0;
if( m_usMode == REGISTER)
{
if(!CToolUserManager::GetInstance().AddUser(stNewUserInfo))
{
AfxMessageBox("Add user error!");
}
}
else if( m_usMode == EDIT )
{
if(!CToolUserManager::GetInstance().ModifyUser(stNewUserInfo))
{
AfxMessageBox("Modify user error!");
}
}
OnOK();
}
void CUserRegEditDlg::OnBnClickedCancel()
{
OnCancel();
}

View File

@@ -0,0 +1,53 @@
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
// forward decl.
namespace ServerManage
{
struct UserInfo;
};
// AdminRegEditDlg 대화 상자입니다.
class CUserRegEditDlg : public CDialog
{
DECLARE_DYNAMIC(CUserRegEditDlg)
public:
CUserRegEditDlg(ServerManage::UserInfo* lpUserInfo,
CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CUserRegEditDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_USERREGEDITDLG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
virtual BOOL OnInitDialog();
private:
afx_msg void OnBnClickedRegeditokBtn();
afx_msg void OnBnClickedCancel();
CString m_szTitleName; // 다이얼로그 타이틀 바 캡션
CString m_szGroupName; // 다이얼로그 내 그룹박스 캡션
CEdit m_strUserID;
CString m_strTempUserID;
CString m_strUserName;
CString m_strUserIP;
CComboBox m_ctrlUserLV;
CString m_strUserPass;
unsigned short m_usUserLevel;
unsigned short m_usMode;
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Windows.ManageSetup"
type="win32"
/>
<description>여기에 응용 프로그램 설명을 추가합니다.</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

View File

@@ -0,0 +1,13 @@
//
// ManageClientSetup.RC2 - resources Microsoft Visual C++에서 직접 편집하지 않는 리소스
//
#ifdef APSTUDIO_INVOKED
#error 이 파일은 Microsoft Visual C++에서 편집할 수 없습니다.
#endif //APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// 여기에 수동으로 편집한 리소스를 추가합니다.
/////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,86 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by ManageSetup.rc
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_MANAGECLIENTSETUPDLG 102
#define IDD_RUNINFOEDITDLG 104
#define IDD_USERMANAGEMENTDLG 105
#define IDD_USERREGEDITDLG 106
#define IDR_MAINFRAME 128
#define IDR_MENU 129
#define IDD_MANAGESETUPCLIENT 131
#define IDC_MACHINE_LIST 1001
#define IDC_MACHINEADD_BTN 1002
#define IDC_MACHINEDEL_BTN 1003
#define IDC_EXECUTEPATH_LIST 1004
#define IDC_EXEINFO_LIST 1005
#define IDC_OPTION_LIST 1005
#define IDC_ADDEXEPATH_BTN 1006
#define IDC_DELEXEPATH_BTN 1007
#define IDC_MODIFYEXEPATH_BTN 1008
#define IDC_NEWMACHINEIP_EDIT 1009
#define IDC_NEWMACHINENAME_EDIT 1010
#define IDC_EXEPATH_EDIT 1012
#define IDC_SERVERTYPE_CB 1013
#define IDC_SELSERVERIP_EDIT 1014
#define IDC_SELSERVERNAME_EDIT 1015
#define IDC_ADDEXEINFO_BTN 1016
#define IDC_ADDOPTION_BTN 1016
#define IDC_MODIFYEXEINFO_BTN 1017
#define IDC_MODIFYOPTION_BTN 1017
#define IDC_DELEXEINFO_BTN 1018
#define IDC_DELOPTION_BTN 1018
#define IDC_SELEXEPATH_EDIT 1019
#define IDC_NEWEXEINFO_EDIT 1020
#define IDC_NEWOPTION_EDIT 1020
#define IDC_EXEPATH_EDIT4 1021
#define IDC_SELEXEINFO_EDIT 1021
#define IDC_SELOPTION_EDIT 1021
#define IDC_BUTTON1 1023
#define IDC_BIND_BTN 1023
#define IDC_MACHINEMODIFY_BTN 1023
#define IDC_SERVERIP_CB 1025
#define IDC_REGEDITOK_BTN 1025
#define IDC_EXEPATH_CB 1026
#define IDC_USERID 1026
#define IDC_USER_DEL 1026
#define IDC_EXEOPT_CB 1027
#define IDC_USERNAME 1027
#define IDC_USER_EDIT 1027
#define IDC_CANCEL 1028
#define IDC_LIST2 1029
#define IDC_USERPASS 1029
#define IDC_RUNINFO_LIST 1029
#define IDC_BUTTON2 1030
#define IDC_DELETERUNINFO_BTN 1030
#define IDC_SELRUNINFOIP_EDIT 1032
#define IDC_SELRUNINFOPATH_EDIT 1033
#define IDC_SELRUNINFOOPT_EDIT 1034
#define IDC_MODIFYRUNINFO_BTN 1035
#define IDC_SELRUNINFOINDEX_EDIT 1036
#define IDC_MANAGE_SERVER_IP 1036
#define IDC_MANAGE_SERVER_PORT 1037
#define ID_GENERATE_MANAGE_CLIENT_SETUP 1038
#define IDC_USERINFO_LIST 1050
#define IDC_USERIP 1051
#define IDC_USERLV 1052
#define IDC_GROUPNAME_EDIT 1053
#define IDC_USER_REG 1054
#define ID_FUNCTIONS_USERMANAGEMENT 32771
#define ID_FUNCTIONS_RUNINFOEDIT 32772
#define ID_FUNCTIONS_MANAGESETUPCLIENT 32773
#define ID_FUNCTIONS_EXIT 32774
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 132
#define _APS_NEXT_COMMAND_VALUE 32775
#define _APS_NEXT_CONTROL_VALUE 1039
#define _APS_NEXT_SYMED_VALUE 105
#endif
#endif

View File

@@ -0,0 +1,7 @@
// stdafx.cpp : 표준 포함 파일을 포함하는 소스 파일입니다.
// ManageSetup.pch는 미리 컴파일된 헤더가 됩니다.
// stdafx.obj는 미리 컴파일된 형식 정보를 포함합니다.
#include "stdafx.h"

View File

@@ -0,0 +1,42 @@
// stdafx.h : 잘 변경되지 않고 자주 사용하는
// 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이
// 들어 있는 포함 파일입니다.
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // Windows 헤더에서 거의 사용되지 않는 내용을 제외시킵니다.
#endif
// 아래 지정된 플랫폼보다 우선하는 플랫폼을 대상으로 하는 경우 다음 정의를 수정하십시오.
// 다른 플랫폼에 사용되는 해당 값의 최신 정보는 MSDN을 참조하십시오.
#ifndef WINVER // Windows 95 및 Windows NT 4 이후 버전에서만 기능을 사용할 수 있습니다.
#define WINVER 0x0400 // Windows 98과 Windows 2000 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_WINNT // Windows NT 4 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_WINNT 0x0400 // Windows 98과 Windows 2000 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_WINDOWS // Windows 98 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_WINDOWS 0x0410 // Windows Me 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_IE // IE 4.0 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_IE 0x0400 // IE 5.0 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소
#include <afxext.h> // MFC 익스텐션
#include <afxdisp.h> // MFC 자동화 클래스
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원
#endif // _AFX_NO_AFXCMN_SUPPORT