티스토리 툴바

★º쥬니's Story...


 만약 Visual Studio 2008이나 2005에서 프로젝트 생성시 "Project Creation Failed" 이런 문구가 나오고 프로젝트 생성이 되지 않는다면... IE8 문제일 것 이다.

 해결 방법은 아래와 같다.

-          Open regedit (on a 64-bit OS, open the 32-bit regedit)

-          Under “HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\Internet Settings\Zones”, create a new key called 1000 (if it isn't already there)

-          Under 1000, create a DWORD entry with:

o   Name = 1207

o   Type = REG_DWORD

o   Data = 0x000000


위의 단계대로하고 저장한 뒤 다시 VC를 실행시키면 프로젝트 생성이 될 것이다.
그래도 안된다면....

1) Navigate to: C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE in Windows Explorer
2) Load devenv.exe.config in your favorite text editor.
3) Find this string: “Microsoft.VisualStudio.TemplateWizardInterface”
4) Comment out the element so it looks like this:
5) Restart Visual Studio 2008.


이렇게 해보시길...

자세한 사항은 아래 링크 참조...
http://blogs.msdn.com/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx
http://developerspoint.wordpress.com/2008/06/25/how-to-deal-with-project-creation-failed-problem-of-visual-studio-2008/

저작자 표시 비영리 변경 금지
Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2009/05/21 05:48

소스 혹은 파일(예를 들면, C파일)을 프로젝트에 추가시키고 왼쪽의 워크스페이스의 파일뷰에서 추가한 파일을 마우스 오른쪽 버튼을 눌러 setting을 선택한다.

그런후 [c/c++] 탭을 선택하고, 카테고리에서 [Precomfiled headers]를 선택한다.

마지막으로 Precomfiled headers 사용하지 않음을 선택한 후 실행하면 된다.


저작자 표시 비영리 변경 금지
Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2009/01/30 13:38

fatal error C1010: unexpected end of file while looking for precompiled header directive


precompiled header란 미리 컴파일된 헤러를 의미하며, 파일(.h, .cpp 등)을 추가했을시 발생한다.
precompiled header는 #include "stdafx.h"를 필요로 하기때문에 만약 이것이 없다면 에러가 발생한다.

방법은 두가지가 있다.
1. 새로 추가한 파일이나 에러난 파일에(.h, .cpp 등) #include ""stdafx.h"가 없다면 추가해준다.

2. 프로젝트 속성(옵션)을 변경하는 방법이다.
 [프로젝트] -> [속성] -> [구성 속성] -> [C/C++] -> [category] -> [precompiled headers]
 여기에서 기본적으로 설정되어있는 [Use precompiled header file]을 [Not using precompiled headers]로 변경한다.


저작자 표시 비영리 변경 금지
Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2009/01/30 04:48


fatal error C1853: 'Debug/xxx.pch' is not a precompiled header file created with this compiler


"C" 파일이 추가로 포함시켰을 경우 발생한다.

[Project Settings] -> [C/C++ tab] ->[category] -> [Precompiled Headers]
 선택한 후, [Not using precompiled headers]를 선택
 마지막으로 컴파일하면 끝~~
 

---------- 덧붙임 ----------

 debug 폴더를 모두 지우고 컴파일할 것!!
 여기서 말하는 precompiled header는 stdafx.h 파일을 말한다.


저작자 표시 비영리 변경 금지
Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2009/01/30 04:38

 

fatal error C1083 : Cannot open precompiled header file 'Debug/xxx.pch' No Such file or directory



 빠른 컴파일을 하기 위하여 미리 컴파일된 .pch 파일이 없어서 나타나는 문제이다.
 해결 방법은 [Project setting] -> [C/C++] -> [PreCompiled Header] -> [Use precompiled header file]
 선택한 후, [Rebuild All]을 하면 된다.

저작자 표시 비영리 변경 금지
Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2009/01/30 04:31

특정 함수나 루틴의 수행 시간을 계산하기 위해서는

GetTickCount() 함수를 사용하면 된다.

