반응형

visual studio 2008 환경에서 winapi 프로그래밍을 하고 있을 때

cannot convert from 'LPSTR' to 'LPCWSTR'  와 같은 오류가 생겼다.

컴파일러의 문제 인듯 하여 설정 부분을 찾아 보았다.

project properties -> general -> character set 에서
"Use Multi-byte character Set" 을 선택하고 컴파일 해보자..





위와 같이 셋팅하고 컴파일 하고 실행해 보자. 그러면 잘 돌아간다.
오랫만에 C 플밍 할때마다 첨부터 다시 시작하는 기분이다. 매번 헷갈리고 잘 모르겠다.
이렇게 정리라도 해야 다음에 찾을때 고생을 안하겠지..^^  만들고 싶은건 많은데 스킬이 영 부족하다. ㅠㅠ
반응형
 DUMPBIN은 PE 파일의 다양한 부분을 덤프할 수 있는 툴이다.

PE 헤더와 섹션 목록뿐만 아니라 모듈의 임포트, 익스포트 디렉토리 정보등..

아래의 경로에서 찾을수 있다 (필자의 경우 윈도우가 E 드라이브에 깔려있으므로 경로가 C: 가 아님)
E:\Program Files\Visual Studio 설치경로\VC\bin\dumpbin.exe

dumpbin.exe를 실행시키면 다음과 같은 에러메세지가 뜨게 되는데

위와 같은 메세지가 뜨게 된다. 경로설정의 문제인거 같다.
해결방법은 그리 어렵지 않다. 
E:\Program Files\Visual Studio 설치경로\VC\vcvarsall.bat 

vcvarsall.bat  를 실행시켜 환경변수 등록을 해주면 간단히 해결이 된다. ㅎㅎ

일단 몇가지 옵션에 대해 살펴 보자.


/EXPORTS  PE 파일이 외부에 노출하고 있는 함수의 목록을 출력해준다.(DLL)

/IMPORTS 는 반대로 PE 파일이 사용하는 DLL과 DLL의 함수 목록을 출력

/HEADERS 는 PE의 헤더 내용

/DEPENDENTS 디펜던시가 있는 파일이름을 보여준다. 즉 DLL의 이름을 출력

/DISASM   .text 섹션의 코드를 디스어셈블링 해서 보여준다.

아직 다 설명하지 못한 옵션들이 있으니 필요에 따라서 잘 활용하면 될듯하다.
디스어셈블링 옵션은 좋지만 콘솔창에서 보기엔 쫌 ^^;;;; 므튼 잘 활용하면 많은 도움이 될 툴인듯하다.
반응형


VIsual Studio 2008로 Console 프로그램을 만들어 봤다.

주로 JAVA 프로그래밍을 하다가 C계열을 하다보니 툴도 손에 익지 않고 영 감이 부족하다.

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

나를 반기는 error 메시지 이거 뭐지.. 끙끙대며.. 캐삽질 中..中..中..中.....

해결방법은 프로젝트 속성에 설정만 해주면 된다.

(프로젝트 선택하고 오른쪽 클릭 properties 클릭!)

Configuration Properties -> Linker -> System -> SubSystem 에서 

Console (/SUBSYSTEM:CONSOLE) 으로 설정을 바꿔주자.. 띠리리

1>XXXXXXX - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

에러 처리 완료!! 이런 캐삽질 ㅎㅎ;

반응형
error C2664: 'XXXXXXXXW' : cannot convert parameter 1 from 'const char [13]' to 'LPCWSTR'

error C2664: 'XXXXXXXXW' : cannot convert parameter 2 from 'const char [13]' to 'LPCWSTR'

이것도 뭐 글을 길게 쓰고 싶지 않은 에러상황이다. 유니코드 관련 error 인데..

다른방법도 여러개 찾았지만 가장 적합한 방법은 Project properties를 설정하는 것!!

간단하게 방법만 남기고 넘어가자.. 피곤하다 캐삽질 짜잉나!!!!

프로젝트 선택하고 오른쪽 클릭 properties 클릭!)



스샷으로 대충 때우려 했지만 스샷으로 어디지 헷갈릴수도 있으니

