광고 수익은 기아대책 서울본부에 기부합니다.

2012.02.23 11:26 윈도우/참고

콜백 함수에 대한 에러이다.
함수 선언을 static 함수로 만들던지 전역 함수로 만들어 오류를 해결한다.
posted by Town One townone

댓글을 달아 주세요

2012.02.15 15:15 윈도우/참고

다이얼로그 기반에서 OnChar 이벤트가 오지 않는다.
해당 이벤트를 받을 수 있게 하려면 App 에서 PreTranslateMessage 메시지 핸들러를 추가하고 MainWnd 에 메시지를 전달 해줘야 한다.

BOOL CTestCSKeyApp::PreTranslateMessage(MSG* pMsg)
{
 // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.

 if (pMsg->message == WM_CHAR)
 {
  this->m_pMainWnd->SendMessage(WM_CHAR, pMsg->wParam, pMsg->lParam);
  return TRUE;
 }

 return CWinAppEx::PreTranslateMessage(pMsg);
}

위 코드 처럼 return TRUE; 를 해줘 중복 전달 되지 않도록 한다.

posted by Town One townone

댓글을 달아 주세요

2012.02.04 19:45 윈도우/참고
http://tortoisesvn.net/downloads
posted by Town One townone

댓글을 달아 주세요

2012.02.04 18:58 윈도우/참고

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\keymagic]
"OSXFnBehavior"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KeyMagic]
"OSXFnBehavior"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,72,00,5c,e0,71,00,38,e0,\
  00,00,00,00


 

posted by Town One townone

댓글을 달아 주세요

2012.01.16 16:40 윈도우/스터디

출처 : http://sol9501.blog.me/70102942944
출처 : http://psmon.x-y.net/xy_bb/board.php?id=PgSkill&board_sec=0&page=2&mode=view&total=46&no=25

기본적인것이 잘 정리된것 같아서.. 퍼왔습니다.

DLL (Dynamic Link Library)이란,

어플리케이션에서 동적으로 링크하여 사용할 수 있는 라이브러리를 말하며,
확장자로는 .dll, .fon, .drv, .exe 등이 사용된다.

장점으로는,
일단, 여러 어플리케이션이 사용한다면 메모리 낭비를 줄일 수 있겠고,
업그레이드및 모듈별관리가 용이한점을 들 수 있겠다.

구조는,
간단히 코드부분과 데이터로 구성되어있으며, 스택이 없다는 것이 특징이다.
//스택은 어플이케이션의 것을 사용한다
스택이 없으므로 독립적인 프로세스가 될 수 없으며
운영체제로 부터의 메세지를 받을 수 없다
내부에 Exported Function Table을 가지고 있으며,
서수 + 기호이름 + 실제함수를 가리키는 포인터로 구성되어 있다.

(MSDN-TechnicalArticles-VisualTools-VisualC++-Visual C++4.0- DLLs for Beginners 참조)

종류는,
- Regular DLL (Statically linked MFC DLL) : 배포시 자신의 DLL만 제공가능
- Regular DLL (using Shared MFC DLL) : 배포시 자신의 DLL과 MFC공유DLL을 같이 제공
-> 어플리케이션이 MFC이외의 경우에도 사용가능
C언어 기반의 인터페이스제공 필요.
- MFC Extension DLL (using Shared MFC DLL) : MFC로 작성된 어플리케이션에서만 사용가능

링킹방법으로는,
- Implicit Linking (암시적링킹)
- DLL + Lib + header file 필요.
- 어플리케이션 로딩때 같이 로딩.
- Explicit Linking (명시적링킹)
- 로딩타임 마음대로 결정가능 ( 예: 영문리소스/한글리소스 동적으로 결정 )
- 주요함수
- LoadLibrary : DLL모듈 로딩
- GetProcAddress : 함수의 포인터를 얻어옴
- FreeLibrary : DLL 종료 (reference counter를 1감소시킨다)

컴파일러 커맨드
- _WINDLL : 현재 프로젝트가 DLL임을 의미
- _USRDLL : Regular DLL임을 의미
- _AFXDLL : using Shared MFC DLL 임을 의미
- _AFXEXT : MFC Extension DLL임을 의미

