diff --git a/TestLibDlg/TestLibDlg.sln b/TestLibDlg/TestLibDlg.sln new file mode 100644 index 0000000..a95fff3 --- /dev/null +++ b/TestLibDlg/TestLibDlg.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35707.178 d17.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestLibDlg", "TestLibDlg\TestLibDlg.vcxproj", "{FC9D3553-56B2-4453-AB34-94CF67213CE2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Debug|x64.ActiveCfg = Debug|x64 + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Debug|x64.Build.0 = Debug|x64 + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Debug|x86.ActiveCfg = Debug|Win32 + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Debug|x86.Build.0 = Debug|Win32 + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Release|x64.ActiveCfg = Release|x64 + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Release|x64.Build.0 = Release|x64 + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Release|x86.ActiveCfg = Release|Win32 + {FC9D3553-56B2-4453-AB34-94CF67213CE2}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/TestLibDlg/TestLibDlg/DlgProxy.cpp b/TestLibDlg/TestLibDlg/DlgProxy.cpp new file mode 100644 index 0000000..43e8f42 --- /dev/null +++ b/TestLibDlg/TestLibDlg/DlgProxy.cpp @@ -0,0 +1,87 @@ + +// DlgProxy.cpp: 구현 파일 +// + +#include "pch.h" +#include "framework.h" +#include "TestLibDlg.h" +#include "DlgProxy.h" +#include "TestLibDlgDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CTestLibDlgDlgAutoProxy + +IMPLEMENT_DYNCREATE(CTestLibDlgDlgAutoProxy, CCmdTarget) + +CTestLibDlgDlgAutoProxy::CTestLibDlgDlgAutoProxy() +{ + EnableAutomation(); + + // 자동화 개체가 활성화되어 있는 동안 계속 애플리케이션을 실행하기 위해 + // 생성자에서 AfxOleLockApp를 호출합니다. + AfxOleLockApp(); + + // 애플리케이션의 주 창 포인터를 통해 대화 상자에 대한 + // 액세스를 가져옵니다. 프록시의 내부 포인터를 설정하여 + // 대화 상자를 가리키고 대화 상자의 후방 포인터를 이 프록시로 + // 설정합니다. + ASSERT_VALID(AfxGetApp()->m_pMainWnd); + if (AfxGetApp()->m_pMainWnd) + { + ASSERT_KINDOF(CTestLibDlgDlg, AfxGetApp()->m_pMainWnd); + if (AfxGetApp()->m_pMainWnd->IsKindOf(RUNTIME_CLASS(CTestLibDlgDlg))) + { + m_pDialog = reinterpret_cast(AfxGetApp()->m_pMainWnd); + m_pDialog->m_pAutoProxy = this; + } + } +} + +CTestLibDlgDlgAutoProxy::~CTestLibDlgDlgAutoProxy() +{ + // 모든 개체가 OLE 자동화로 만들어졌을 때 애플리케이션을 종료하기 위해 + // 소멸자가 AfxOleUnlockApp를 호출합니다. + // 이러한 호출로 주 대화 상자가 삭제될 수 있습니다. + if (m_pDialog != nullptr) + m_pDialog->m_pAutoProxy = nullptr; + AfxOleUnlockApp(); +} + +void CTestLibDlgDlgAutoProxy::OnFinalRelease() +{ + // 자동화 개체에 대한 마지막 참조가 해제되면 + // OnFinalRelease가 호출됩니다. 기본 클래스에서 자동으로 개체를 삭제합니다. + // 기본 클래스를 호출하기 전에 개체에 필요한 추가 정리 작업을 + // 추가하세요. + + CCmdTarget::OnFinalRelease(); +} + +BEGIN_MESSAGE_MAP(CTestLibDlgDlgAutoProxy, CCmdTarget) +END_MESSAGE_MAP() + +BEGIN_DISPATCH_MAP(CTestLibDlgDlgAutoProxy, CCmdTarget) +END_DISPATCH_MAP() + +// 참고: IID_ITestLibDlg에 대한 지원을 추가하여 +// VBA에서 형식 안전 바인딩을 지원합니다. +// 이 IID는 .IDL 파일에 있는 dispinterface의 GUID와 일치해야 합니다. + +// {3d30aa0d-19ce-4ca6-92b1-70a7403d578c} +static const IID IID_ITestLibDlg = +{0x3d30aa0d,0x19ce,0x4ca6,{0x92,0xb1,0x70,0xa7,0x40,0x3d,0x57,0x8c}}; + +BEGIN_INTERFACE_MAP(CTestLibDlgDlgAutoProxy, CCmdTarget) + INTERFACE_PART(CTestLibDlgDlgAutoProxy, IID_ITestLibDlg, Dispatch) +END_INTERFACE_MAP() + +// IMPLEMENT_OLECREATE2 매크로가 이 프로젝트의 pch.h에 정의됩니다. +// {faa0893c-64ec-4ba5-b1f0-18ed8cb7f106} +IMPLEMENT_OLECREATE2(CTestLibDlgDlgAutoProxy, "TestLibDlg.Application", 0xfaa0893c,0x64ec,0x4ba5,0xb1,0xf0,0x18,0xed,0x8c,0xb7,0xf1,0x06) + + +// CTestLibDlgDlgAutoProxy 메시지 처리기 diff --git a/TestLibDlg/TestLibDlg/DlgProxy.h b/TestLibDlg/TestLibDlg/DlgProxy.h new file mode 100644 index 0000000..f6d30bd --- /dev/null +++ b/TestLibDlg/TestLibDlg/DlgProxy.h @@ -0,0 +1,43 @@ + +// DlgProxy.h: 헤더 파일 +// + +#pragma once + +class CTestLibDlgDlg; + + +// CTestLibDlgDlgAutoProxy 명령 대상 + +class CTestLibDlgDlgAutoProxy : public CCmdTarget +{ + DECLARE_DYNCREATE(CTestLibDlgDlgAutoProxy) + + CTestLibDlgDlgAutoProxy(); // 동적 만들기에 사용되는 protected 생성자입니다. + +// 특성입니다. +public: + CTestLibDlgDlg* m_pDialog; + +// 작업입니다. +public: + +// 재정의입니다. + public: + virtual void OnFinalRelease(); + +// 구현입니다. +protected: + virtual ~CTestLibDlgDlgAutoProxy(); + + // 생성된 메시지 맵 함수 + + DECLARE_MESSAGE_MAP() + DECLARE_OLECREATE(CTestLibDlgDlgAutoProxy) + + // 생성된 OLE 디스패치 맵 함수 + + DECLARE_DISPATCH_MAP() + DECLARE_INTERFACE_MAP() +}; + diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.aps b/TestLibDlg/TestLibDlg/TestLibDlg.aps new file mode 100644 index 0000000..c57b48e Binary files /dev/null and b/TestLibDlg/TestLibDlg/TestLibDlg.aps differ diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.cpp b/TestLibDlg/TestLibDlg/TestLibDlg.cpp new file mode 100644 index 0000000..293eb9f --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg.cpp @@ -0,0 +1,153 @@ + +// TestLibDlg.cpp: 애플리케이션에 대한 클래스 동작을 정의합니다. +// + +#include "pch.h" +#include "framework.h" +#include "TestLibDlg.h" +#include "TestLibDlgDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CTestLibDlgApp + +BEGIN_MESSAGE_MAP(CTestLibDlgApp, CWinApp) + ON_COMMAND(ID_HELP, &CWinApp::OnHelp) +END_MESSAGE_MAP() + + +// CTestLibDlgApp 생성 + +CTestLibDlgApp::CTestLibDlgApp() +{ + // 다시 시작 관리자 지원 + m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; + + // TODO: 여기에 생성 코드를 추가합니다. + // InitInstance에 모든 중요한 초기화 작업을 배치합니다. +} + + +// 유일한 CTestLibDlgApp 개체입니다. + +CTestLibDlgApp theApp; + +const GUID CDECL BASED_CODE _tlid = + {0xe6371bfe,0x4bde,0x4d88,{0xb4,0x04,0x1d,0x2f,0x22,0x2f,0x1d,0xdf}}; +const WORD _wVerMajor = 1; +const WORD _wVerMinor = 0; + + +// CTestLibDlgApp 초기화 + +BOOL CTestLibDlgApp::InitInstance() +{ + // Windows XP에서는 InitCommonControlsEx()를 필요로 합니다. + // 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다. + // InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다. + INITCOMMONCONTROLSEX InitCtrls; + InitCtrls.dwSize = sizeof(InitCtrls); + // 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록 + // 이 항목을 설정하십시오. + InitCtrls.dwICC = ICC_WIN95_CLASSES; + InitCommonControlsEx(&InitCtrls); + + CWinApp::InitInstance(); + + + // OLE 라이브러리를 초기화합니다. + if (!AfxOleInit()) + { + AfxMessageBox(IDP_OLE_INIT_FAILED); + return FALSE; + } + + AfxEnableControlContainer(); + + // 대화 상자에 셸 트리 뷰 또는 + // 셸 목록 뷰 컨트롤이 포함되어 있는 경우 셸 관리자를 만듭니다. + CShellManager *pShellManager = new CShellManager; + + // MFC 컨트롤의 테마를 사용하기 위해 "Windows 원형" 비주얼 관리자 활성화 + CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); + + // 표준 초기화 + // 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면 + // 아래에서 필요 없는 특정 초기화 + // 루틴을 제거해야 합니다. + // 해당 설정이 저장된 레지스트리 키를 변경하십시오. + // TODO: 이 문자열을 회사 또는 조직의 이름과 같은 + // 적절한 내용으로 수정해야 합니다. + SetRegistryKey(_T("로컬 애플리케이션 마법사에서 생성된 애플리케이션")); + // 자동화 또는 reg/unreg 스위치에 대한 명령줄을 구문 분석합니다. + CCommandLineInfo cmdInfo; + ParseCommandLine(cmdInfo); + + // 응용 프로그램이 /Embedding 또는 /Automation 스위치로 시작되었습니다. + // 응용 프로그램을 자동화 서버로 실행합니다. + if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) + { + // CoRegisterClassObject()를 통해 클래스 팩터리를 등록합니다. + COleTemplateServer::RegisterAll(); + } + // 응용 프로그램이 /Unregserver 또는 /Unregister 스위치로 시작되었습니다. 레지스트리에서 항목을 + // 제거합니다. + else if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister) + { + COleObjectFactory::UpdateRegistryAll(FALSE); + AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor); + return FALSE; + } + // 응용 프로그램이 독립 실행형으로 시작되었거나 다른 스위치로 시작되었습니다(예: /Register + // 또는 /Regserver). typelibrary를 포함하여 레지스트리 항목을 업데이트합니다. + else + { + COleObjectFactory::UpdateRegistryAll(); + AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid); + if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppRegister) + return FALSE; + } + + CTestLibDlgDlg dlg; + m_pMainWnd = &dlg; + INT_PTR nResponse = dlg.DoModal(); + if (nResponse == IDOK) + { + // TODO: 여기에 [확인]을 클릭하여 대화 상자가 없어질 때 처리할 + // 코드를 배치합니다. + } + else if (nResponse == IDCANCEL) + { + // TODO: 여기에 [취소]를 클릭하여 대화 상자가 없어질 때 처리할 + // 코드를 배치합니다. + } + else if (nResponse == -1) + { + TRACE(traceAppMsg, 0, "경고: 대화 상자를 만들지 못했으므로 애플리케이션이 예기치 않게 종료됩니다.\n"); + TRACE(traceAppMsg, 0, "경고: 대화 상자에서 MFC 컨트롤을 사용하는 경우 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS를 수행할 수 없습니다.\n"); + } + + // 위에서 만든 셸 관리자를 삭제합니다. + if (pShellManager != nullptr) + { + delete pShellManager; + } + +#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS) + ControlBarCleanUp(); +#endif + + // 대화 상자가 닫혔으므로 응용 프로그램의 메시지 펌프를 시작하지 않고 응용 프로그램을 끝낼 수 있도록 FALSE를 + // 반환합니다. + return FALSE; +} + +int CTestLibDlgApp::ExitInstance() +{ + AfxOleTerm(FALSE); + + return CWinApp::ExitInstance(); +} diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.h b/TestLibDlg/TestLibDlg/TestLibDlg.h new file mode 100644 index 0000000..e0e5304 --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg.h @@ -0,0 +1,33 @@ + +// TestLibDlg.h: PROJECT_NAME 애플리케이션에 대한 주 헤더 파일입니다. +// + +#pragma once + +#ifndef __AFXWIN_H__ + #error "PCH에 대해 이 파일을 포함하기 전에 'pch.h'를 포함합니다." +#endif + +#include "resource.h" // 주 기호입니다. + + +// CTestLibDlgApp: +// 이 클래스의 구현에 대해서는 TestLibDlg.cpp을(를) 참조하세요. +// + +class CTestLibDlgApp : public CWinApp +{ +public: + CTestLibDlgApp(); + +// 재정의입니다. +public: + virtual BOOL InitInstance(); + virtual int ExitInstance(); + +// 구현입니다. + + DECLARE_MESSAGE_MAP() +}; + +extern CTestLibDlgApp theApp; diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.idl b/TestLibDlg/TestLibDlg/TestLibDlg.idl new file mode 100644 index 0000000..8a4712f --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg.idl @@ -0,0 +1,29 @@ +// TestLibDlg.idl: TestLibDlg.exe의 형식 라이브러리 소스 + +// 이 파일은 MIDL 컴파일러에 의해 처리되어 +// 형식 라이브러리(TestLibDlg.tlb)입니다. + +[ uuid(e6371bfe-4bde-4d88-b404-1d2f222f1ddf), version(1.0) ] +library TestLibDlg +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + // CTestLibDlgDoc의 기본 디스패치 인터페이스 + + [ uuid(3d30aa0d-19ce-4ca6-92b1-70a7403d578c) ] + dispinterface ITestLibDlg + { + properties: + + methods: + }; + + // CTestLibDlgDoc에 대한 클래스 정보 + + [ uuid(faa0893c-64ec-4ba5-b1f0-18ed8cb7f106) ] + coclass TestLibDlg + { + [default] dispinterface ITestLibDlg; + }; +}; diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.rc b/TestLibDlg/TestLibDlg/TestLibDlg.rc new file mode 100644 index 0000000..c147727 Binary files /dev/null and b/TestLibDlg/TestLibDlg/TestLibDlg.rc differ diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.reg b/TestLibDlg/TestLibDlg/TestLibDlg.reg new file mode 100644 index 0000000..9a7b5f4 --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg.reg @@ -0,0 +1,17 @@ +REGEDIT +; .REG 파일은 SETUP 프로그램에 사용될 수 있습니다. +; SETUP 프로그램을 사용할 수 없는 경우 아래 항목이 +; CWinApp::RegisterShellFileTypes 및 COleObjectFactory::UpdateRegistryAll을 +; 호출하여 InitInstance에 자동으로 등록됩니다. + + +HKEY_CLASSES_ROOT\TestLibDlg.Application = TestLibDlg Application + + +HKEY_CLASSES_ROOT\TestLibDlg.Application\CLSID = {faa0893c-64ec-4ba5-b1f0-18ed8cb7f106} + +HKEY_CLASSES_ROOT\CLSID\{faa0893c-64ec-4ba5-b1f0-18ed8cb7f106} = TestLibDlg Application +HKEY_CLASSES_ROOT\CLSID\{faa0893c-64ec-4ba5-b1f0-18ed8cb7f106}\ProgId = TestLibDlg.Application + + +HKEY_CLASSES_ROOT\CLSID\{faa0893c-64ec-4ba5-b1f0-18ed8cb7f106}\LocalServer32 = TestLibDlg.EXE diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj b/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj new file mode 100644 index 0000000..a60be9b --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj @@ -0,0 +1,240 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + {FC9D3553-56B2-4453-AB34-94CF67213CE2} + MFCProj + TestLibDlg + 10.0 + + + + Application + true + v143 + Unicode + Dynamic + + + Application + false + v143 + true + Unicode + Dynamic + + + Application + true + v143 + Unicode + Dynamic + + + Application + false + v143 + true + Unicode + Dynamic + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + true + _WINDOWS;_DEBUG;%(PreprocessorDefinitions) + pch.h + stdcpp20 + C:\git_work\test_lib\a2lLib\a2lLib\include;%(AdditionalIncludeDirectories) + + + Windows + true + C:\git_work\test_lib\a2lLib\Debug\a2lLib.lib;%(AdditionalDependencies) + + + false + true + _DEBUG;%(PreprocessorDefinitions) + $(IntDir)TestLibDlg.tlb + TestLibDlg_h.h + + + 0x0412 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + true + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + pch.h + C:\git_work\test_lib\a2lLib\a2lLib\include;C:\boost\include\boost-1_87 + stdcpp20 + + + Windows + true + C:\git_work\test_lib\a2lLib\Debug\a2lLib.lib + C:\boost\x86_lib;%(AdditionalLibraryDirectories) + + + false + true + _DEBUG;%(PreprocessorDefinitions) + $(IntDir)TestLibDlg.tlb + TestLibDlg_h.h + + + 0x0412 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + true + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + pch.h + + + Windows + true + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + $(IntDir)TestLibDlg.tlb + TestLibDlg_h.h + + + 0x0412 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + true + true + true + _WINDOWS;NDEBUG;%(PreprocessorDefinitions) + pch.h + + + Windows + true + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + $(IntDir)TestLibDlg.tlb + TestLibDlg_h.h + + + 0x0412 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj.filters b/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj.filters new file mode 100644 index 0000000..58d9b90 --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj.filters @@ -0,0 +1,75 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 헤더 파일 + + + 헤더 파일 + + + 헤더 파일 + + + 헤더 파일 + + + 헤더 파일 + + + 헤더 파일 + + + 헤더 파일 + + + + + 소스 파일 + + + 소스 파일 + + + 소스 파일 + + + 소스 파일 + + + + + 소스 파일 + + + + + + 리소스 파일 + + + + + 리소스 파일 + + + + + 리소스 파일 + + + \ No newline at end of file diff --git a/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj.user b/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj.user new file mode 100644 index 0000000..bb0cac4 --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg.vcxproj.user @@ -0,0 +1,6 @@ + + + + TestLibDlg.rc + + \ No newline at end of file diff --git a/TestLibDlg/TestLibDlg/TestLibDlgDlg.cpp b/TestLibDlg/TestLibDlg/TestLibDlgDlg.cpp new file mode 100644 index 0000000..407c8fb --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlgDlg.cpp @@ -0,0 +1,519 @@ + +// TestLibDlgDlg.cpp: 구현 파일 +// + +#include "pch.h" +#include "framework.h" +#include "TestLibDlg.h" +#include "TestLibDlgDlg.h" +#include "DlgProxy.h" +#include "afxdialogex.h" + + +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +//template +//std::wstring wstring_format(const std::wstring& format, Args ... args); +template +std::string string_format(const std::string& format, Args ... args) +{ + size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0' + if (size <= 0) { + throw std::runtime_error("Error during formatting."); + } + std::unique_ptr buf(new char[size]); + snprintf(buf.get(), size, format.c_str(), args ...); + return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside } +} + +// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다. + +class CAboutDlg : public CDialogEx +{ +public: + CAboutDlg(); + +// 대화 상자 데이터입니다. +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_ABOUTBOX }; +#endif + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다. + +// 구현입니다. +protected: + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) +{ +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) +END_MESSAGE_MAP() + + +// CTestLibDlgDlg 대화 상자 + + +IMPLEMENT_DYNAMIC(CTestLibDlgDlg, CDialogEx); + +CTestLibDlgDlg::CTestLibDlgDlg(CWnd* pParent /*=nullptr*/) + : CDialogEx(IDD_TESTLIBDLG_DIALOG, pParent) +{ + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + m_pAutoProxy = nullptr; +} + +CTestLibDlgDlg::~CTestLibDlgDlg() +{ + // 이 대화 상자에 대한 자동화 프록시가 있을 경우 이 대화 상자에 대한 + // 후방 포인터를 null로 설정하여 + // 대화 상자가 삭제되었음을 알 수 있게 합니다. + if (m_pAutoProxy != nullptr) + m_pAutoProxy->m_pDialog = nullptr; +} + +void CTestLibDlgDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CTestLibDlgDlg, CDialogEx) + ON_WM_SYSCOMMAND() + ON_WM_CLOSE() + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + ON_BN_CLICKED(IDC_BUTTON1, &CTestLibDlgDlg::OnBnClickedButton1) +END_MESSAGE_MAP() + + +// CTestLibDlgDlg 메시지 처리기 + +BOOL CTestLibDlgDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); + + // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다. + + // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != nullptr) + { + BOOL bNameValid; + CString strAboutMenu; + bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); + ASSERT(bNameValid); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는 + // 프레임워크가 이 작업을 자동으로 수행합니다. + SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다. + SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다. + + // TODO: 여기에 추가 초기화 작업을 추가합니다. + + return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다. +} + +void CTestLibDlgDlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + if ((nID & 0xFFF0) == IDM_ABOUTBOX) + { + CAboutDlg dlgAbout; + dlgAbout.DoModal(); + } + else + { + CDialogEx::OnSysCommand(nID, lParam); + } +} + +// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면 +// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 애플리케이션의 경우에는 +// 프레임워크에서 이 작업을 자동으로 수행합니다. + +void CTestLibDlgDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다. + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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 + { + CDialogEx::OnPaint(); + } +} + +// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서 +// 이 함수를 호출합니다. +HCURSOR CTestLibDlgDlg::OnQueryDragIcon() +{ + return static_cast(m_hIcon); +} + +// 컨트롤러에서 해당 개체 중 하나를 계속 사용하고 있을 경우 +// 사용자가 UI를 닫을 때 자동화 서버를 종료하면 안 됩니다. 이들 +// 메시지 처리기는 프록시가 아직 사용 중인 경우 UI는 숨기지만, +// UI가 표시되지 않아도 대화 상자는 +// 남겨 둡니다. + +void CTestLibDlgDlg::OnClose() +{ + if (CanExit()) + CDialogEx::OnClose(); +} + +void CTestLibDlgDlg::OnOK() +{ + if (CanExit()) + CDialogEx::OnOK(); +} + +void CTestLibDlgDlg::OnCancel() +{ + if (CanExit()) + CDialogEx::OnCancel(); +} + +BOOL CTestLibDlgDlg::CanExit() +{ + // 프록시 개체가 계속 남아 있으면 자동화 컨트롤러에서는 + // 이 애플리케이션을 계속 사용합니다. 대화 상자는 남겨 두지만 + // 해당 UI는 숨깁니다. + if (m_pAutoProxy != nullptr) + { + ShowWindow(SW_HIDE); + return FALSE; + } + + return TRUE; +} + + + +void CTestLibDlgDlg::OnBnClickedButton1() +{ + // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. + loadA2lFile("C:\\Users\\oilvirus\\Downloads\\example-a2l-file.a2l"); +} + +void CTestLibDlgDlg::loadA2lFile(std::string strFilePath) +{ + std::string strLogData; + + bool bIsFileExist = false; + try { + bIsFileExist = std::filesystem::exists(strFilePath); + } + catch (const std::exception& error) { + std::cout << "Failed to fetch the A2l test files. Error: " + << error.what(); + } + + a2l::A2lFile file; + file.Filename(strFilePath.data()); + const auto parse = file.ParseFile(); + if (parse ) + std::cout << file.LastError() << " : " << strFilePath.data(); + std::cout << file.Name() << (parse ? " : OK" : " : FAIL") << std::endl; + + AddLogString(strFilePath.data()); + + + //if (file.A2lVersion().VersionNo == 1) + // ; + std::cout << file.A2lVersion().VersionNo << " : " << file.A2lVersion().VersionNo; + AddLogString(string_format("file.A2lVersion().VersionNo : %d", file.A2lVersion().VersionNo)); + + //if (file.A2lVersion().UpgradeNo == 71) + // ; + std::cout << file.A2lVersion().UpgradeNo << " : " << file.A2lVersion().UpgradeNo; + AddLogString(string_format("file.A2lVersion().UpgradeNo : %d", file.A2lVersion().UpgradeNo)); + + const auto& project = file.Project(); + + const auto& header = project.Header(); + //EXPECT_FALSE(header.Comment.empty()); + //EXPECT_FALSE(header.ProjectNo.empty()); + //EXPECT_FALSE(header.VersionNo.empty()); + std::cout << header.Comment << " : " << header.Comment; + AddLogString(string_format("header.Comment : %s", header.Comment.c_str())); + std::cout << header.ProjectNo << " : " << header.ProjectNo; + AddLogString(string_format("header.ProjectNo : %s", header.ProjectNo.c_str())); + std::cout << header.VersionNo << " : " << header.VersionNo; + AddLogString(string_format("header.VersionNo : %s", header.VersionNo.c_str())); + + const auto& module_list = project.Modules(); + //ASSERT_EQ(module_list.size(), 1); + std::cout << module_list.size() << " : " << module_list.size(); + AddLogString(string_format("module_list.size() : %d", module_list.size())); + + + const auto& module = module_list.cbegin()->second; + //ASSERT_TRUE(module); + + //EXPECT_STREQ(module->Name().c_str(), "Example"); + //EXPECT_FALSE(module->A2ml().empty()); + AddLogString(string_format("module->Name() : %s", module->Name().c_str())); + AddLogString(string_format("module->A2ml() : %s", module->A2ml().c_str())); + + AddLogString(""); + + for (const auto& [protocol, if_data] : module->IfDatas()) { + a2l::IfDataBlock block(if_data); + //EXPECT_TRUE(block.IsOk()) << block.LastError(); + std::cout << block.AsString() << std::endl; + + AddLogString(string_format("IF_DATA : %s", block.Protocol().c_str())); + AddLogString(string_format("block.ItemList().size() : %d", block.ItemList().size())); + + for (int i = 0; i < block.ItemList().size(); i++) { + AddLogString(string_format("%d block.ItemList() : %s", i, block.ItemList()[i].BlockName.c_str())); + AddLogString(string_format("block.ItemList()[i].ItemList.size() : %d", block.ItemList()[i].ItemList.size())); + + for (int j = 0; j < block.ItemList()[i].ItemList.size(); j++) { + // check digit + bool bIsDigit = true; + if (j > 0) + TRACE("asdf"); + for (int cnt = 0; cnt < block.ItemList()[i].ItemList[j].Value.size(); cnt++) { + //int value = std::isdigit(block.ItemList()[i].ItemList[j].Value.at(cnt)); + //int alpha = std::isalpha(block.ItemList()[i].ItemList[j].Value.at(cnt)); + //TRACE("[%c][%d][%d]\n", block.ItemList()[i].ItemList[j].Value.at(cnt), value, alpha); + if (std::isdigit(block.ItemList()[i].ItemList[j].Value.at(cnt)) == 0) + bIsDigit = false; + } + + if (bIsDigit) + AddLogString(string_format("%d : Address 0x%X (%d) : ", j, atoi(block.ItemList()[i].ItemList[j].Value.c_str()), atoi(block.ItemList()[i].ItemList[j].Value.c_str()))); + else + AddLogString(string_format("%d : %s", j, block.ItemList()[i].ItemList[j].Value.c_str())); + + + for (int k = 0; k < (block.ItemList()[i].ItemList[j].ItemList.size()); k++) { + + } + } + + AddLogString(""); + } + //AddLogString(string_format("block.AsString() : %s", block.AsString().c_str())); + + AddLogString(""); + } + + AddLogString(""); + const auto& axis_list = module->AxisPtss(); + //EXPECT_GT(axis_list.size(), 1); + std::cout << "\t\tAXIS PTS" << std::endl; + for (const auto& [pts_name, pts] : axis_list) { + std::cout << pts_name << std::endl; + } + std::cout << std::endl; + + const auto& blob_list = module->Blobs(); + //EXPECT_GT(blob_list.size(), 0); + std::cout << "\t\tBLOB" << std::endl; + for (const auto& [blob_name, blob] : blob_list) { + std::cout << blob_name << " " << blob->Address() << std::endl; + } + std::cout << std::endl; + + const auto& characteristic_list = module->Characteristics(); + //EXPECT_GT(characteristic_list.size(), 0); + std::cout << "\t\tCHARACTERISTIC" << std::endl; + for (const auto& [char_name, characteristic] : characteristic_list) { + std::cout << char_name << " " << characteristic->Description() << std::endl; + } + std::cout << std::endl; + + const auto& compu_method_list = module->CompuMethods(); + //EXPECT_GT(compu_method_list.size(), 0); + std::cout << "\t\tCOMPU METHOD" << std::endl; + for (const auto& [method_name, method] : compu_method_list) { + std::cout << method_name << " " << method->Description() << std::endl; + } + std::cout << std::endl; + + const auto& compu_tab_list = module->CompuTabs(); + //EXPECT_GT(compu_tab_list.size(), 0); + std::cout << "\t\tCOMPU TAB" << std::endl; + for (const auto& [tab_name, tab] : compu_tab_list) { + std::cout << tab_name << " " << tab->Description() << std::endl; + } + std::cout << std::endl; + + const auto& compu_vtab_list = module->CompuVtabs(); + //EXPECT_GT(compu_vtab_list.size(), 0); + std::cout << "\t\tCOMPU VTAB" << std::endl; + for (const auto& [vtab_name, vtab] : compu_vtab_list) { + std::cout << vtab_name << " " << vtab->Description() << std::endl; + } + std::cout << std::endl; + + const auto& compu_vtab_range_list = module->CompuVtabRanges(); + //EXPECT_GT(compu_vtab_range_list.size(), 0); + std::cout << "\t\tCOMPU VTAB RANGE" << std::endl; + for (const auto& [range_name, range] : compu_vtab_range_list) { + std::cout << range_name << " " << range->Description() << std::endl; + } + std::cout << std::endl; + + const auto& frame_list = module->Frames(); + // EXPECT_GT(frame_list.size(), 0); No frames in file + std::cout << "\t\tFRAME" << std::endl; + for (const auto& [frame_name, frame] : frame_list) { + std::cout << frame_name << " " << frame->Description() << std::endl; + } + std::cout << std::endl; + + const auto& func_list = module->Functions(); + //EXPECT_GT(func_list.size(), 0); + std::cout << "\t\tFUNCTION" << std::endl; + for (const auto& [func_name, func] : func_list) { + std::cout << func_name << " " << func->Description() << std::endl; + } + std::cout << std::endl; + + const auto& group_list = module->Groups(); + //EXPECT_GT(group_list.size(), 0); + std::cout << "\t\tGROUP" << std::endl; + for (const auto& [group_name, group] : group_list) { + std::cout << group_name << " " << group->Description() << std::endl; + } + std::cout << std::endl; + + const auto& instance_list = module->Instances(); + //EXPECT_GT(instance_list.size(), 0); + std::cout << "\t\tINSTANCE" << std::endl; + for (const auto& [instance_name, instance] : instance_list) { + std::cout << instance_name << " " << instance->Description() << std::endl; + } + std::cout << std::endl; + + const auto& meas_list = module->Measurements(); + //EXPECT_GT(meas_list.size(), 0); + std::cout << "\t\tMEASUREMENT" << std::endl; + for (const auto& [meas_name, meas] : meas_list) { + std::cout << meas_name << " " << meas->Description() << std::endl; + } + std::cout << std::endl; + + const auto& rec_list = module->RecordLayouts(); + //EXPECT_GT(rec_list.size(), 0); + std::cout << "\t\tRECORD LAYOUT" << std::endl; + for (const auto& [rec_name, rec] : rec_list) { + std::cout << rec_name << std::endl; + } + std::cout << std::endl; + + const auto& trans_list = module->Transformers(); + //EXPECT_GT(trans_list.size(), 0); + std::cout << "\t\tTRANSFORMER" << std::endl; + for (const auto& [trans_name, trans] : trans_list) { + std::cout << trans_name << std::endl; + } + std::cout << std::endl; + + const auto& taxis_list = module->TypedefAxiss(); + //EXPECT_GT(taxis_list.size(), 0); + std::cout << "\t\tTYPEDEF AXIS" << std::endl; + for (const auto& [taxis_name, taxis] : taxis_list) { + std::cout << taxis_name << std::endl; + } + std::cout << std::endl; + + const auto& tblob_list = module->TypedefBlobs(); + //EXPECT_GT(tblob_list.size(), 0); + std::cout << "\t\tTYPEDEF BLOB" << std::endl; + for (const auto& [tblob_name, tblob] : tblob_list) { + std::cout << tblob_name << std::endl; + } + std::cout << std::endl; + + const auto& tchar_list = module->TypedefCharacteristics(); + //EXPECT_GT(tchar_list.size(), 0); + std::cout << "\t\tTYPEDEF CHARACTERISTIC" << std::endl; + for (const auto& [tchar_name, tchar] : tchar_list) { + std::cout << tchar_name << std::endl; + } + std::cout << std::endl; + + const auto& tmeas_list = module->TypedefMeasurements(); + //EXPECT_GT(tmeas_list.size(), 0); + std::cout << "\t\tTYPEDEF MEASUREMENT" << std::endl; + for (const auto& [tmeas_name, tmeas] : tmeas_list) { + std::cout << tmeas_name << std::endl; + } + + std::cout << std::endl; + const auto& tstruct_list = module->TypedefStructures(); + //EXPECT_GT(tstruct_list.size(), 0); + std::cout << "\t\tTYPEDEF STRUCTURE" << std::endl; + for (const auto& [tstruct_name, tstruct] : tstruct_list) { + std::cout << tstruct_name << std::endl; + } + std::cout << std::endl; + + std::cout << std::endl; + const auto& unit_list = module->Units(); + //EXPECT_GT(unit_list.size(), 0); + std::cout << "\t\tUNIT" << std::endl; + for (const auto& [unit_name, unit] : unit_list) { + std::cout << unit_name << std::endl; + } + std::cout << std::endl; + + a2l::A2mlBlock a2ml_block(module->A2ml()); + const auto& a2ml = module->A2ml(); + const auto a2ml_parse = a2ml_block.IsOk(); + + //EXPECT_TRUE(a2ml_parse) << a2ml_block.LastError(); + /* + const auto& block_list = a2ml_scanner.BlockList(); + for (const auto& block : block_list) { + std::cout << block.AsString() << std::endl; + } + */ +} + +void CTestLibDlgDlg::AddLogString(std::string strMessage) +{ + CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST_DATA); + std::wstring message_w; + message_w.assign(strMessage.begin(), strMessage.end()); + + pListBox->AddString(message_w.c_str()); +} \ No newline at end of file diff --git a/TestLibDlg/TestLibDlg/TestLibDlgDlg.h b/TestLibDlg/TestLibDlg/TestLibDlgDlg.h new file mode 100644 index 0000000..6997723 --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlgDlg.h @@ -0,0 +1,64 @@ + +// TestLibDlgDlg.h: 헤더 파일 +// + +#pragma once + +#include +#include +#include +#include + +#include "a2l/a2lfile.h" +#include "a2l/a2mlblock.h" +#include "a2l/ifdatablock.h" + +using namespace std::filesystem; +using namespace std::chrono_literals; + +class CTestLibDlgDlgAutoProxy; + + +// CTestLibDlgDlg 대화 상자 +class CTestLibDlgDlg : public CDialogEx +{ + DECLARE_DYNAMIC(CTestLibDlgDlg); + friend class CTestLibDlgDlgAutoProxy; + +// 생성입니다. +public: + CTestLibDlgDlg(CWnd* pParent = nullptr); // 표준 생성자입니다. + virtual ~CTestLibDlgDlg(); + +// 대화 상자 데이터입니다. +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_TESTLIBDLG_DIALOG }; +#endif + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다. + + +// 구현입니다. +protected: + CTestLibDlgDlgAutoProxy* m_pAutoProxy; + HICON m_hIcon; + + BOOL CanExit(); + + // 생성된 메시지 맵 함수 + virtual BOOL OnInitDialog(); + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + afx_msg void OnPaint(); + afx_msg HCURSOR OnQueryDragIcon(); + afx_msg void OnClose(); + virtual void OnOK(); + virtual void OnCancel(); + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedButton1(); + +private: + void loadA2lFile(std::string strFilePath); + void AddLogString(std::string strMessage); +}; diff --git a/TestLibDlg/TestLibDlg/TestLibDlg_h.h b/TestLibDlg/TestLibDlg/TestLibDlg_h.h new file mode 100644 index 0000000..3b4019d --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg_h.h @@ -0,0 +1,226 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 8.01.0628 */ +/* at Tue Jan 19 12:14:07 2038 + */ +/* Compiler settings for TestLibDlg.idl: + Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0628 + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +/* @@MIDL_FILE_HEADING( ) */ + + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif /* __RPCNDR_H_VERSION__ */ + + +#ifndef __TestLibDlg_h_h__ +#define __TestLibDlg_h_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +#ifndef DECLSPEC_XFGVIRT +#if defined(_CONTROL_FLOW_GUARD_XFG) +#define DECLSPEC_XFGVIRT(base, func) __declspec(xfg_virtual(base, func)) +#else +#define DECLSPEC_XFGVIRT(base, func) +#endif +#endif + +/* Forward Declarations */ + +#ifndef __ITestLibDlg_FWD_DEFINED__ +#define __ITestLibDlg_FWD_DEFINED__ +typedef interface ITestLibDlg ITestLibDlg; + +#endif /* __ITestLibDlg_FWD_DEFINED__ */ + + +#ifndef __TestLibDlg_FWD_DEFINED__ +#define __TestLibDlg_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class TestLibDlg TestLibDlg; +#else +typedef struct TestLibDlg TestLibDlg; +#endif /* __cplusplus */ + +#endif /* __TestLibDlg_FWD_DEFINED__ */ + + +#ifdef __cplusplus +extern "C"{ +#endif + + + +#ifndef __TestLibDlg_LIBRARY_DEFINED__ +#define __TestLibDlg_LIBRARY_DEFINED__ + +/* library TestLibDlg */ +/* [version][uuid] */ + + +EXTERN_C const IID LIBID_TestLibDlg; + +#ifndef __ITestLibDlg_DISPINTERFACE_DEFINED__ +#define __ITestLibDlg_DISPINTERFACE_DEFINED__ + +/* dispinterface ITestLibDlg */ +/* [uuid] */ + + +EXTERN_C const IID DIID_ITestLibDlg; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("3d30aa0d-19ce-4ca6-92b1-70a7403d578c") + ITestLibDlg : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct ITestLibDlgVtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ITestLibDlg * This, + /* [in] */ REFIID riid, + /* [annotation][iid_is][out] */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + ITestLibDlg * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + ITestLibDlg * This); + + DECLSPEC_XFGVIRT(IDispatch, GetTypeInfoCount) + HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( + ITestLibDlg * This, + /* [out] */ UINT *pctinfo); + + DECLSPEC_XFGVIRT(IDispatch, GetTypeInfo) + HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( + ITestLibDlg * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo **ppTInfo); + + DECLSPEC_XFGVIRT(IDispatch, GetIDsOfNames) + HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( + ITestLibDlg * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR *rgszNames, + /* [range][in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID *rgDispId); + + DECLSPEC_XFGVIRT(IDispatch, Invoke) + /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( + ITestLibDlg * This, + /* [annotation][in] */ + _In_ DISPID dispIdMember, + /* [annotation][in] */ + _In_ REFIID riid, + /* [annotation][in] */ + _In_ LCID lcid, + /* [annotation][in] */ + _In_ WORD wFlags, + /* [annotation][out][in] */ + _In_ DISPPARAMS *pDispParams, + /* [annotation][out] */ + _Out_opt_ VARIANT *pVarResult, + /* [annotation][out] */ + _Out_opt_ EXCEPINFO *pExcepInfo, + /* [annotation][out] */ + _Out_opt_ UINT *puArgErr); + + END_INTERFACE + } ITestLibDlgVtbl; + + interface ITestLibDlg + { + CONST_VTBL struct ITestLibDlgVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ITestLibDlg_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ITestLibDlg_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ITestLibDlg_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ITestLibDlg_GetTypeInfoCount(This,pctinfo) \ + ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) + +#define ITestLibDlg_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) + +#define ITestLibDlg_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) + +#define ITestLibDlg_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* __ITestLibDlg_DISPINTERFACE_DEFINED__ */ + + +EXTERN_C const CLSID CLSID_TestLibDlg; + +#ifdef __cplusplus + +class DECLSPEC_UUID("faa0893c-64ec-4ba5-b1f0-18ed8cb7f106") +TestLibDlg; +#endif +#endif /* __TestLibDlg_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/TestLibDlg/TestLibDlg/TestLibDlg_i.c b/TestLibDlg/TestLibDlg/TestLibDlg_i.c new file mode 100644 index 0000000..4766411 --- /dev/null +++ b/TestLibDlg/TestLibDlg/TestLibDlg_i.c @@ -0,0 +1,84 @@ + + +/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ + +/* link this file in with the server and any clients */ + + + /* File created by MIDL compiler version 8.01.0628 */ +/* at Tue Jan 19 12:14:07 2038 + */ +/* Compiler settings for TestLibDlg.idl: + Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0628 + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +/* @@MIDL_FILE_HEADING( ) */ + + + +#ifdef __cplusplus +extern "C"{ +#endif + + +#include +#include + +#ifdef _MIDL_USE_GUIDDEF_ + +#ifndef INITGUID +#define INITGUID +#include +#undef INITGUID +#else +#include +#endif + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) + +#else // !_MIDL_USE_GUIDDEF_ + +#ifndef __IID_DEFINED__ +#define __IID_DEFINED__ + +typedef struct _IID +{ + unsigned long x; + unsigned short s1; + unsigned short s2; + unsigned char c[8]; +} IID; + +#endif // __IID_DEFINED__ + +#ifndef CLSID_DEFINED +#define CLSID_DEFINED +typedef IID CLSID; +#endif // CLSID_DEFINED + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + EXTERN_C __declspec(selectany) const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} + +#endif // !_MIDL_USE_GUIDDEF_ + +MIDL_DEFINE_GUID(IID, LIBID_TestLibDlg,0xe6371bfe,0x4bde,0x4d88,0xb4,0x04,0x1d,0x2f,0x22,0x2f,0x1d,0xdf); + + +MIDL_DEFINE_GUID(IID, DIID_ITestLibDlg,0x3d30aa0d,0x19ce,0x4ca6,0x92,0xb1,0x70,0xa7,0x40,0x3d,0x57,0x8c); + + +MIDL_DEFINE_GUID(CLSID, CLSID_TestLibDlg,0xfaa0893c,0x64ec,0x4ba5,0xb1,0xf0,0x18,0xed,0x8c,0xb7,0xf1,0x06); + +#undef MIDL_DEFINE_GUID + +#ifdef __cplusplus +} +#endif + + + diff --git a/TestLibDlg/TestLibDlg/framework.h b/TestLibDlg/TestLibDlg/framework.h new file mode 100644 index 0000000..8b77497 --- /dev/null +++ b/TestLibDlg/TestLibDlg/framework.h @@ -0,0 +1,60 @@ +#pragma once + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다. +#endif + +#include "targetver.h" + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다. + +// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다. +#define _AFX_ALL_WARNINGS + +#include // MFC 핵심 및 표준 구성 요소입니다. +#include // MFC 확장입니다. + + +#include // MFC 자동화 클래스입니다. + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다. +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // Windows 공용 컨트롤에 대한 MFC 지원입니다. +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // MFC의 리본 및 컨트롤 막대 지원 + + + + + + + + +// 이 매크로는 TRUE를 전달한다는 점을 제외하면 IMPLEMENT_OLECREATE와 동일합니다 +// 전달하는 점만 제외하면 IMPLEMENT_OLECREATE와 같습니다. +// 자동화 컨트롤러에서 요청한 각 자동화 프록시 개체에 대해 +// 이 응용 프로그램에 대한 별도의 인스턴스가 시작되도록 합니다. +#ifndef IMPLEMENT_OLECREATE2 +#define IMPLEMENT_OLECREATE2(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \ + RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \ + const AFX_DATADEF GUID class_name::guid = \ + { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; +#endif // IMPLEMENT_OLECREATE2 + +#ifdef _UNICODE +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif +#endif + + diff --git a/TestLibDlg/TestLibDlg/pch.cpp b/TestLibDlg/TestLibDlg/pch.cpp new file mode 100644 index 0000000..bd23a58 --- /dev/null +++ b/TestLibDlg/TestLibDlg/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: 미리 컴파일된 헤더에 해당하는 소스 파일 + +#include "pch.h" + +// 미리 컴파일된 헤더를 사용하는 경우 컴파일이 성공하려면 이 소스 파일이 필요합니다. diff --git a/TestLibDlg/TestLibDlg/pch.h b/TestLibDlg/TestLibDlg/pch.h new file mode 100644 index 0000000..d99e280 --- /dev/null +++ b/TestLibDlg/TestLibDlg/pch.h @@ -0,0 +1,13 @@ +// pch.h: 미리 컴파일된 헤더 파일입니다. +// 아래 나열된 파일은 한 번만 컴파일되었으며, 향후 빌드에 대한 빌드 성능을 향상합니다. +// 코드 컴파일 및 여러 코드 검색 기능을 포함하여 IntelliSense 성능에도 영향을 미칩니다. +// 그러나 여기에 나열된 파일은 빌드 간 업데이트되는 경우 모두 다시 컴파일됩니다. +// 여기에 자주 업데이트할 파일을 추가하지 마세요. 그러면 성능이 저하됩니다. + +#ifndef PCH_H +#define PCH_H + +// 여기에 미리 컴파일하려는 헤더 추가 +#include "framework.h" + +#endif //PCH_H diff --git a/TestLibDlg/TestLibDlg/res/TestLibDlg.ico b/TestLibDlg/TestLibDlg/res/TestLibDlg.ico new file mode 100644 index 0000000..d56fbcd Binary files /dev/null and b/TestLibDlg/TestLibDlg/res/TestLibDlg.ico differ diff --git a/TestLibDlg/TestLibDlg/res/TestLibDlg.rc2 b/TestLibDlg/TestLibDlg/res/TestLibDlg.rc2 new file mode 100644 index 0000000..dc519bf Binary files /dev/null and b/TestLibDlg/TestLibDlg/res/TestLibDlg.rc2 differ diff --git a/TestLibDlg/TestLibDlg/resource.h b/TestLibDlg/TestLibDlg/resource.h new file mode 100644 index 0000000..20d9dc1 --- /dev/null +++ b/TestLibDlg/TestLibDlg/resource.h @@ -0,0 +1,23 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++에서 생성한 포함 파일입니다. +// TestLibDlg.rc에서 사용되고 있습니다. +// +#define IDM_ABOUTBOX 0x0010 +#define IDD_ABOUTBOX 100 +#define IDP_OLE_INIT_FAILED 100 +#define IDS_ABOUTBOX 101 +#define IDD_TESTLIBDLG_DIALOG 102 +#define IDR_MAINFRAME 128 +#define IDC_LIST_DATA 1001 +#define IDC_BUTTON1 1002 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 130 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/TestLibDlg/TestLibDlg/targetver.h b/TestLibDlg/TestLibDlg/targetver.h new file mode 100644 index 0000000..331a6e2 --- /dev/null +++ b/TestLibDlg/TestLibDlg/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// SDKDDKVer.h를 포함하면 최고 수준의 가용성을 가진 Windows 플랫폼이 정의됩니다. + +// 이전 Windows 플랫폼에 대해 애플리케이션을 빌드하려는 경우에는 SDKDDKVer.h를 포함하기 전에 +// WinSDKVer.h를 포함하고 _WIN32_WINNT 매크로를 지원하려는 플랫폼으로 설정하십시오. + +#include