Configuration Properties -> Generall -> Project Defaults -> Character Set   에 보면

Use Unicode Character Set  또는 Use Multi-Byte Character Set 라면 과감히 Not Set 선택하자!!

error Clear!!!  아 글 쓰는것도 힘들구나.. 좀더 신중히 글을 작성해야하지만 핵심만 간단히^^;
반응형
※ EVC 4.0
증상: Windows XP sp2 에서 에뮬레이터 실행 안됨

에러메세지
"One or more files from the Emulator for Windows CE installation is missing.
Please reinstall Emulator for Windows CE and try again."

해결:
1. Click Start, click Run, type sysdm.cpl, and then click OK.
2. In the System Properties dialog box, click the Advanced tab.
3. Under Start and Recovery, click Settings.
4. In the Startup and Recovery dialog box, click Edit.
5. Disable PAE mode by removing the /pae option if it exists.
6. Remove the /noexecute option if it exists.
7. Add the /execute option.
8. On the File menu, click Save.
9. To exit Notepad, click Exit on the File menu.
10. To close System Properties, click OK two times.
11. Restart your computer.

boot.ini  파일을 수정하라는 말인데, boot.ini 파일의 원본은 다음과 같음.(파일 전체 내용이 아니라 수정할 부분만 발췌한 것)
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect

이렇게 수정하면 됩니다.
물리주소확장의 여부 관련 설정인듯 하네요.
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute=optin /fastdetect
반응형

SimpleDllTest라는 이름으로 아래와 같이 프로젝트를 만든다.

 
사용자 삽입 이미지
 
사용자 삽입 이미지


사용자 삽입 이미지

해당 솔류션에 SimpleDll이란 이름으로 Dll을 생성하는 프로젝트를 아래와 같이 만듭니다.
사용자 삽입 이미지
사용자 삽입 이미지

다음과 같은 솔루션 탐색기를 확인 할 수 있습니다.
사용자 삽입 이미지



















이제 SimpleDll 프로젝트에서 다음과 같은 클래스를 추가 합니다.

Sample.h

 #pragma once

#ifdef DLLEXPORT
#define SAMPLE __declspec(dllexport)
#else
#define SAMPLE __declspec(dllimport)
#endif


class SAMPLE CSample
{
public:
 int m_i;
 CSample(void);
 ~CSample(void);
 int Test(int input);
};


Sample.cpp

 #define DLLEXPORT
#include "Sample.h"

CSample::CSample(void)
{
}

CSample::~CSample(void)
{
}

int CSample::Test(int input)
{
 return input + 1;
}

Dll이 완성 되었습니다.

SimpleDll을 컴파일하고 빌드하면 SimpleDllTest\Debug에서

SimpleDll.dll, SimpleDll.lib를 확인 할 수 있습니다.

이제 SimpleDll을 테스트하고 SimpleDll에서 변경시 바로 반영하기 위해서 프로젝트의
속성을 바꿔보도록 하겠습니다.

SimpleDll프로젝트 속성에서 빌드후 이벤트의 명령줄을 아래와 같이 입력합니다.

사용자 삽입 이미지

오른쪽 끝에 ...박스를 누르면 여러 줄을 입력할 수 있습니다.
사용자 삽입 이미지


이제 SimpleDllTest의 프로젝트 속성에서 링커/입력의 추가종석성에 SimpleDll.lib를 추가합니다.
사용자 삽입 이미지

마지막으로 프로젝트 탭의 프로젝트 종속성을 아래와 같이 변경합니다.
사용자 삽입 이미지

이제 다음과 같이 SimpleDllTest.cpp를 코딩해서 결과를 확인하면 됩니다.

 #include "stdafx.h"
#include "Sample.h"

int _tmain(int argc, _TCHAR* argv[])
{
 CSample s;

 printf("%d", s.Test(3));
 return 0;
}

정상적으로 잘 되었다면 4가 출력될 것입니다.

반응형

visual studio 를 사용하다 보면 이와 같은 에러를 가끔 볼수도 있을 것이다.
1.fatal error C1010: unexpected end of file while looking for precompiled header directive
2.fatal error C1852: 'Debug/test.pch' is not a valid precompiled header file