일반적인 익스포트함수 예제

extern "C" declspec(dllexport) void WINAPI function(void);
// extern "C" : 컴파일때 decoration name을 생성하지 않도록 하기위해 (C-Style)
// declspec(dllexport/dllimport) : Export/Import된 함수임을 의미
// WINAPI
- "windef.h"의 119 line 에 _stdcall 로 정의되어 있음
- PASCAL calling convension을 의미 : push는 거꾸로(오른쪽에서 왼쪽), pop은 Callee가 담당.
- 참고로, C++은 디폴트로 _cdecl을 사용 : push는 거꾸로(오른쪽에서 왼쪽), pop은 Caller가 담당.

DLL 찾기 순서
1 어플리케이션(EXE)을 포함한 폴더
2 프로세스의 현재 폴더
3 시스템 폴더
4 윈도우즈 폴더
5 Path에 지정되어 있는 폴더들...


TIPs

1. DLL에 공유데이터를 포함시키기 위한 방법

- memory-mapped file을 사용하는 방법. (요건 나중에...)

- named data section을 사용하는 방법.

#pragma data_seg ("Shared")
int iShared = 0;
#pragma data_seg ()


2. DLL내에 있는 Resource 참조 방법

- 가장 일반적인 MFC 어플리케이션 + MFC Extension DLL 의 경우 리소스를 찾는 순서

1. 어플리케이션(EXE)의 리소스 검색
2. DLL의 리소스 검색
3. MFC공유DLL의 리소스 검색
-> 중복되는 리소스이름이 있는 경우는 먼저 찾아진 리소스를 사용하게 된다.
임의로 찾기 순서를 바꾸기 위해서
AfxSetResourceHandle(원하는 모듈의 리소스핸들)을 사용할 수 있다.
예) 다음의 코드는 DLL내에 있는 리소스를 먼저 찾기 위한 코드이다.
// DLL의 코드
Handle hInstOld = AfxGetResourceHandle(); // 어플리케이션의 리소스핸들을 보관.
AfxSetResourceHandle(DLL의 DllMain에서 얻은 DLL의 리소스핸들);
// ...
AfxSetResourceHandle(hInstOld); // 원래대로 복귀

- MFC 어플리케이션(or 델파이/비베...) + Regular DLL 의 경우.

- Regular DLL을 사용하는 경우에는 위와같이 DLL내의 리소스를 참조할 수 없다.
따라서 DLL내의 리소스(다이얼로그와같은)를 참조하기 위해서는,
다음과 같이 임의로 Module State를 전환시켜주는 함수가 필요하다.
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
일반적으로 프로세스(EXE)의 인스턴스핸들은 거의 항상 0x00400000이고,
DLL은 0x10000000 이다.
DLL내에서 위의 함수를 사용한 후에는 인스턴스핸들이 DLL의 인스턴스핸들(0x10000000)로
바뀐 것을 확인해 볼 수 있을것이다.

- (어플리케이션 + ) Regular DLL + MFC Extension DLL

- Regular DLL에서 MFC Extension DLL내에 있는 리소스를 참조하려 할때 역시
그냥 되지는 않는다. 이때는 두가지 방법이 있는데,

첫번째는,

잠시 리소스를 참조하기 위해 사용되는 인스턴스핸들을 MFC Extension DLL의 것으로
바꿨다가 복구해주는 방법이다.

HINSTANCE hInstOld = AfxGetResourceHandle();
AfxSetResourceHandle(g_hModule);
m_menu.LoadMenu(IDR_LISTOUTPUT)
AfxSetResourceHandle(hInstOld); // restore the old resource chain

이 방법은 위의 리소스찾기 순서를 바꾸기 위해 사용했던 방법과 같다.
g_hModule은 DLLMain에 있던 hInstance를 전역변수로 보관한 것이다.

두번째는,

아래 소스는 MFC Extension DLL을 만들었을 때 만들어지는 소스의 일부이다.
잘 보고 가장 긴 주석문에서 시키는 대로 하면된다.