GetTickCount() 함수를 사용하기 위해서는 아래와 같이

우선 변수를 선언한 뒤, 함수나 루틴의 시작과 끝에서 연산만 해주면 된다.

-----------------------------------------------------------------
int start_time = 0, end_time = 0, total_time = 0;

start_time = GetTickCount();

Function();

end_time = GetTickCount();

total_time = end_time - start_time;
-----------------------------------------------------------------


이렇게 하면 total_time에 소요된 시간이 들어간다.

단위는 밀리세컨드(ms),

100이라고 결과가 나오면 100밀리세컨드 즉, 0.1초가 된다는 것!!! ^^*



Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2007/10/05 03:06
플렛폼 SDK

커뮤티케이션

커뮤니케이션의 함수 일람


함수 설명
BuildCommDCB 지정한 DCB구조체에 디바이스 제어 문자열로 지정한 값을 저장한다.
BuildCommDCBAndTimeouts 디바이스 정의 문자열을 다비아스 제어 블럭 코드에 변환한 후, 디바이스 제어 블럭에 저장한다.
ClearCommBreak 지정한 통신 디바이스의 회선이 끊긴 상태를 해제하고 문자 송신을 다시 시작한다.
ClearCommError 통신 에러의 정보를 얻고 통신 디비이스의 현재 상태를 통지한다.
CommConfigDialog 드라이버가 제공하는 설정 다이얼로그 박스를 표시한다.
EscapeCommFunction 지정한 통신 디바이스에 확장 기능을 실행하도록 지시한다.
GetCommConfig 통신 디바이스의 현재 구성을 얻는다.
GetCommMask 지정한 통신 디바이스의 이벤트 마스트의 값을 얻는다.
GetCommModemStatus 모뎀의 제어 레지스터 값을 얻는다.
GetCommProperties 지정한 통신 디바이스의 통신 프로퍼티의 정보를 버퍼에 넣는다.
GetCommState 지정한 통신 디바이스의 현재의 제어 설정을 디바이스 제어 블럭(DCB구조체)에 저장한다.
GetCommTimeouts 지정한 통신 디바이스로 실행 되는 모든 읽고 쓰는 조작의 타임아웃 파라미터를 얻는다.
GetDefaultCommConfig 통신 디바이스의 초기 설정의 구성을 얻는다.
PurgeComm 지정한 통신 자원의 출력 버퍼 또는 입력 버퍼에 있는 모든 문자를 파기한다.
SetCommBreak 지정한 통신 디바이스의 문자송신을 중단하고ClearCommBreak함수가 호출 되어질때 까지 송신 회선을 절단 상태로 한다.
SetCommConfig 통신 디바이스의 현재의 구성을 설정한다.
SetCommMask 특정 통신 디바이스로 감시하는 일련의 이벤트를 설정한다.
SetCommState 디바이스 제어 블럭(DCB구조체)의 지정에 따라서 통신 디바이스를 구성한다.
SetCommTimeouts 지정한 통신 디바이스로 실행되는 모든 읽기 쓰기 조작의 타임아웃을 설정한다.
SetDefaultCommConfig 통신 디바이스의 기본 설정의 구성을 설정한다.
SetupComm 지정한 통신 디바이스의 통신 파라미터를 초기화한다.
TransmitCommChar 지정한 통신 디바이스의 출력 버퍼에 있는 미처리 데이터보다 전에 특정 문자를 송신한다.
WaitCommEvent 지정한 통신 디바이스에서 이벤트가 발생하는 것을 대기한다.
위 링크는 일본 MSDN의 설명이 링크되어 있다.

http://msdn2.microsoft.com/en-us/library/aa363194.aspx

위 함수 일람의 영어 설명은 위에 사이트에 기술되어져 있다.

Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2007/08/13 12:06

* 헝가리안 표기법

