DragonNest/Server/DNDBServer/DNDBServer.cpp
2024-12-19 09:48:26 +08:00

483 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// DNDBServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "IniFile.h"
#include "DNIocpManager.h"
#include "DNThreadManager.h"
#include "DNSQLConnectionManager.h"
#include "DNConfig.h"
#include "Log.h"
#include "ExceptionReport.h"
#include "DnServiceConnection.h"
#include "Version.h"
#if !defined( _FINAL_BUILD )
#include "DNQueryTest.h"
#endif // #if !defined( _FINAL_BUILD )
#include "Util.h"
#include "DNLogConnection.h"
#include "DNExtManager.h"
#include "EtResourceMng.h"
#include "ServiceUtil.h"
#include "DNServerPacketDB.h"
#include "DNMessageTask.h"
//#include "../../Server/RLKT_LICENSE/license_rlkt.h"
#include <iostream>
#if defined(_KRAZ)
#include "DNActozShield.h"
#endif // #if defined(_KRAZ)
TDBConfig g_Config;
bool LoadConfig(int argc, TCHAR * argv[])
{
memset(&g_Config, 0, sizeof(TDBConfig));
WCHAR wszBuf[128] = { 0, };
//Version
_strcpy(g_Config.szVersion, _countof(g_Config.szVersion), szDBVersion, (int)strlen(szDBVersion));
_strcpy(g_Config.szResVersion, _countof(g_Config.szResVersion), "Unknown Version", (int)strlen("Unknown Version"));
g_Config.nThreadMax = THREADMAX;
g_Config.bUseCmd = argc >= 2 ? IsUseCmd(argv[1]) : false;
if (g_Config.bUseCmd)
{
std::wstring wstrTempConfig;
std::string strTempConfig;
GetFirstRightValue(L"nation", argv[1], wstrTempConfig);
if (wstrTempConfig.size() > 0 && wstrTempConfig != L"dev")
{
ToMultiString(wstrTempConfig, g_Config.szResourceNation);
g_Log.Log(LogType::_FILELOG, L"ResourceNation String [%s]\r\n", wstrTempConfig.empty() ? L"None or Dev" : wstrTempConfig.c_str());
}
GetDefaultInfo(argv[1], g_Config.nManagedID, g_Config.szResourcePath, g_Config.szResVersion, g_Config.ServiceInfo.szIP, g_Config.ServiceInfo.nPort);
g_Log.Log(LogType::_FILELOG, L"ManagedID(SID) [%d]\n", g_Config.nManagedID);
g_Log.Log(LogType::_FILELOG, L"ResourcePath [%S] \nResourceRevision [%S]\n", g_Config.szResourcePath.c_str(), g_Config.szResVersion);
g_Log.Log(LogType::_FILELOG, L"ServiceManager [IP:%S][Port:%d]\n", g_Config.ServiceInfo.szIP, g_Config.ServiceInfo.nPort);
if (GetFirstRightValue(L"dbp", argv[1], wstrTempConfig))
g_Config.nAcceptPort = _wtoi(wstrTempConfig.c_str());
else _ASSERT(0);
g_Log.Log(LogType::_FILELOG, L"DBServer Port [%d]\n", g_Config.nAcceptPort);
GetDefaultConInfo(argv[1], L"log", &g_Config.LogInfo, 1);
g_Log.Log(LogType::_FILELOG, L"LogInfo (Ip:%S, Port:%d)\r\n", g_Config.LogInfo.szIP, g_Config.LogInfo.nPort);
if (GetFirstRightValue(L"title", argv[1], wstrTempConfig))
SetConsoleTitleW(wstrTempConfig.c_str());
GetMemberShipInfo(argv[1], &g_Config.MembershipDB);
g_Log.Log(LogType::_FILELOG, L"MembershipDB Connect Info(Ip:%S, Port:%d DBID:%s DBName:%s) Success\r\n", g_Config.MembershipDB.szIP, g_Config.MembershipDB.nPort, g_Config.MembershipDB.wszDBID, g_Config.MembershipDB.wszDBName);
GetWorldInfo(argv[1], g_Config.WorldDB, WORLDCOUNTMAX);
for (int nCnt = 0; nCnt < WORLDCOUNTMAX; nCnt++)
{
if (g_Config.WorldDB[nCnt].nWorldSetID <= 0) continue;
g_Log.Log(LogType::_FILELOG, L"WorldDB Connect Info(Ip:%S, Port:%d DBID:%s DBName:%s) Success\r\n", g_Config.WorldDB[nCnt].szIP, g_Config.WorldDB[nCnt].nPort, g_Config.WorldDB[nCnt].wszDBID, g_Config.WorldDB[nCnt].wszDBName);
g_Config.nWorldDBCount++;
}
#if defined( PRE_WORLDCOMBINE_PARTY )
int nCombineWorldID = 0;
for( int i = 0;i<WORLDCOUNTMAX;i++ )
{
if (g_Config.WorldDB[i].nWorldSetID > 0)
{
if( nCombineWorldID == 0 )
nCombineWorldID = g_Config.WorldDB[i].nWorldSetID;
else
{
if( nCombineWorldID > g_Config.WorldDB[i].nWorldSetID)
nCombineWorldID = g_Config.WorldDB[i].nWorldSetID;
}
}
else
break;
}
g_Config.nCombineWorldDBID = nCombineWorldID;
if( g_Config.nCombineWorldDBID <= 0 )
g_Log.Log(LogType::_FILELOG, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DBID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.\r\n");
else
g_Log.Log(LogType::_FILELOG, L"CombineWorld = %d\r\n", g_Config.nCombineWorldDBID);
#endif
}
else
{
if (!g_IniFile.Open(L"./Config/DNDB.ini")){
g_Log.Log(LogType::_FILELOG, L"DNDB.ini File not Found!!\r\n");
return false;
}
g_IniFile.GetValue(L"Info", L"ThreadMax", &g_Config.nThreadMax);
g_IniFile.GetValue(L"Connection", L"AcceptPort", &g_Config.nAcceptPort);
WCHAR wszBuf[128] = { 0, };
g_IniFile.GetValue(L"DB_DNMembership", L"DBIP", wszBuf);
if (wszBuf[0] != '\0')
WideCharToMultiByte(CP_ACP, NULL, wszBuf, -1, g_Config.MembershipDB.szIP, sizeof(g_Config.MembershipDB.szIP), NULL, NULL);
g_IniFile.GetValue(L"DB_DNMembership", L"DBPort", &g_Config.MembershipDB.nPort);
g_IniFile.GetValue(L"DB_DNMembership", L"DBID", g_Config.MembershipDB.wszDBID);
g_IniFile.GetValue(L"DB_DNMembership", L"DBName", g_Config.MembershipDB.wszDBName);
g_IniFile.GetValue(L"DB_DNWorld", L"WorldDBCount", &g_Config.nWorldDBCount);
#if defined( PRE_WORLDCOMBINE_PARTY )
g_IniFile.GetValue(L"DB_DNWorld", L"CombineWorldDB", &g_Config.nCombineWorldDBID);
if( g_Config.nCombineWorldDBID <= 0 )
g_Log.Log(LogType::_FILELOG, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DBID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.\r\n");
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
WCHAR wszLogStr[128] = {0,};
char szData[MAX_PATH];
std::vector<std::string> Tokens;
g_IniFile.GetValue(L"Connection", L"Log", wszLogStr);
if (wszLogStr[0] != '\0'){
WideCharToMultiByte(CP_ACP, NULL, wszLogStr, -1, szData, sizeof(szData), NULL, NULL);
Tokens.clear();
TokenizeA(szData, Tokens, ":");
if (!Tokens.empty()){
_strcpy(g_Config.LogInfo.szIP, _countof(g_Config.LogInfo.szIP), Tokens[0].c_str(), (int)strlen(Tokens[0].c_str()));
g_Config.LogInfo.nPort = atoi(Tokens[1].c_str());
}
}
g_Log.Log(LogType::_FILELOG, L"LogInfo (Ip:%S, Port:%d)\r\n", g_Config.LogInfo.szIP, g_Config.LogInfo.nPort);
WCHAR wszData[128] = { 0, };
for (int i = 0; i < g_Config.nWorldDBCount; i++){
swprintf(wszData, L"WorldID%d", i + 1);
g_IniFile.GetValue(L"DB_DNWorld", wszData, &g_Config.WorldDB[i].nWorldSetID);
if (g_Config.WorldDB[i].nWorldSetID <= 0) continue;
swprintf(wszData, L"DBIP%d", i + 1);
g_IniFile.GetValue(L"DB_DNWorld", wszData, wszBuf);
if (wszBuf[0] != '\0')
WideCharToMultiByte(CP_ACP, NULL, wszBuf, -1, g_Config.WorldDB[i].szIP, sizeof(g_Config.WorldDB[i].szIP), NULL, NULL);
swprintf(wszData, L"DBPort%d", i + 1);
g_IniFile.GetValue(L"DB_DNWorld", wszData, &g_Config.WorldDB[i].nPort);
swprintf(wszData, L"DBID%d", i + 1);
g_IniFile.GetValue(L"DB_DNWorld", wszData, g_Config.WorldDB[i].wszDBID);
swprintf(wszData, L"DBName%d", i + 1);
g_IniFile.GetValue(L"DB_DNWorld", wszData, g_Config.WorldDB[i].wszDBName);
}
// ResourcePath <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
WCHAR wszPath[_MAX_PATH] = { 0, };
char szPath[_MAX_PATH] = { 0, };
g_IniFile.GetValue( L"Resource", L"Path", wszPath );
if (wszPath[0] != '\0'){
WideCharToMultiByte(CP_ACP, NULL, wszPath, -1, szPath, sizeof(szPath), NULL, NULL);
g_Config.szResourcePath = szPath;
if( g_Config.szResourcePath.empty() ) g_Config.szResourcePath = ".";
}
WCHAR wszResNation[64] = { 0, };
char szResNation[64] = { 0, };
g_IniFile.GetValue( L"Resource", L"Nation", wszResNation );
if (wszResNation[0] != '\0'){
WideCharToMultiByte(CP_ACP, NULL, wszResNation, -1, szResNation, sizeof(szResNation), NULL, NULL);
if( strlen(szResNation) > 0 ) {
g_Config.szResourceNation = "_";
g_Config.szResourceNation += szResNation;
}
}
}
//<2F><><EFBFBD>󸶴<EFBFBD> Ʋ<><C6B2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> config<69><67><EFBFBD><EFBFBD> <20>д´<D0B4>.
if (g_Config.nThreadMax > THREADMAX) g_Config.nThreadMax = THREADMAX;
// <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ忡 <20><><EFBFBD><EFBFBD>.
g_Config.nThreadMax = THREADMAX;
#if defined(_KRAZ)
if (!g_IniFile.Open(L"./Config/ActozCommonDB.ini")){
g_Log.Log(LogType::_FILELOG, L"ActozCommonDB.ini File not Found!!\r\n");
return false;
}
memset(&wszBuf, 0, sizeof(wszBuf));
g_IniFile.GetValue(L"Info", L"ServerType", wszBuf);
if (wcscmp(wszBuf, L"Test") == 0)
g_Config.bTestServer = true;
g_IniFile.GetValue(L"Info", L"DBIP", wszBuf);
if (wszBuf[0] != '\0')
WideCharToMultiByte(CP_ACP, NULL, wszBuf, -1, g_Config.ActozCommonDB.szIP, sizeof(g_Config.ActozCommonDB.szIP), NULL, NULL);
g_IniFile.GetValue(L"Info", L"DBPort", &g_Config.ActozCommonDB.nPort);
g_IniFile.GetValue(L"Info", L"DBID", g_Config.ActozCommonDB.wszDBID);
g_IniFile.GetValue(L"Info", L"DBName", g_Config.ActozCommonDB.wszDBName);
g_Log.Log(LogType::_FILELOG, L"ActozCommonDB Connect Info(Ip:%S, Port:%d DBID:%s DBName:%s) Success\r\n", g_Config.ActozCommonDB.szIP, g_Config.ActozCommonDB.nPort, g_Config.ActozCommonDB.wszDBID, g_Config.ActozCommonDB.wszDBName);
#endif // #if defined(_KRAZ)
return true;
}
bool CheckWorkingFolder(const WCHAR* szFolderName)
{
WCHAR szCurrentDir[MAX_PATH] = L"";
GetCurrentDirectory(MAX_PATH, szCurrentDir);
std::wstring wszCurrentDir;
wszCurrentDir = szCurrentDir;
std::transform(wszCurrentDir.begin(), wszCurrentDir.end(), wszCurrentDir.begin(), towlower);
if ( wszCurrentDir.find(szFolderName) > wszCurrentDir.size() )
return false;
return true;
}
bool InitApp(int argc, TCHAR * argv[])
{
//if (!CheckSerial()) return false;
#if defined(_DEBUG) && defined(_WORK)
if ( CheckWorkingFolder(L"out") == false )
{
wprintf(L"<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>!!!! setworking folder error " );
}
#endif
#if !defined( _FINAL_BUILD )
CDNQueryTest::CreateInstance();
#endif // #if !defined( _FINAL_BUILD )
WCHAR wszLogName[128];
memset(wszLogName, 0, sizeof(wszLogName));
if (argc >= 2)
{
if (IsUseCmd(argv[1]))
{
int nSID = 0;
std::wstring wstrTempArgv;
if (GetFirstRightValue(L"sid", argv[1], wstrTempArgv))
nSID = _wtoi(wstrTempArgv.c_str());
swprintf(wszLogName, L"DBServer_%d", nSID);
}
else
swprintf(wszLogName, L"DBServer");
}
else
swprintf(wszLogName, L"DBServer");
//g_Log.Init(L"DBServer", LOGTYPE_CRT_FILE_DAY);
#if defined (_FINAL_BUILD)
g_Log.Init(wszLogName, LOGTYPE_FILEDB_DAY);
#else
g_Log.Init(wszLogName, LOGTYPE_CRT_FILE_DAY);
#endif
WCHAR wszSPLogName[128];
memset(wszSPLogName, 0, sizeof(wszSPLogName));
swprintf(wszSPLogName, L"%s_SP", wszLogName);
g_SPLog.Init(wszSPLogName, LOGTYPE_FILE);
if (!LoadConfig(argc, argv)){
g_Log.Log(LogType::_FILELOG, L"LoadConfig Failed\r\n");
return false;
}
g_Log.SetServerID(g_Config.nManagedID);
// ResourceMng <20><><EFBFBD><EFBFBD>
CEtResourceMng::CreateInstance();
// Path <20><><EFBFBD><EFBFBD>
std::string szResource = g_Config.szResourcePath + "\\Resource";
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::string szNationStr;
if( szNationStr.empty() && !g_Config.szResourceNation.empty() ) szNationStr = g_Config.szResourceNation;
if( !szNationStr.empty() )
{
szResource += szNationStr;
CEtResourceMng::GetInstance().AddResourcePath( szResource, true );
szResource = g_Config.szResourcePath + "\\Resource";
}
CEtResourceMng::GetInstance().AddResourcePath( szResource, true );
g_pSPErrorCheckManager = new CDNSPErrorCheckManager;
if( !g_pSPErrorCheckManager )
return false;
g_pIocpManager = new CDNIocpManager;
if (!g_pIocpManager) return false;
#if defined(_WORK)
if (g_pIocpManager->Init(500) < 0){
#else // #if defined(_WORK)
if (g_pIocpManager->Init(100) < 0){
#endif // #if defined(_WORK)
g_Log.Log(LogType::_FILELOG, L"Iocp Initialize Fail(%d)\r\n", 100);
return false;
}
else {
g_Log.Log(LogType::_FILELOG, L"## Iocp Initialize Success(%d)\r\n", 100);
}
g_pExtManager = new CDNExtManager;
if (!g_pExtManager) return false;
if (!g_pExtManager->AllLoad())
{
g_Log.Log(LogType::_FILELOG, L"CDNExtManager::AllLoad Fail\r\n");
return false;
}
if (!g_ThreadManager.Init(g_Config.nThreadMax)){
g_Log.Log(LogType::_FILELOG, L"ThreadManager Initialize Fail\r\n");
return false;
}
else {
g_Log.Log(LogType::_FILELOG, L"## ThreadManager Initialize Success(%d)\r\n", g_Config.nThreadMax);
}
g_pLogConnection = new CDNLogConnection;
if( !g_pLogConnection ) return false;
g_pLogConnection->SetIp(g_Config.LogInfo.szIP);
g_pLogConnection->SetPort(g_Config.LogInfo.nPort);
if (!g_SQLConnectionManager.CreateDB()){
g_Log.Log(LogType::_FILELOG, L"CreateDB Fail\r\n");
return false;
}
else {
g_Log.Log(LogType::_FILELOG, L"## CreateDB OK!!\r\n");
}
if (g_pIocpManager->AddAcceptConnection(CONNECTIONKEY_DEFAULT, g_Config.nAcceptPort, 1000) < 0){
g_Log.Log(LogType::_FILELOG, L"AcceptPort Fail(%d)\r\n", g_Config.nAcceptPort);
return false;
}
else {
g_Log.Log(LogType::_FILELOG, L"## AcceptPort (%d)\r\n", g_Config.nAcceptPort);
}
if (argc > 1 && g_Config.nManagedID > 0)
{
g_pIocpManager->CreateThread();
g_pServiceConnection = new CDNServiceConnection(g_Config.nManagedID);
if (!g_pServiceConnection)
return false;
g_pServiceConnection->SetIp(g_Config.ServiceInfo.szIP);
g_pServiceConnection->SetPort(g_Config.ServiceInfo.nPort);
}
else
{
g_pIocpManager->CreateThread();
}
#if defined(_KRAZ) && defined(_FINAL_BUILD)
g_pActozShield = new CDNActozShield;
if (!g_pActozShield)
return false;
if (!g_pActozShield->Init())
return false;
#endif // #if defined(_KRAZ)
g_Log.Log(LogType::_FILELOG, L"Application Initialize Success\r\n");
return true;
}
void ClearApp()
{
#if defined(_KRAZ)
SAFE_DELETE(g_pActozShield);
#endif // #if defined(_KRAZ)
#if !defined( _FINAL_BUILD )
if( CDNQueryTest::IsActive() )
CDNQueryTest::DestroyInstance();
#endif // #if !defined( _FINAL_BUILD )
g_ThreadManager.Final();
if( g_pIocpManager )
{
g_pIocpManager->CloseAcceptors();
g_pIocpManager->ThreadStop();
}
SAFE_DELETE(g_pServiceConnection);
SAFE_DELETE(g_pIocpManager);
SAFE_DELETE(g_pSPErrorCheckManager);
}
int _tmain(int argc, TCHAR* argv[])
{
#if defined( PRE_PARTY_DB )
// PartyList <20><> <20>ɰ<EFBFBD><C9B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <20><> <20><>Ŷ<EFBFBD><C5B6> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Network <20>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>ִ<EFBFBD> ũ<><20>Ѿ<D1BE><EEB0A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD>ӽ<EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>.
BOOST_STATIC_ASSERT( (40*1024) >= sizeof(TAGetListParty) );
#endif // #if defined( PRE_PARTY_DB )
// DB<44><42> KeySetting <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD>̳ʸ<CCB3> ũ<>Ⱑ 59<35><39><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><EFBFBD><E2BAB8> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
#if defined(PRE_ADD_SKILLSLOT_EXTEND)
BOOST_STATIC_ASSERT( 79 >= sizeof(TKeySetting) );
BOOST_STATIC_ASSERT( 201 >= sizeof(TPadSetting) );
#else // #if defined(PRE_ADD_SKILLSLOT_EXTEND)
BOOST_STATIC_ASSERT( 69 >= sizeof(TKeySetting) );
BOOST_STATIC_ASSERT( 161 >= sizeof(TPadSetting) );
#endif // #if defined(PRE_ADD_SKILLSLOT_EXTEND)
#if defined(_CH)
setlocale(LC_ALL, "chinese-simplified");
#elif defined(_TW)
setlocale(LC_ALL, "chinese-traditional");
#elif defined(_JP)
setlocale(LC_ALL, "japanese");
#elif defined(_US)
setlocale(LC_ALL, "us");
#else
setlocale(LC_ALL, "Korean");
#endif
// <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>غ<EFBFBD>
DWORD dwRetVal = CExceptionReport::GetInstancePtr()->Open(_T(".\\"), TRUE, TRUE); // Release <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> C4744 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>Ͽ<EFBFBD> Singleton <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, CExceptionReport::GetInstancePtr() <20><> inline ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> : http://msdn.microsoft.com/ko-kr/library/a7za416f.aspx)
if (NOERROR != dwRetVal) {
DWORD dwErrNo = ::GetLastError();
DN_RETURN(dwErrNo);
}
if (!InitApp(argc, argv)){
g_Log.Log(LogType::_FILELOG, L"** InitApp Failed!!! Check!\r\n");
ClearApp();
return 0;
}
wprintf(L"exit <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ġ<><C4A1> <20><><EFBFBD><EFBFBD>\r\n");
char szCmd[256] = {0};
while (1)
{
#if !defined( _FINAL_BUILD )
CDNQueryTest::GetInstance().ProcessQueryTest( szCmd );
#endif // #if !defined( _FINAL_BUILD )
if (strcmp(szCmd, "exit") == 0)
break;
if (strcmp(szCmd, "onsp") == 0)
g_SPLog.SetActive(true);
if (strcmp(szCmd, "offsp") == 0)
g_SPLog.SetActive(false);
printf("CMD>");
std::cin >> szCmd;
}
ClearApp();
return 0;
}