new CDynLinkLibrary(Implicit_MFCExt_dllDLL); 를 주석처리하고,
따로 함수를 만들어 익스포트 시킨다.
그리고, 그 함수를 Regular DLL의 InitInstance와 같은 함수에서
첨에 한번 초기화를 시키도록 해 주면 된다.
그러면 Regular DLL의 리소스체인에 attach된다.

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("IMPLICIT_MFCEXT_DLL.DLL Initializing!\n");

// Extension DLL one-time initialization
if (!AfxInitExtensionModule(Implicit_MFCExt_dllDLL, hInstance))
return 0;

// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result.

//new CDynLinkLibrary(Implicit_MFCExt_dllDLL);

g_hModuleInstance = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("IMPLICIT_MFCEXT_DLL.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(Implicit_MFCExt_dllDLL);
}
return 1; // ok
}

extern "C" AFX_EXT_API void WINAPI InitMFCExtDLL()
{
// create a new CDynLinkLibrary for this app
new CDynLinkLibrary(Implicit_MFCExt_dllDLL);
}


'윈도우 > 스터디' 카테고리의 다른 글

DLL (Dynamic Link Library) 정리  (0) 2012.01.16
Media Transfer Protocol (MTP)  (0) 2011.12.15
PostThreadMessage로 SendThreadMessage 구현하기  (0) 2011.11.28
_stprintf_s  (0) 2011.11.28
Visual Studio C++ 메모리 릭  (2) 2011.11.24
posted by Town One townone

댓글을 달아 주세요

2012.01.11 17:10 윈도우/참고
프로그램을 작성 할때 설계나 기술등 중요한 것들이 많이 있지만 갈수록 유지보수에 대한 관심이 커져 갑니다. 유지보수할때 수정이 용이하게 유연하게 설계 하는 것도 중요하지만, 코드를 알기 쉽고 깔끔하게 작성 하는 것도 매우 중요합니다. 유지보수를 해당 프로그램을 작성한 작성자만 하지는 않습니다. 또한 분석해야 하는 소스의 양도 많아서 알기 쉽게 되어있지 않다면 유지보수하는데 어려움이 발생합니다.

이런 이유로 코딩의 습관에 대해 이야기 해볼까 합니다.

참고한 서적 : 좋은 코딩, 나쁜 코딩:읽기 쉬운 코드가 좋은 코드다 - 한번쯤 가볍게 일고 넘어가면 좋은 책

1) 프로그램 개발 시작 전 의사코드를 작성하고 의사코드에 오류나 부족한 점이 없는지 확인한다.
    의사코드를 먼저 작성하면 프로그램 개발 시간이 많이 단축 됩니다. 의사코드도 없다면 소스만 보고 해석하여 오류등을 수정해야 하는데 소스의 분량이 많으면 쉬운일이 아닙니다. 각 단계별로 오류를 점검하여 하나씩 제외 하고 다음 단계로 넘어가 점검하면 더 빨리 오류를 수정 할 수 있을 것입니다.

    * 의사코드 : 프로그램을 작성할 때 각 모듈이 작동하는 논리를 표현하기 위한 언어, 다른 프로그램 개발자나 이용자에게 모듈이 하는 일과 작동 원리 따위를 설명하는 데 쓰인다

2) 코드 작성 시 한 줄에 한 문장만 쓴다.
  ex)
    int nAppleCount, nDeleteCount;
_______________________________
    int nAppleCount;    // 사과 갯수
    int nDeleteCount;   // 사과를 삭제한 갯수

    위 처럼 한 줄에 한 문장만 쓰면 각각 지역변수에 주석을 달수 있어 함수 도입부만 봐도 어떤 일을 하는 함수 인지 알 수 있고 함수 내의 변수의 용도를 미리 알 수 있습니다.

빈 줄로 사이사이 구분한다.
3) 선언문과 실행문을 구분한다.
4) 단락을 구분한다. - 코드 중간 중간에 수행하는 기능에 따라서 앞부분에 빈줄을 삽입하여 공간을 둔다.
5) 제어문들 사이를 구분하라 - if, for, while 등등의 제어문들에도 빈줄을 삽입하여 공간을 둔다.
6) 함수들 사이를 구분한다. - 함수와 함수는 두줄 정도 빈줄을 삽입 한다.

7) 연산자의 앞뒤로 빈 칸을 둔다. - 단항 연산자는 피연산자와 빈 간을 두지 않는다.