대/소문자를 혼용하여 변수의 의미와 데이터 타입을 알 수 있도록 표기

    char szAddress[50]

    // sz -> 해당 변수와 데이터 타입을 나타내는 접두어를 표기

    // Address -> 해당 변수가 하는 역할을 알기쉽게 표현하기 위해 구체명을 쓴다.

* 변수 접두어

  • a : 배열 (Array)
  • b : BOOL 형 변수 (Boolean)
  • by : BYTE 형 변수 (Byte, = unsigned char)
  • c : 카운터 변수 (Counter, = int)
  • cb : 바이트의 개수
  • ch : char형 변수 (Character, = char)
  • cx : X 좌표용 변수 (Coordinate X Value, = int)
  • cy : Y 좌표용 변수 (Coordinate Y Value, = int)
  • d : 날짜형 변수 (CDate)
  • dbl : double형 변수 (Double, = double)
  • dw : Unsined Long (DWORD)
  • f : BOOL 형 변수 (Flag)
  • h : 핸들형 변수 (Handle, = HANDLE)
  • n : 자연수형 변수 (Natural Number, = int)
  • i : 정수형 변수 (Integer, = int)
  • i : 인덱스 (Index)
  • l : long형 변수 (Long, = long)
  • m_ : 특정 클래스의 멤버 변수 (Member Variable)
  • p : 포인터 변수 (Pointer, = [type]*)
  • lp : long/far 포인터 변수 (Long/Far Pointer)
    • 32비트 프로그래밍에서는 일반 수준의 포인터로 취급함
    • 16비트 프로그래밍에서는 먼 거리의 포인터로 취급함
  • s : 문자열 (String)
  • sz : NULL (= \0)로 끝나는 문자열 (String)
  • u : 자연수 중 양수형 변수 (Unsigned Integer, = unsigned int)
  • w : WORD형 변수 (Word, = unsigned short)
  • dw : DWORD형 변수 (Double Word, = unsigned long)
  • str : CString형 변수 (String)

* 메시지 구분에 관한 접두어

  • BM_ : 버튼 메시지
  • CB_ : 콤보 박스 메시지
  • DM_ : 다이얼로그 메시지
  • EM_ : 에디트 컨트롤 메시지
  • LB_ : 리스트 박스 메시지
  • WM_ : 윈도우 메시지

* 컨트롤 스타일에 관한 접두어

  • BS_ : 버튼 스타일
  • CBS_ : 콤보 박스 스타일
  • DS_ : 다이얼로그 스타일
  • ES_ : 에디트 컨트롤 스타일
  • LBS_ : 리스트 박스 스타일
  • WS_ : 윈도우 스타일

* Windows 프로그래밍에서 정의된 데이터 형

  • TRUE : 참을 의미하는 것. (= 1)
  • FALSE : 거짓을 의미하는 것. (= 0)

* 데이터형

  • BOOL : 논리형, TRUE/FALSE 또는 1/0 값만 가진다. (Boolean)
  • BYTE : unsigned char와 같으며 8비트. (Byte)
  • CALLBACK : 콜백 함수를 의미함.
  • COLORREF : 색상을 표현하는 32비트값.
  • DWORD : unsigned long과 같으며 32비트. (Double Word)
  • DWORDLONG : unsigned double과 같으며 64비트. (Double Word Long)
  • FLOAT : float형과 동일. (Float)
  • HANDLE : 객체 핸들
  • HBITMAP : 비트맵에 대한 핸들
  • HCURSOR : 커서에 대한 핸들
  • HDC : 디바이스 컨텍스트 핸들
  • HFILE : 파일에 대한 핸들
  • HFONT : 폰트에 대한 핸들
  • HICON : 아이콘에 대한 핸들
  • HINSTANCE : 인스턴트에 대한 핸들
  • HPEN : 펜에 대한 핸들
  • HWND : 윈도우에 대한 핸들
  • IDI_ : 아이콘 리소스
  • IDC_ : 커서 리소스
  • LONG : signed long과 같으며 32비트. (Long)
  • LONGLONG : signed double과 같으며 64비트. (Double Long)
  • LPARAM : 32비트 메시지 파라미터. (Long Parameter)
  • LPCSTR : NULL로 끝나는 Windows 문자열 상수에 대한 포인터.
  • LPCTSTR : LPCSTR과 기본적으로는 같고 유니코드 지원이 가능하다.
  • LPSTR : NULL로 끝나는 Windows 문자열의 포인터.
  • LPTSTR : LPSTR과 기본적으로는 같고 유니코드 지원이 가능하다.
  • MSG : 메시지 구조체.
  • TCHAR : 유니코드 또는 Windows 문자.
  • UINT : unsigned int와 같으며 32비트. (Unsigned Integer)
  • WORD : unsigned short와 같으며 16비트. (Unsigned Short)
  • WPARAM : 16비트 메시지 파라미터. (WORD Parameter)

