VisualStudio.C++.C# ( 315 ) VC++ MFC Regular DLL 프로젝트 만들기. 예:CyFinAPI.dll 개요 VC++ 에서 MFC Regular DLL 만드는 법. 사용된 IDE : Visual Studio 2015 DLL 프로젝트 명칭 : CyFinAPI - Solution 명칭도 CyFinAPI 로 함. 과정요약. 1. Visual Studio 의 "새 프로젝트" (메뉴 :파일->새로만들기->프로젝트.. 클릭) 에서 MFC DLL 선택하고 프로젝트이름, 경로, 솔루션 이름 지정하고 확인버튼클릭. 2. 이후 DLL 마법사 설정선택하여 기본 DLL프로젝트 자동생성. 3. DLL 을 사용할 프로젝트에서 본 DLL 을 활용할때 필요한 헤더파일 생성해두기. 상세과정 . MFC Regular DLL 만들기. 1. 아래 그림에 Visual Studio 의 "새 프로젝트" (메뉴 :파일->새로만들기->프로젝트.. 클.. 2015. 12. 10. Visual Studio Community 2015 설치, 무료. 참고. 2017년 3월 15일. 신규 2017 버전 배포됨. Visual Studio Community 2017 -> http://igotit.tistory.com/1253 ---------------------------------------------------------------------------------------------------------- 1. Visual Studio Community 2015 설치 다운로드 주소 https://www.visualstudio.com/products/visual-studio-community-vs 설치 실행 첫화면(아래 ) 설치완료후 제어판 프로그램 및 기능에서 기능 추가 제거 가능하므로 표준설치 선택하고 설치 버튼 클릭하여 진행. 설치중 화면 설치.. 2015. 11. 28. 1바이트 변수의 비트 분리하여 2바이트 걸쳐서 저장하기. 상황. 아래 그림처럼 1바이트 변수 source_byte 가 있고, 또한 1바이트 변수 2개 target_byte1, target_byte2 가 있다. source_byte 의 상위 비트 수량 num_bit_upper 는 target_byte1의 하위 에 기록하고, source_byte 의 하위 비트 수량 num_bit_lower 는 target_byte2의 상위 에 기록해야 한다고 하자. num_bit_upper = 3 num_bit_lower = 5 source_byte bit7 6 5 4 3 2 1 0 bit7 6 5 4 3 2 1 0 bit7 6 5 4 3 2 1 0 target_byte1 target_byte2 상기 1바이트를 복사할 대상 2개 바이트. 코드구현 요점. target_byte1 =.. 2015. 10. 27. C언어, continue. 반복문에서 continue 이하 실행 생략 루프진행. continue; 반복문 (while, for등의 ) 내에서 continue; 가 실행되면 continue; 이하는 실행하지 않고 반복 시행함. 사용예. for(i=0,i 2015. 9. 13. while 대기방식에서 일정시간 응답 없는 경우 while 탈출 로직. 코드의 실행 대기 용도로 while() 문을 사용하는 경우가 있다. 예. UART RX 로 데이터 수신된것을 폴링방식으로 읽는 경우를 보면, 아래처럼 작성된다. while (RX 버퍼에 데이터가 없다면) ; // 대기. 버퍼에 데이터가 있다면 빠져나온다. 함수 RX 버퍼 읽기. // 값읽기. 위 코드의 문제점은 while 문이 무한대기에 빠져 있을 수 있다는 점이다. 송신측에서 데이터를 보낸다는 보장이 없는 경우도 있다. 위 코드에 추가로 간단한 타이머 기능을 구현하면 아래와 같다. uint32_t count=10000; // 시스템 상황에 따라 최대값을 조정한다. /// 대기상태. count 값 감소하여 0이 되어도 while탈출하고 혹은 count값이 0이 되기전에 RX버퍼에 데이터 수신되어도 탈출... 2015. 9. 1. ASCII 코드. ASCII printable code chart Binary Oct Dec Hex Glyph 010 0000 040 32 20 (space) 010 0001 041 33 21 ! 010 0010 042 34 22 " 010 0011 043 35 23 # 010 0100 044 36 24 $ 010 0101 045 37 25 % 010 0110 046 38 26 & 010 0111 047 39 27 ' 010 1000 050 40 28 ( 010 1001 051 41 29 ) 010 1010 052 42 2A * 010 1011 053 43 2B + 010 1100 054 44 2C , 010 1101 055 45 2D - 010 1110 056 46 2E . 010 1111 057 47 2F / 011 .. 2015. 9. 1. 배열 초기화. 2차원 배열 초기화 m x n 의 2차원 배열의 모든 요소(element) 를 지정된 값으로 초기화하려면 아래와 같다. 예. 2 x 3 (2행 3열) 정수형 배열이 있고, 아래 표 처럼 초기화 하고 싶다면, int Array[2][3] = {{1,2,3},{4,5,6}}; 로 초기화 하면 된다. 인덱스 0열 1열 2열 0행 1 2 3 1행 4 5 6 기타 규칙. 1. 초기화 값이 누락된 것은 0으로 초기화 됨. 예 : int Array[2][3] = {{1,2}}; 인덱스 0 1 2 0 1 2 0 1 0 0 0 2. 중괄호 1개만으로 초기화 가능. 예 : int Array[2][3] = {1,2,3,4,5,6}; // int Array[2][3] = {{1,2,3},{4,5,6}}; 와 동일함. 예 : .. 2015. 7. 7. VC++ 타이틀바에 보이는 프로그램 이름 변경. VC++ 프로젝트로 만든 프로그램 타이틀바에 보이는 이름 변경하는 법. CMainFrame 의 PreCreateWindow에 아래 파랑색 코드 추가하면됨. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~FWS_ADDTOTITLE; // 이설정을 해야 타이틀 변경 가능해짐. cs.lpszName = "내프로그램임"; return TRUE; } 대화상자의 타이틀 설정. ::OnInitDialog().. 2015. 6. 6. 다른 프로그램과 메모리 공유 - 메모리 맵 파일. 개요 다른 프로그램(프로세스)들이 동일한 메모리를 공유하는 "메모리맵파일(=공유메모리)" 활용법 정리.요점.1. ::CreateFileMapping 으로 공유메모리 생성. ::OpenFileMapping 으로 이미 생성된 공유메모리 열기.2. ::MapViewOfFile 로 상기1의 공유메모리 포인터 받아서 데이터 읽기,쓰기.더보기CreateFileMappingCreates or opens a named or unnamed file mapping object for a specified file.To specify the NUMA node for the physical memory, see CreateFileMappingNuma.SyntaxC++CopyHANDLE WINAPI CreateFileMappi.. 2015. 6. 6. 다른 프로그램과 메시지 송수신 - FindWindow이용 대상윈도우핸들로 직접 전송. 개요 서로 다른 프로그램간의 메시지 송수신을 위하여 메시지 전송대상 윈도우 핸들을 함수 FindWindow 이용하여 확보하고 메시지 전송하는 방법 정리. 간단히 2단계로 이뤄진다. 1. FindWindow 로 메시지 타겟 윈도우 핸들 받기. 2. 1에서 확보된 윈도우 핸들로 SendMessage/PostMessage 함수 이용 메시지 전송. 타 방법 비교 : 다른 프로그램간의 메시지 송수신 방식중 RegisterWindowsMessage 함수 이용하는 방식(보기 -> http://igotit.tistory.com/318 ) 대비 본 글에서의 설명하는 방식이 고속/즉시 전송이 가능하다. 구현코드예 메시지 전송할 프로그램을 A, 수신처리할 프로그램을 B라고 하면 각각의 프로그램엔 아래와 같은 구조로 코딩되면.. 2015. 6. 6. 다른 프로그램과 메시지 송수신. - RegisterWindowMessage 개요 보통 메시지(SendMessage, PostMessage) 는 1개의 프로그램내에서 주로 사용되나, 서로다른 프로그램간에도 메시지 송수신 가능하다. 본 글에서는 다른 프로그램간의 메시시 송수신 방법 정리한다. 구현방법 요점. 2개의 프로그램이 있다고 하고, 각각을 A, B 라고 하자. 메시지 전송함수 SendMessage/PostMessage 모두 사용가능하며 본 글에서는 SendMessage 를 예로 보이나, 설명중의 SendMessage는 PostMessage 로 대치가능하다. 1. A,B 모두에 RegisterWindowMessage 함수 호출한다. - 메시지를 등록하는 함수이며 이렇게 등록된 메시지는 다른 프로그램으로도 전달가능하다. - 함수의 인자로 임의 문자열을 기록하는데, 이 문자열이 .. 2015. 6. 5. Virtual-Key Codes. VC++ VC++ 에서 마우스나 키보드 이벤트 핸들러 함수 인자로 virtual key code 가 전달되며, 아래 리스트와 같다. Constant/value Description VK_LBUTTON 0x01 Left mouse button VK_RBUTTON 0x02 Right mouse button VK_CANCEL 0x03 Control-break processing VK_MBUTTON 0x04 Middle mouse button (three-button mouse) VK_XBUTTON1 0x05 X1 mouse button VK_XBUTTON2 0x06 X2 mouse button - 0x07 Undefined VK_BACK 0x08 BACKSPACE key VK_TAB 0x09 TAB key - 0x0A.. 2015. 1. 19. 키보드 입력처리. VC++ MFC 이용하는 경우. VC++ MFC기반의 키보드 입력처리. 1. 클래스 위저드 에서 메시지 선택을 WM_KEYDOWN(키를 누른 경우 발생하는 메시지) 이나, WM_KEYUP(눌렀던 키를 놓았을때 발생하는 메시지) 을 선택하여 핸들러 함수를 추가한다. 아래 코드예는 VC++2010 에서 CMyView 클래스에 WM_KEYDOWN 메시지 핸들러를 추가한 경우 자동 생성된 코드. void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. CView::OnKeyDown(nChar, nRepCnt, nFlags); } 2. 위 메시지 핸들러는 모든 키에서 전부 실행되는 구간이므로 특정키에서만 처.. 2015. 1. 19. 동적 메모리 할당. 변수,배열, new delete C++에서 new 이용하여 동적 메모리 할당하는 것 정리. 일반변수 동적 생성 및 제거. int* p; // int형의 포인터 변수선언. p = new int; // 동적생성함. *p = 234; // 변수사용예. . delete p; // 동적할당한 메모리 제거. p=NULL; // delete p; 는 메모리 공간을 제거했을뿐. 포인터 변수 p가 가리키는 주소는 남아있는 상태다. 이것까지 제거해둠. 1차원 배열 동적 생성 및 제거. - 250개의 정수형배열을 동적생성하는 예. int* p; // 포인터 변수 선언. p = new int[250]; // int형으로 배열크기 250 인 메모리 공간 할당했음. p[240] = 350; // 변수사용예. delete[] p; // 동적할당한 메모리 제거. .. 2015. 1. 17. 2차원 이상 배열의 메모리 배치순서. 2차원이상의 배열을에서 각 요소들이 실제 메모리에서 배치되는 순서. 메모리 배치 순서 : 배열 인덱스 뒤의 것부터 순차적으로 증가, 뒤의 배열인덱스가 최대수량이후 그 앞의 인덱스 증가, 예. 1차원 배열. array[N] 메모리 배치 : array[0], arry[1], ..., array[N] 2차원 배열. array[N][M] 메모리 배치 : array[0][0],array[0][1],...,array[0][M], array[1][0],array[1][1],...,array[1][M],..., array[N][M] N차원 배열도 동일. 예외. 동적 할당 한경우에는 연속배치되지 않음.- 주의할것. 2차원 이상의 배열을 동적할당한 경우에는 열 단위로 배열요소의 메모리 주소의 연속성이 끊김. 즉 array.. 2015. 1. 17. STL std::function 기반 콜백함수 구현. 개요 통상 콜백함수 구현시 함수포인터 기반으로 구현하는 방식 (보기 -> http://igotit.tistory.com/212 ) 으로는 클래스 멤버함수를 콜백으로 등록하지 못하는 단점이 있다. STL (Standard Template Library) 에서 제공하는 std::function, std::bind 등을 사용하면 클래스 멤버함수도 콜백함수로 등록가능하므로 대단히 편리하다. STL 기반 콜백구현방법 아래 설명방식에서 "다른 곳", "이곳" 이란 표현은 함수포인터 기반 콜백구현방법 설명글 (http://igotit.tistory.com/212 )에서의 것과 동일한 것임. "이곳"에 있는 함수(클래스의 멤버함수도 가능하다.)를 다른곳(예. 다른 클래스 개체, DLL등 )에 전달하여 다른 곳에서 "이.. 2015. 1. 11. 함수포인터, 콜백(Callback) 함수포인터 1. int Function(int a) {... } ; 로 정의된 함수가 있다치자. 2. 위 1의 함수의 포인터(함수이름이 포인터임)를 받을 수 있는 함수포인터 변수 pFunc 선언하고 1의 함수포인터를 대입하는 방법 int (*pFunc)(int) = Function; 3. 2처럼 대입하고나서, pFunc(1); 이라고 호출하면 Function(1); 이 호출되는 것임. 4. 1의 함수를 다른 함수 "myfunc" 의 입력인자 로 전달하기 위한 다른 함수 "myfunc" 정의 방법. void myfunc( int (*pFunc)(int) ) { pFunc(1); } myfunc 호출시 상기1의 함수를 인자로 전달하는 법 : myfunc(Function); 5. 상기2와 같은 함수포인터 변수.. 2015. 1. 11. 스레드 생성 방법 및 다중스레드 사용위한 필수 옵션 셋팅. VC++ 1. VC++ 에서 스레드 생성 VC++ 에서 스레드를 생성하는 방법은 5가지 방식이 있다. 1. WIN32 API 스레드 생성 함수 : CreateThread 2. C run time library 에서의 스레드 생성 함수 : _beginthreadex, _beginthread - _beginthreadex 가 _beginthread보다 많이 사용됨. - _beginthreadex 와 _beginthread 함수 내부에서는 상기1의 CreateThread 함수가 사용되고 있음. 3. C++ 클래스 형식의 스레드 생성 : 스레드 함수를 포함하는 클래스 형식으로 제작. - 상기 2의 함수를 C++에서 클래스 내에 포함시키는 형식으로 만드는 것을 의미한다. 결국 2를 클래스에서 사용하는 것을 의미함. - 스.. 2015. 1. 10. 이전 1 ··· 14 15 16 17 18 다음