이는 소스코드에 제일 상단에 #include "stdafx.h"을 주석처리하거나, 다른 파일을 먼저 #include 하거나 할 때 발생한다. 이는 Visual C++에서 컴파일 할 때 제일상단에 #include "stdafx.h"가 있는지를 확인하는데, 발견되지 않기 때문에 발생하는 에러이다. 해결방법은 모든 cpp파일의 제일상단에 #include "stdafx.h"를 해야 한다.

3.fatal error C1853: "Debug/test.pch" is not a precompiled header file created with this compiler
#include "stdafx.h"를 모든 cpp파일의 제일상단에 포함을 했는데에도 위 에러가 발생하는 경우가 종종 있다. 해결방법은 잠시 후에 하도록 하겠다.

그럼 #include "stdafx.h"이 뭔가?
사실은 #include "stdafx.h"이 중요한 것이 아니고, precompiled header가 무엇인지 아는 것이 중요하다. 물론 자세한 내용은 MSDN-Creating Precompiled Header Files을 참조하기를 바라고, 여기서는 간단하게만 설명을 하고 넘어가겠다.

windows programming에서 제공하는 다양한 resource(button, list, combo)를 사용하여 programming을 하게 되는데, 이들 resource를 포함하여 매번 컴파일을 하게 되면 컴파일 시간이 많이 걸린다. 이를 위해서 미리 이 부분에 대해서 컴파일을 해두고, 사용자가 컴파일 할 때 이러한 미리 컴파일 된 정보를 가져와서 빨리 컴파일을 하기 위한 용도로 precompiled header라는 것을 사용한다. Visual C++에서는 default로 precompiled header를 사용하도록 설정이 되어 있으며, 처음 프로젝트를 생성하여 컴파일 할 때에는 시간이 많이 걸리지만, 이후에 자신이 작성한 소스를 생성, 수정하여 컴파일 할 때에는 빠르게 처리되는 것을 한번쯤은 느껴보았을 것이다.

다시 말하면 precompiled header로 default로 설정이 되어 있는 것이 "stdafx.h"이고, 처음 컴파일을 하면 미리 컴파일 된 정보가 name.pch(파일 확장자 pch는 precompiled header의 약자)로 Debug 또는 Release 폴더에 생성되는 것을 볼 수 있다.

"stdafx.h"는 한번쯤 열어보면, windows program으로 project를 생성한 경우, window와 관련된 다양한 header file을 #include하고 있고, 본인은 여기에 모든 소스에 공통적으로 사용되기를 원하는 #define, #pragma(lib 처리를 위해 종종 사용, 자세한 것은 다음 시간에)등에 활용하기도 한다.

마지막으로 어떤 소스들은 #include "stdafx.h"를 제일상단에 포함을 하지 않았는데에도 아무런 에러가 발생하지 않는 경우가 있다. 이는 precompiled header를 사용하지 않겠다고 지정을 한 경우이다.

메뉴>Project/Settings
사용자 삽입 이미지
<visual studio 2008 캡처화면>
위항목과 같이 설정해 보도록 하자
Precompiled Header File 항목은 .\Debug/프로젝트명.pch 로 하면 될것이다.

precompiled header를 이용하지 않거나, 다른 파일로 precompiled header를 설정할 수도 있다. 이를 이용하여 위의 3번 에러에 대한 수정도 할 수 있다.

#include "stdafx.h"와 precompiled header는 매우 자주 접하게 되는 에러와 연관이 있기 때문에 한번쯤 관심 있게 살펴보는 것이 매우 중요하다고 생각이 된다.
반응형

<Visual C++의 유용한 단축키> : Help->Keyboard Map 참고

줄넘버 보여주기 :

도구 > 옵션 > 텍스트편집기 > 모든언어 > 자동줄번호 선택.

 

<이동>-------------------------------------------------

Ctrl + F2               현재 라인에 북마크 지정/해제

F2                       지정된 다음 북마크로 이동

Ctrl + Shift + F2      지정된 모든 북마크를 해제