* 이외에도 많이 존재하지만 대체적으로 자주 쓰는 것들이다.

Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2007/08/11 20:26


1부. MFC 확장 DLL을 만들어보자


1. 필요한 MFC, C++ 클래스를 지정하여 새로만들기에서


 프로젝트 만들기에서 MFC App Wizard(dll) DLL 을 선택한다.
 



다음은 MFC Extension DLL(using shared MFC DLL)을 선택한다.
 


2. MFC를 지원하지 않는 프로그래밍 언어에서는 사용할수 없지만 
비교적 간단히 만들고 코딩이 쉽다
 
익스포트할 클래스에 대해서 AFX_EXT_CLASS 매크로만 붙여주면 된다
이렇게...
 
class AFX_EXT_CLASS Cpsd 
{
   public:
 
};
 
즉, 이 클래스를 다른 비주얼 C++ 애플리케이션에서 사용될 수 있도록 익스포트 하겠다는 뜻이다
이 클래스를 가지고 있는 DLL에 링크될 애플리케이션에 의해 사용되는 헤더 파일에 이 매크로를
반드시 포함시켜야 클래스를 제대로 임포트할 수 있다.
 
 
DLL의 링크 
 
호출하는 방법은 implicit 과 explicit 방법이 있는데
우선 여기선 조금쉬운 방법인 implicit방법을 먼저 하자
위에서 DLL을 만들때 같이 만들어 지는 lib를 이용한다.
 
여기서 lib에 대해 언급하면...
링크될때 링커는 이 lib파일을 표준 라이브러리 처럼 다루어 처리하지만, dll을 끌어오는
lib파일은 dll이 익스포트한 함수 각각에 대한 stub(함수 호출에 쓰이는 정보를 일컬음)만을 포함
 
함수 스텁은 사실 진짜 함수와 동일한 이름과 인수 리스트를 가진 pseudo 함수로서,
내부를 살펴보면 스텁에 필요한 모든 인수를 넘겨서 DLL에 들어있는 진짜 함수를 호출하는
짤막한 코드가 들어있다.
이렇게하면 DLL의 함수를 분리된 파일이 아니라, 애플리케이션 코드의 일부인 것처럼
다루게 된다
 
LIB 파일을 임포트 라이브러리라고 부른다.
 
 

<2>DLL의 링크

DLL를 링크하는 방법은 Implicit 링킹과 Explicit 링킹 두가지 방법이 있습니다.

(1)Implict 링킹

“DLL이 있어서 DLL이 바로 동적 링크되는데 LIB 파일이 왜 필요한가?”

이렇게 물어보는 사람도 있을 것입니다. 이유는 메인프로그램을 컴파일하고 링크할 때 DLL 안에 있는 함수들은 메인프로그램에는 어느 것과도 링크되어 있지 않아 실행 파일로 만들 때 에러가 나오기 때문입니다. 예를 들어, PaintImage(LPSTR  filename);이라는 함수를 DLL로 만들어 놓고 메인프로그램에서 헤더에 extern "C"__declspec(dllimport)void PaintImage(LPSTR filename);이라고 정의하면 컴파일은 하지만 링크할 때 PaintImage 함수를 찾을 수 없다고 하며 에러를 리턴하고 실행 파일을 만들 수 없게 됩니다. 따라서, PaintImage라는 함수를 가상으로 만들어 그것을 0으로 설정해 주는 하나의 함수가 있어야 합니다.