8) 중괄호의 위치는 항상 새로운라인 하나를 쓰도록 한다. 
    라인 전체를 중관호 하나만 쓰도록 한다. 이렇게 하면 들여쓰기 내여쓰기를 잘했는지 구별하기도 쉽고 단락의 앞부분만 보면 해당 단락의 시작과 끝을 알기 쉽다. 라인 수는 늘어 나겠지만 가독성이 훨씬 좋다.

9) 내부 블록은 들여쓰기 한다.
    가끔 자동변수를 특정 지역에 쓰기위해 또는 단락을 구분하기위해 내부 블록을 쓰는데 이때는 들여쓰기하여 가독성을 좋게 한다.

10) 피제어부는 들여쓰기 한다. - 피제어부는 블록('{', '}') 으로 지정 하여 주는 것이 좋다.
      ex)
if( n1 == n2)
    n1 = n3 * 1000;
11) 주석을 잘 활용 하자.

 - 강조 사항이 없는 한 줄 주석
/* 한 줄 주석은 프로그램의 본문 주석에 많이 사용된다.
*/

 - 강조 사항이 있는 한줄 수석
/*--> 주의 : 오류 메시지 처리 확인 요망 <--*/
/*>>>>>>> 정밀 계산 루틴 <<<<<<<*/

 - 강조 사항이 없는 여러 줄 주석
/*
 * 여러 줄에 걸치 주석
 * 긴 줄로 장황하게
 * 설명 해야 할때 사용 됨
 */

 - 강조 사항이 있는 여러 줄 주석
/***********************************************************/
/*!!!!!!!!!!!!!!!!!!!                  경고(Warning)                    !!!!!!!!!!!!!!!!!!!!!*/
/***********************************************************/
/*  이 프로그램은 버그가 많기때문에 테스트를 많이 해야한다. ㅋㅋㅋ  */
/* 이런식으로 경고 문구 주석을 넣는다.                                             */
/***********************************************************/

 - 변수 사전용 주석
int nAdLength;  // 광고 길이
이렇게 각 변수에 주석을 달자.

 - 의사 코드를 달자
프로그램의 목적과 논리를 의사코드만 읽고도 쉽게 이해 할 수 있다.

 - 프로그램의 목적을 주석으로 달아 놓자.

12) 식별자 이름을 지을때 좋은 코딩 습관
 - 변수 이름을 지을때 체계적이고 헝가리안 표기 법으로 지어라.
    변수 이름을 지을때 변수의 성격이나 역할을 나타낼 수 있는 어떤 규칙을 만들고 변수의
    이름 앞에 자료형을 포함한 변수의 성격이나 역할을 표기하는 것이 좋다.

접두사 예)
a, arr : 배열
b : BOOL 형 변수
c : character 형 변수
d : double 형 변수
f : float 형 변수
fd : 파일 기술자
fp : 파일 포인터 형 변수
h : 핸들
i, n : int 형 변수
p, prt : 포인터형 변수
r : 참조형 변수
s, str : 스트링형 변수 (string, CString)
u : unsigned int 형 변수
w : WORD 형 변수
dw : DWORD 형 변수


247
posted by Town One townone

댓글을 달아 주세요

2012.01.04 11:34 윈도우/참고
현재 프로젝트의 pdb 파일이 사용중일 때 발생 합니다.
컴파일 전 해당 프로그램을 종료 후 컴파일 시도 하세요.
posted by Town One townone

댓글을 달아 주세요

2012.01.02 10:30 윈도우/참고
포함파일 디렉터리와 라이브러리파일 디렉터리에 순서가 잘못 되어 있거나 설정 되어 있지 않을 경우 발생
두가지 디렉터리에 바르게 설정하면 해결된다.
posted by Town One townone

댓글을 달아 주세요

2011.12.30 12:26 윈도우/참고

MFC 를 쓰지 않는 프로젝트에 MFC 함수를 쓰려고 헤더를 인클루드 시키면 위와 같이 에러가 나는데
추가하는 헤더 파일 앞에
#undef _WINDOWS_
를 추가해주면 에러를 없앨 수 있다.

posted by Town One townone

댓글을 달아 주세요