목록Code/C++:C#:MFC (8)
Data Analysis for Investment & Control
프로그램을 개발하다보면 특정 설정값을 저장시켜야 할 때가 있는데 C++에서는 *.ini 파일에 Window API 함수를 이용해서 기록하거나, 따로 txt 파일을 생성하여 기록할 수도 있다. 또한 xml을 핸들링 할 수 있는 라이브러리를 이용해서 저장하기도 하는데, C#에서는 System.Configuration을 추가하여 사용하는 방법이 있다. 파일은 *.config의 확장자를 가지고 xml 포맷으로 저장이 되는데, 간단히 사용법을 정리해 본다. 사용하고자 하는 cs 파일에 다음과 같이 참조 추가를 한다. using System.Configuration; 솔루션 탐색기에서도 참조 트리에서 [마우스 우클릭] - [참조 추가] - [.NET] 탭 - [System.Configuration] 선택 후, 확인..
프로그램을 구현하다보면, 각종 설정파일이나 dll 파일들의 프로젝트의 기본출력 경로인 실행파일 폴더에 같이 놓아야 하는 경우가 종종있다. 이 경우 해당 경로를 얻어와야 하는 일이 가끔 생기고는 하는데, 이를 얻어오는 함수를 정리하고자 한다. ATL의 CString 클래스를 사용하여 다음과 같이 구현한다. CString get_exe_path() { CString strPath; GetModuleFileName(NULL, strPath.GetBuffer(MAX_PATH), MAX_PATH); strPath.ReleaseBuffer(); return strPath.Left(strPath.ReverseFind('\\' )+1); } 물론 CString 대신에 char 배열을 사용할 수도 있을 것이다.
C#에서는 Sytem.IO의 Directory 클래스를 이용해 특정 경로 내의 파일 리스트를 쉽게 얻어 올 수 있다. 하지만, C++에서는 어떻게 얻어올까 구글링을 하다가 dirent.h를 활용하는 방법 등 몇 가지 코드를 찾을 수가 있었는데, 그 중 가장 직관적인 방법을 정리하도록 한다. 함수를 사용하려면 다음을 추가한다. #include #include #include [Header] typedef std::wstring str_t; vector get_files_in_folder(str_t folder, str_t file_type = L "*.*"); [Source] vector get_files_in_folder(str_t folder, str_t file_type) { vector names;..
MFC 프로그래밍을 하다 보면, 특정 다이얼로그를 모듈화 시켜 사용하고 싶어질 때가 있다. 그런데, DLL 내에서 다이얼로그를 DoModel을 이용하여 호출 시, 에러 발생은 안하는데 다이얼로그 창이 아예 뜨지 않는 경우를 겪었다. 이럴 경우에 다음을 확인해 보는 것을 조언한다. 1. 다이얼로그 리소스 이름이 잘 매칭 되어 있는지를 확인한다. -> 해당 다이얼로그의 헤더에 enum { IDD = IDD_DIALOG_NAME } 과 같은 부분에서 IDD_DIALOG_NAME가 리소스 파일에 존재하는지 확인한다. 만약 없다면, 해당 다이얼로그의 리소스 이름과 맞춰준다. 2. DLL 프로젝트 속성에서 일반 > MFC 사용란에 '정적 라이브러리에서 MFC 사용'으로 설정이 되어 있는지 확인한다. -> 만약 다른..
C++/MFC 코딩을 할 때 Visual Studio의 프로젝트 환경은 유니코드로 놓고 사용하는 편이다. 왜냐하면 다국어 지원이 가능하기 때문. 머 그렇다고 다양한 국가의 언어를 사용하는 국제적인 프로그램을 만들었던 것은 아니지만... 가끔 다른 사람들이 만들어 놓은 코드나 dll을 사용해야 할 경우가 있다. 그럴 때 멀티바이트 기반으로 작성해 놓은 것을 내 코드에 적용시키기 위해 일일히 변환시켜 줘야해서 짜증날 때가 많다. 그렇다고 변환이 쉽냐면 그것도 아닌데, 해결 방법을 Googling을 해도 쉽게 찾을 수는 없었다. 그러다가 누군가 그나마 쉽게 할 수 있는 방법을 올려놓은 것을 발견했는데, 꼬박 하루 내내 고민하면서 변수 선언과 이런 저런 함수를 연달아서 사용해도 되지 않아서 참으로 간편하다. 예..
:: Interface를 더 elegant 하게... Native Code인 C++ dll과 C#을 연동시키는데 feasibility를 보는 것에 급급하다 보니, 구현된 코드가 세련되지 못하다. 우선, C++ dll의 LoadLibrary 부분의 기존 코드를 보면, unmanangedLib = LoadLibrary(TEXT( "D:\\Work\\11. P3Suite\\P3Strategist\\Debug\\P3Core.dll")); DLL 경로가 하드 코딩되어 있다!! 이걸 실행 파일이 위치하는 경로에서 읽어 오도록 수정하자. // link unmanaged class wchar_t path[MAX_PATH]; GetCurrentDirectory(MAX_PATH, path); std::wstring str..
많은 삽질을 통해 드디어 C++ C++/CLI C#을 연동하는 코드 테스트에 성공했다. 역시나 머리가 나쁘면 몸이 피곤하다. 썩 마음에 드는 방법은 아니고, 제한적이긴 하지만, known data typed 기반의 interface를 구현하는 것으로 연동이 가능할 듯 하다. 구현 순서는 아래와 같이 한다. 1. C++ dll 구현 : Regular DLL using shared MFC DLL 기반 2. C++/CLI 기반의 Wrapper Class 구현 : 여기서는 명시적 링크 방법을 사용 3. C# 프로젝트에서 C++/CLI dll을 추가시켜 사용 먼저, C++ DLL 구현이다. 1. C++ dll 구현 : Regular DLL using shared MFC DLL 기반 헤더에서 P3Base.h 파일을..
이전에는 MFC 기반의 응용프로그램을 만드는 프로젝트에서 사용했기 때문에 dll 생성을 확장 dll(extension dll)로 만들어 사용했었다. 그런데, C#에서 사용하려고 하니 이 방법으로는 할 수가 없게 되었다. 이의 해결 방법을 알아보던 중, CLI(Common Language Infrastructure)로 wrapping하는 방법이 있다는 걸 알게 되었다. 문제는 내가 확장 DLL만을 사용해봤기 때문에 기본 DLL을 생성해서 다른 프로젝트에 추가하는 방법을 모른다는 것이다. 게다가 C++ DLL을 사용하려는 타겟 프로젝트 환경이 MFC 기반이 아니기 때문에 어떻게 추가를 해줘야 하는지도 모르겠다. 먼저, 테스트를 위해 DLL 프로젝트를 하나 생성한다. DLL 빌드 옵션은 '공유 MFC DLL을..