Ctrl-K, Ctrl-H         바로가기 설정. ( 작업목록 창에서 확인가능 )

Ctrl-K,K                북마크 설정 / 해제

Ctrl-K,L                북마크 모두 해제

Ctrl-K,N                북마크 다음으로 이동

Ctrl-K,P                북마크 이전으로 이동

Ctrl-K,C                선택한 블럭을 전부 코멘트

Ctrl-K,U                선택한 블럭을 전부 언코멘트(코멘트 해제)

Ctrl + ] 또는 E        {괄호의 짝을 찾아줌

Ctrl + J, K              #ifdef #endif의 짝을 찾아줌

Ctrl+ -, Ctrl+Shift+ -

현재 커서를 기억하는 Ctrl+F3(VS6에서), Ctrl+K,K(VS7에서) 와는 달리 사용자가 별도로 입력을 해주는건 없고, 단지 이전에 커서가 있었던곳으로 위 키를 누를 때마다 이동된다. (shift를 이용하면 역순)

 

Ctrl-F12                커서위치 내용의 선언(.h)으로 이동

F12                      커서위치 내용의 정의(.cpp)로 이동

Shift+Alt+F12         빠른기호찾기

 

Ctrl-Shift-G           #include "파일명" 파일로 바로 직접이동

F8                       After a build failure hit

Shift+F8            거꾸로

Ctrl + D                툴바의 찾기 Editbox로 이동 

 

<편집>-------------------------------------------------

Ctrl-F                   찾기 대화상자

Ctrl-H                  바꾸기 대화상자

Ctrl-Shift-F           파일들에서 찾기 대화상자

Ctrl-Shift-H           파일들에서 바꾸기 대화상자

Ctrl-G                  해당 줄로 가기 (별로 필요없음)

Ctrl-K,Ctrl-F          선택된 영역 자동 인덴트 (VS6 Alt-F8기능)

Ctrl-Shift-Spacebar             함수와매개변수설명이 안나올경우, 강제로 나오게

Ctrl+Alt+T

Ctrl+Spacebar       멤버목록 팝업창이 나타납니다

Ctrl+Shift+R           (키보드 레코딩)

             가끔 연속된 연속기만으로는 부족한경우가 있다.

             이때 Ctrl+Shift+R 을 누르고, 원하는 동작들을 수행후,

다시 Ctrl+Shift+R을 눌러 종료한다. 

이 중간동작을 원하는 위치에서 반복하고 싶다면

             Ctrl+Shift+P 를 누른다.

 

Ctrl+Shift+V           (히스토리 붙이기)

Ctrl-Z                  이전으로 되돌리기

Ctrl-Shift-Z           되돌렸다, 다시 복구하기

Ctrl + I                  문자열 입력, 점진적으로 문자열 찾기

Ctrl + F3               현재 커서에 있는 문자열 찾기

Ctrl+Shift+F3          거꾸로 찾기

F3                       찾은 문자열에 대한 다음 문자열 (Next Search)

Ctrl + H                 문자열 찾아 바꾸기 (Replace)

Ctrl + Left/Right     단어 단위로 이동

Ctrl+[Delete|Backspace] 단어 단위로 삭제

Ctrl + L                 한 라인을 클립보드로 잘라내기

Ctrl + Shift + L       한 라인을 삭제

Alt + Mouse          세로로 블록 설정하기 (마우스로)

Ctrl + Shift + F8      세로로 블록 설정하기 (키보드로),

취소할 때는 Esc키를 눌러야 함

블록설정>>Tab       선택된 블록의 문자열을 일괄적으로 들여쓰기(Tab)

블록설정>>Shift + Tab선택된 블록의 문자열을 일괄적으로 내어쓰기

Alt+F8>> [Tab|Shift + Tab]

                          들여쓰기 자동 조정

Ctrl + T                 현재 커서에 있는 변수/함수에 대한 Type

Tooltip 힌트 창에 나타남

Ctrl + Alt + T          멤버 변수/함수 목록에 대한 팝업 창이 나타남

Ctrl + Shift + T       공백/콤마/파이프/괄호 등을 기준으로

좌우 문자열을 Swap시킴

Ctrl + Shift + 8       문단기호 표시/감추기 :

Tab ^, Space .으로 표시

Ctrl + D                 툴바의 찾기 Editbox로 이동

Ctrl + Up/Down      커서는 고정시키고 화면만 스크롤 시키기

CTRL+SHIFT+T       커서 위치의 단어와 앞 단어가 서로 교체

ALT+SHIFT+T         커서 위치의 한줄과 윗줄이 서로 교환

Ctrl + Shift + U       소문자가 대문자로 둔갑.

Ctrl + U                 대문자를 소문자로 변경

Ctrl + Shift + F8      블럭설정

Ctrl + C, C                          That copies the current line.

Ctrl+K, Ctrl+C                      Automatically commented.

Ctrl+K, Ctrl+U                      Uncommented.

 

<디버그/빌드>-------------------------------------------

F5                       디버그 시작

F9                       디버그 브렉포인트 지정/해제

Ctrl-F9                 현위치 설정된 브렉포인트 해제

Ctrl-Shift-F9         현재 소스파일에 지정된 모든 Breakpoint 해제

Shift-F5               디버그 빠져나오기

Ctrl-F10                커서가 있는곳까지 실행

Shift-F11                           현 함수를 빠져나감.

 

Shift+Ctrl+B           전체 빌드(프로젝트가 여러개있을경우 모두 빌드)

Alt+B, C                해당 프로젝트만 정리.

Alt+B, U                해당 프로젝트만 빌드.

Ctrl-F7                 현 파일만 컴파일    : 현 프로젝트만 빌드

Ctrl-F5                 프로그램 시작

Shift + F9                           디버그 모드에서 추가하고픈 변수나 등등

앞에 커서를 위치 시킨후 Shift+F9를 누르면

Watch Window에 자동으로 추가.

 

<창관련>-----------------------------------------------

Shift+Alt+Enter       전체 창 (토글 됨)

F4                       속성창 보여준다.

Ctrl+Alt+X                           리소스에디터 툴박스창

Ctrl+Alt+K              작업목록 창.

Ctrl + Tab                           Edit하고 있는 Child Window 간의 이동

Ctrl + F4               현재 Edit하고 있는 Child Window를 닫기

Ctrl-M, Ctrl-L         소스파일의 함수헤더만 보이기 (구현부는 감추고)

Ctrl-M, Ctrl-M        현재 커서가 위치한 함수를 접는다/편다. (토글 키)

Ctrl+R, Ctrl+R         Word Wrap

Ctrl+M+L               편집.전체개요표시숨기기

 

Ctrl+M+H           편집.선택영역숨기기

Ctrl+M+U           편집.현재숨기기중지

 

Alt + F7                Project Setting

반응형
Ø

라이브러리란?
특정한 코드(함수 혹은 클래스)를 포함하고 있는 컴파일된 파일이다.

라이브러리를 만드는 이유?
 자주 사용되는 특정한 기능을 main 함수에서 분리시켜 놓음으로써, 프로그램을 유지, 디버깅을 쉽게하고 컴파일 시간을 좀더 빠르게 할수 있기 때문이다.

라이브러리에도 그 쓰임새에 따라서 여러가지 종류가 있다(크게 3가지). 가장 흔하게 쓰일수 있는 "정적라이브러리"와 "공유라이브러리", "동적라이브러리" 가 있다.

이들 라이브러리가 서로 구분되어지는 특징은 적재 시간이 될것이다.

정적라이브러리

정적라이브러리는 object file(.o로 끝나는) 의 단순한 모음이다. 정적라이브러린느 보통 .a 의 확장자를 가진다. 간단히 사용할수 있다. 컴파일시 적재되므로 유연성이 떨어진다. 최근에는 정적라이브러리는 지양되고 있는 추세이다. 컴파일시 적재되므로 아무래도 바이너리크기가 약간 커지는 문제가 있을것이다.

공유라이브러리

공유라이브러리는 프로그램이 시작될때 적재된다. 만약 하나의 프로그램이 실행되어서 공유라이브러리를 사용했다면, 그뒤에 공유라이브러리를 사용하는 모든 프로그램은 자동적으로 만들어져 있는 공유라이브러리를 사용하게 된다. 그럼으로써 우리는 좀더 유연한 프로그램을 만들수 잇게 된다.

정적라이브러리와 달리 라이브러리가 컴파일시 적재되지 않으므로 프로그램의 사이즈 자체는 작아지지만 이론상으로 봤을때, 라이브러리를 적재하는 시간이 필요할것이므로 정적라이브러리를 사용한 프로그램보다는 1-5% 정도 느려질수 있다. 하지만 보통은 이러한 느림을 느낄수는 없을것이다.

동적라이브러리

공유라이브러리가 프로그램이 시작될때 적재되는 반면 이것은 프로그램시작중 특정한때에 적재되는 라이브러리이다. 플러그인 모듈등을 구현할때 적합하다. 설정파일등에 읽어들인 라이브러리를 등록시키고 원하는 라이브러리를 실행시키게 하는등의 매우 유연하게 작동하는 프로그램을 만들고자 할때 유용하다.

– MS VC++  라이브러리 만들기


사용자 삽입 이미지
1.project name란에 라이브러리 이름 작성
사용자 삽입 이미지
사용자 삽입 이미지












2.test.c 파일을 생성한다.(함수 정의(구현)부분에 대한 내용)

3.test.h 파일을 생성한다.(함수의 선언부분이 있는곳)

사용자 삽입 이미지

 
//나만의 덧셈 라이브러리 만들기
#include <stdio.h>
#include "test.h"
//덧셈 함수 구현부분
int Add(int a,int b)
{
   return a+b;
}




3.test.h 에 함수에 대한 선언
   ex> int Add(int a, int b);
4.컴파일 하면 Debug 디렉토리 안에 프로젝트명.lib 이 생성

그 다음은 헤더파일을 해당 프로젝트에 넣고 라이브러리 링크
시키면 사용됨.

C로 만든 라이브러리를 C++ 프로젝트에 사용할때는 주의를 하자.
컴파일 과정에서 만들어진 라이브러리의 함수명이 차이가 있다.
C 로 만든 라이브러리는 C프로젝트에서..
C++로 만든 라이브러리는 C++프로젝트에서..
다른 방법으로는 위에 글에 설명..
반응형

C++에서 Memory(auto든 static이든 dynamic이든)를 사용할 때 초기화 하지 않았을 때의 값은 Undefined다. VC++에서는 Debug모드일 때 메모리 관련 오류를 디버깅하기 위해 자동으로 메모리를 초기화 해 주는데, 그 값들은 아래와 같다.


  • 0xcccccccc (3435973836) - 초기화 되지 않은 지역변수.
  • 0xcdcdcdcd (3452816845) - 초기화되지 않은 힙에 할당된 메모리.
  • 0xdddddddd (3722304989) - 힙에서 free된 메모리.
  • 0xfeeefeee (4277075694) - 힙에서 free된 메모리.
  • 0xfdfdfdfd (4261281277) - 힙에 할당된 메모리의 초과범위(할당된 메모리의 양쪽 끝)


참고하자!

From: http://blog.empas.com/lisyoen/16384741


================================================================================================================

디버그모드시 쓰레기 값의 의미

*릴리즈는 이값을 채워넣지않음.


  • 0xCCCCCCCC
    초기화 하지 않은 지역변수
  • 0xCDCDCDCD
    힙에 할당된 메모리다.그러나 초기화 되지 않았다.
  • 0xDDDDDDDD or 0xFEEEFEEE
    힙에서 Free된 메모리이다. 그것을 사용할 때
  • 0xFDFDFDFD

할당한 것을 벗어난 heap의 공간을 사용할 시

알고 보니 단순 쓰레기값이 아니더라구요,
디버깅할때 잘못된 메모리 주소 사용으로인해 프로그램이 중단되었을경우
값을 보고 원인을 찾을수 있습니다.


원문출처 : http://www.gpgstudy.com/forum/viewtopic.php?topic=10342
참고출처 : http://www.codeguru.com/Cpp/W-P/win32/tutorials/article.php/c9535/


+ Recent posts