void PaintImage(LPSTR  fileanem)=0;


이렇게 만들어진 함수가 컴파일되어 LIB로 만들어집니다. 따라서, 메인프로그램에서는 실행 내용이 아무것도 들어 있지 않은 LIB를 프로젝트에 삽입하고 컴파일하는 것이죠. 그런 후 프로그램이 실행되면 LIB에 설정된 파일명에 따라 DLL을 로드하고 프로그램 메모리 안에 DLL에서 로드시킨 PaintImage 모듈을 삽입시키게 됩니다. 결국 우리는 DLL을 만들고 난 후 3가지의 파일을 이용해서 메인프로그램을 제작하게 되는 것입니다. 이 3가지 파일은 다음과 같습니다.


① 실질적으로 프로그램이 실행될 때 로드되는 DLL 파일(*.DLL)

② 컴파일할 때 설정해 주는 함수명이 들어 있는 헤더 파일(*.H)

③ 링크할 때 메인프로그램에 빈 함수를 설정하는 LIB 파일(*.LIB)



(2)Explicit 링킹

Explicit 링킹 방법이란 Implict 링킹 처럼 3가지의 파일이 필요가 없이 단순하게 DLL를 이용하여 로드할수 있는 방법을 의미합니다. 이방법으로 DLL를 로드할경우 3개의 함수를 이용합니다.

제일 먼저 라이브러리를 로드하는 LoadLibrary함수입니다. 이함수의 형은 다음과 같습니다.

HINSTANCE LoadLibrary(

LPCTSTR lpLibFileName // DLL파일 명


);

예를 들어서 ExRegularDll.dll이라는 함수를 로드하고자 한다면  다음과 같이 할수 있습니다.

        HINSTANCE hDll;

        hDll=LoadLibrary("ExRegularDll.dll");

LodadLibrary함수를 이용하로 로드하면 인스턴스 핸들을 리턴합니다. 이 인스턴스 핸들을 이용하여 필요한 함수의 포인터를 찾습니다. 예를 들어 ExRegularDll.dll이라는 함수에 현재 윈도우의 화면 크기를 가지고 있는 함수가 Factory라고 한다면 다음과 같이 할수 있습니다.

        typedef int (*FactoryFunc)(int num);

        FactoryFunc lpFactoryFunc;

        lpFactoryFunc=(FactoryFunc)GetProcAddress(hDll,"Factory");


GetProcAddress함수는 다음과 같은 형태입니다.

FARPROC GetProcAddress(

HMODULE hModule, // DLL인스턴스

LPCSTR lpProcName //함수 이름

);

GetProcAddress함수의 첫번째 인자는 로드한 DLL의 인스턴스 핸들이며 두번째 인자는 이 DLL안에 있는 함수이름입니다. GetProcAddress(hDll,"Factory"); 라고 하였을경우 “ExRegularDll.dll"함수안에서 Factory 함수를 찾아서 이 메모리 위치를 리턴하며 위의 예에서는 이 위치를 lpFactoryFunc 가 받는 것입니다. 이렇게 리턴된 lpFactoryFunc 함수를 실행하고자 한다면 다음과 같이 하면 됩니다.

lpFactoryFunc(num)


lpFactoryFunc();라고 실행하였을경우 DLL의 Factory 의 함수를 실행한것과 같습니다. 만일 Factory 함수의 안에 인자로 (int num)이 있기 때문에 위와 같이 int num의 인자를 설정한것입니다.

이와 같이 라이브러리에서 함수를 실행한후 DLL의 사용이 종료 되면 FreeLibrary함수를 이용하여 해제 하면됩니다.

        FreeLibrary(hDll);

이렇게 하였을경우 현재 DLL를 사용하는 프로그램이 전형 없다고 할경우 그 DLL은 메모리에서 해제되나 만일 다른 프로그래에서 사용하고 있다면 이 DLL 은 메모리에 그대로 있습니다. 메모리에서 DLL를 해제하지 않고 싶을경우 한개의 프로그램이 로드하면서 그DLL를 로드하고 아무것도 이용하지 않은채 해제를 하지 않으면 됩니다. 이렇게 되면 다른 프로그램에서는 언제나 메모리에 상주되어 있는 DLL 를 항상 이용할수 있습니다.

 

 
시험용 어플리케이션이 MFC 확장 DLL을 사용할 수 있도록 해보자
 
1. LIb 파일을 인클루드 한다
 
DLL에 해당하는 lib를 임포트 할때는 두가지 방법이 있다
 
a. project ->setting -> link -> library modules
 


b. project -> Add to Project -> Files...
 


 
2.  DLL 을 추가했다면 소스코드 파일에서 클래스를 include한 부분을 고쳐서
해당  DLL의 프로젝트 디렉토리를 가리키게 해야된다
 
이렇게 되어있던 부분을
#include "psd.h"
 
이렇게 고친다.
#include "..\PSD_EXT_DLL\psd.h"
 
컴파일해서 사용하면된다.
 
 
---------------------------------------------------------------------------------------------------
 
2부. MFC Static Library( LIB)를 만들어 보자
 
기본적으로 1부에서 만들었던 DLL과 크게 다를 바가 없다
 
 
1. Win32 Static Library 를 선택한다.
 


2. MFC support 및 Pre-Compiled Header를 선택한다.
 
pre-compiled header지원은 사실 필요하지 않지만 모듈을 만들때 컴파일 속도를 증가시킬수 있다
 


3. 클래스를 추가할 때는 이미 만들어져 있는 클래스를 불러와서 컴파일 해도되고
새로이 클래스를 추가해서 정의하여 만들어도 된다.
 
여기선 이미 만들어져 있는것을 불러오도록 하겠다.
 


psd.cpp와 psd.h 를  포함시켰으며 hanningwindow.h도 나의 프로그램에 필요한 헤더이므로

포함시켰다.


4. Library 인클루드 시키는 것은 1부의 DLL부분을 참고

5. 컴파일하면 Lib파일이 만들어진다.



시험용 어플리케이션이 MFC Static Lib를 사용할 수 있도록 해보자


1. LIb 을 추가했다면 소스코드 파일에서 클래스를 include한 부분을 고쳐서

해당  DLL의 프로젝트 디렉토리를 가리키게 해야된다
 
이렇게 되어있던 부분을
#include "psd.h"
 
이렇게 고친다.
#include "..\PSD_STATIC_LIB\psd.h"

2. 컴파일해서 사용한다.



3부. 확장 DLL 과 Static Lib를 사용했을때의 차이점

 

 

1. 실행 파일 사이즈 차이

 --> 동일한 프로젝트를 컴파일 했을때  static lib를 사용하는

실행파일의 사이즈가 DLL을 사용하는 실행파일보다 20Kb정도 더 크다

 

참고로 dll자체 사이즈와 lib는 거의 비슷했다

 

2. F11(Step Into)로 Trace했을때 static lib는 원소스쪽으로 수행이 옮겨가서 볼수 있다

하지만 DLL은 F11 (Step Into)를 했음에도 불구하고 그냥 skip된다.



 

Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2007/07/24 18:20

DLL을 사용하고 DLL을 만들자


-> http://yalli.new21.org/c_study/vc++/vc3-1.html

Posted by ★º쥬니™
:: Study Story..... ::/| C/C++ | l 2007/07/24 18:14
1 2 3 

카테고리

분류 전체보기 (38)
:: Project Story... :: (1)
:: Study Story..... :: (32)
:: IT Story..... :: (1)
:: Drama Story.... :: (0)
:: Movie Story..... :: (0)
:: Music Stroy..... :: (0)
:: Book Story...... :: (0)
:: Useful Story..... :: (4)

달력

«   2012/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31