수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1621009
  • Today | 389
  • Yesterday | 482

3 Articles, Search for '매크로'

  1. 2007/03/19 포인터 변수를 검증하기위한 매크로
  2. 2007/01/02 TRACE 매크로를 구현하는 방법
  3. 2006/12/27 내장 매크로를 사용한 버전 자동화 기법
Programming/Win32 API2007/03/19 10:53

포인터 변수를 검증하기위한 매크로

원본 : http://www.debuglab.com/knowledge/pointermacro.html

1.요약

포인터가 올바른 메모리 블럭을 가리키고 있는지 조사할 수 있는 API 들이 몇 가지 있습니다. ( IsBadWritePtr() 을 MSDN 에서 찾으시면 비슷한 친구들까지 모두 찾을실 수 있을겁니다 )

MFC 에는 이 API를 사용해서 간단한 매크로를 만들어 두었습니다.


2.본문

바로 다음 두 친구가 그 매크로 입니다.

ASSERT_POINTER( pointer, pointerType); 

ASSERT_NULL_OR_POINTER( pointer, pointerType); 

개발자 입장에서는 이 매크로의 정의를 소스 코드로 보시는 게 더 이해하기 쉬울거라 생각됩니다.

#define ASSERT_POINTER(p, type) \ 

    ASSERT(((p) != NULL) && AfxIsValidAddress((p), sizeof(type), FALSE)) 



#define ASSERT_NULL_OR_POINTER(p, type) \ 

    ASSERT(((p) == NULL) || AfxIsValidAddress((p), sizeof(type), FALSE)) 

간단히 설명드리자면 ASSERT_POINTER 는 해당 포인터가 반드시 NULL이 아니고 올바르며 ASSERT_NULL_OR_POINTER 는 해당 포인터가 NULL이거나 올바른 포인터 라는 의미가 되겠습니다.

물론 문서화되어 있지 않은 매크로이지만, 내용이 아주 간단하므로 직접 만드는 것도 무리는 없기때문에 사용할만 하다고 하는군요.


3.예제


4.참고

Debugging Windows Program, Strategies, Tools, and Techniques for Visaul C++ Programmers p.95

AfxIsValidAddress()도 있네요.



- 2001.08.13 Smile Seo -
"Win32 API" 카테고리의 다른 글
  • Visual C++ 이 사용하는 확장자 살펴보기 (0)2007/03/21
  • 캐럿의 위치 알기 (0)2007/03/19
  • 포인터 변수를 검증하기위한 매크로 (0)2007/03/19
  • 프로파일링(Profiling) 기능 활용하기 (0)2007/03/19
  • Bitmap 이미지 resizing 하기 (0)2007/03/19
2007/03/19 10:53 2007/03/19 10:53
Posted by webdizen
Tags 매크로, 포인터 변수
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2700

Leave your greetings.

[로그인][오픈아이디란?]

Programming/Win32 API2007/01/02 17:23

TRACE 매크로를 구현하는 방법

고수닷넷 - 데미소다오렌지님

MFC를 사용하지 않을 경우에 겪는 불편한 점 중 하나로 TRACE가 없다는 것을 들 수 있습니다. 그래서 디버깅 출력을 하려면 모두 OutputDebugString으로 불편하게 확인을 해야 합니다. 이 문서는 그러한 불편함을 해소해 줄 XTRACE의 구현에 대해서 담고 있습니다. 기본적인 아이디어는 MFC의 TRACE에서 가져왔습니다. TRACE보다 발전된 점은 없습니다. 단지 TRACE와 같은 것을 MFC가 없는 곳에서 쓸 수 있다는 점 입니다.

사용법은 간단합니다.

  • 1.아래 소스를 긁어서 별도의 헤더 파일로 저장 하십시오.
  • 2. xtrace.h등으로 저장하신 후에기본 인클루드에 포함되어 있는 패스에 위 파일을 복사시켜 줍니다.
  • 3. XTRACE를 사용하고 싶으신 소스에서 헤더 파일을 인클루드 하시고 XTRACE 매크로를 사용하시면 됩니다.

XTRACE는 릴리즈 버전에는 자동으로 함수 호출 스텁이 제거되도록 설계되었기 때문에, 별도로 릴리즈 버전이라고 제거하실 필요는 없습니다. 또한 릴리즈 버전에서도 트레이스 구문을 확인하고 싶으신 경우에는 FORCE_XTRACE 매크로를 선언해 주시면 됩니다. 아래는 헤더 파일의 전체 소스 입니다. 트레이스 구문은 dbgview등의 프로그램으로 확인이 가능합니다. dbgview 프로그램은 sysinternals.com에서 다운로드 가능합니다.

#ifndef XTRACE_H 
#define XTRACE_H 

#include  
#if defined(_DEBUG) || defined(FORCE_XTRACE) 

#define XTRACE_BUF_SIZE 4096 
#define XTRACE          _DbgPrintf 

inline void __cdecl _DbgPrintf(const char *str, ...) 
{ 
    char    buff[XTRACE_BUF_SIZE]; 
    char    rbuff[XTRACE_BUF_SIZE]; 
    DWORD   dwError; 
    va_list    ap; 

    dwError = GetLastError(); 

    va_start(ap, str); 
    if(_vsnprintf(buff, sizeof buff, str, ap) < 0) 
        buff[sizeof buff - 1] = 0; 
    va_end(ap); 

    if(_snprintf(rbuff, sizeof rbuff, "%s\n", buff) < 0) 
        rbuff[sizeof rbuff - 1] = 0; 

    OutputDebugString(rbuff); 
    SetLastError(dwError);    
} 


#else 

#define XTRACE 1 ? (void) 0 : _DbgPrintf 
inline void _DbgPrintf(const char *str, ...) {} 

#endif 

#endif 

소스에 몇가지 테크닉을 소개하면 일단 _DbgPrintf가 가변 인자 함수로 구성되었다는 점을 들 수 있습니다. 따라서 printf와 같이 포맷 문자열을 사용해서 변수들을 출력할 수 있죠. 그리고 특징적인 점은 디버그 버전에서 XTRACE를 제거하는 구문입니다. 통상적으로 가변인자 매크로를 지원하지 않는 컴파일러의 경우 괄호를 두번 싸게해서 그 처리를 할 수 있지만, 여기서는 MFC형식을 따라서 인라인 함수로 _DbgPrintf를 선언하고 삼항 연산자를 사용해서 _DbgPrintf가 호출되지 않도록 했습니다. 쇼트서킷을 사용해서 XTRACE 0 && _DbgPrintf등을 사용할 수도 있습니다.

"Win32 API" 카테고리의 다른 글
  • 프로세스 우선순위 조절하기 (2)2007/01/03
  • 클립보드 모니터링 하기 (0)2007/01/03
  • TRACE 매크로를 구현하는 방법 (0)2007/01/02
  • 윈도우 종료 시키기 (0)2007/01/02
  • 작업관리자에 표시되는 응용프로그램 열거하기 (0)2007/01/02
2007/01/02 17:23 2007/01/02 17:23
Posted by webdizen
Tags TRACE, 매크로
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2545

Leave your greetings.

[로그인][오픈아이디란?]

Programming/UNIX/Linux C2006/12/27 15:35

내장 매크로를 사용한 버전 자동화 기법

고수닷넷 - 데미소다오렌지님

1. Introduction

소프트웨어를 개발하는 사람들이라면 누구나 느끼는 것이 자신이 가장 최근에 빌드한 파일이 가장 최신의 버전 정보를 담기가 힘들다는 사실이다. 물론 이러한 것들을 고치기 위해서 자동 버전 증가 매크로등을 사용하는 일부 똑독한 개발자들도 있다. 하지만 그것을 사용해 본 사람이라면 알겠지만, 버전 증가 매크로의 기본적인 테크닉의 하나인 리소스 파일 편집이 일어남으로써 빌드가 매번 발생한다는 불편함이 있다. 즉, 조금 고치고 빌드하는데도 버전과 관련된 부분은 죄다 새로 컴파일 되니 짜증이 나는 것이다.

과연 그렇다면 개발자들을 version hell로 부터 구해줄 좋은 방법은 정녕 없는 것일까? ㅡ.ㅡ# 물론 당연지사 없다고 생각하는 필자였으나, 최근 VNC 소스를 보면서 굉장히 흥미로운 테크닉을 하나 발견할 수 있었다. 바로 내장 매크로를 사용하는 방법이다.

2. __FILE__, __DATE__, __TIME__

C언어에는 위와 같은 내장 매크로가 존재한다. 물론 수없이 많은 내장 매크로가 있으나, 위에 제시된 것들은 그나마 자주 사용되는 것이다.

__FILE__에는 컴파일 되고 있는 파일의 전체 경로가 저장되어 있다.

__DATE__에는 컴파일 되는 날짜가 저장되어 있다.

__TIME__에는 컴파일 되는 시간이 저장되어 있다.

어느 교수님 말처럼 전문가들은 저런 세세한 것들을 보고 있지 않는다. 단지 아래 코드를 실행해보면 모든게 자연스럽게 이해가 가는 것이다. ㅋㅋㅋ

int main()
{
	printf("%s, %s, %s", __FILE__, __DATE__, __TIME__);
	return 0;
}

3. Version...

윈도우 95가 소프트웨어 업계에 가지고 온 신선한 충격은 꽤나 많았지만 모든걸 제치고 가장 큰 변화였다고 한다면 버전에 개발 년도를 붙인 것이었다. 그 전에는 1.0, 2.1등의 버전이 일상적이었다. 년도를 버전에 붙이게 되면서 생기는 가장 좋은 점은 해당 소프트웨어가 출시가 된지가 언제였는지 바로 알 수 있다는 점이다. 윈도우 3.1이 출시된지 몇년이 지났는지는 알기 힘들지만 95는 바로 10년이란 세월이 흘렀음을 알 수 있게 해준다. 그 이후 나오는 거의 대부분의 소프트웨어들은 대부분 버전에 년도를 붙이기 시작했다.

물론 이러한 흐름을 끝까지 배척하는 무리들도 있다. 물론 어느쪽이 좋은지는 판단하기 힘들다. 리눅스 커널의 경우 메이저, 마이너, 패치 단위로 버전을 관리하며, 버전 번호로 부터 이 커널이 안정화 커널인지 어느정도 패치가 된 커널인지를 바로 알 수 있다는 장점이 있다. 카누스 교수가 개발하고 있는 텍의 경우는 파이를 따라 버전을 붙이기도 한다. 3.14, 3.141, 3.1415, 3.14159따위의 식이다.

우리가 오늘 사용할 방식은 바로 __DATE__와 __TIME__을 사용한 버전 관리 방법이다. 이 경우 컴파일된 날짜와 시간을 바로 버전으로 삼는다는 것이다. 프로그래머가 버전을 고치기 위해서 개입해야 할 일이 거의 없기 때문에 무척이나 편리한 방법이다. 이제 우리에게 편리함을 안겨줄 코드를 보기로 하자.

void WINAPI
GetBuildDateTime(LPTSTR bdate, UINT datesize, LPTSTR btime, UINT timesize)
{
	const char *BUILD_DATE = __DATE__;
	const char *BUILD_TIME = __TIME__;

	StringCbCopy(bdate, datesize, BUILD_DATE);
	StringCbCopy(btime, timesize, BUILD_TIME);
}

우리의 버전을 구해주는 함수는 위와 같다. 그 단순함에 너무나도 놀랐는가? ㅋㅋㅋ~ 난 첨에 사실 조금 당황했다. 이렇게 간단하고 심플한 버전 관리 방법이 있으리라곤... 헐 - -

4. Dll hell

3장의 내용만으로도 모든 아이디어가 전달되었다고 생각되지만 dll의 버전 관리 지옥에서 탈출하기 위한 중요한 함수 하나를 더 소개할까 한다. 일단 아래 코드를 보도록 하자.

typedef struct _BUILD_INFO
{
	int		year;
	int		month;
	int		day;
	int		hour;
	int		min;
	int		sec;
} BUILD_INFO, *PBUILD_INFO;


BOOL WINAPI
GetBuildInfo(PBUILD_INFO pbi, LPCTSTR dllpath)
{

	BOOL				ret = FALSE;
	HINSTANCE			hDll;
	FGetBuildDateTime	func;

	TCHAR				bdate[80];
	TCHAR				btime[80];

	hDll = LoadLibrary(dllpath);
	if(hDll != NULL)
	{
		func = (FGetBuildDateTime) GetProcAddress(hDll, "GetBuildDateTime");
		if(func != NULL)
		{
			func(bdate, sizeof(bdate), btime, sizeof(btime));
			_ParseBuildInfo(pbi, bdate, btime);

			ret = TRUE;
		}

		FreeLibrary(hDll);
	}

    return ret;
}

위 코드가 하는 일은 dll을 로드해서 거기서 3장에서 제시되었던 GetBuildDateTime으로 해당 dll의 빌드 시간 정보를 넘겨받는다. 그리고는 그놈을 파싱해서 좀 더 의미있는 정보인 BUILD_INFO 구조체로 넘겨주는 함수다. 자 이제, 작성하는 모든 dll에서는 단순히 3장에서 제시된 빌드 정보를 넘겨주는 함수만 익스포트 하고 나면, 자동으로 모든 dll의 버전을 구할 수 있는 것이다. 물론 기존의 dll 버전을 수정하기 위해서 프로그래머가 해야할 일은 없다.

위 코드를 수행하는데 필요한 _ParseBuildInfo 함수는 아래와 같이 작성할 수 있다.

static void
_ParseBuildInfo(PBUILD_INFO pbi, LPTSTR bdate, LPTSTR btime)
{
	const char *mn[13] = {	NULL,
							"Jan",
							"Feb",
							"Mar",
							"Apr",
							"May",
							"Jun",
							"Jul",
							"Aug",
							"Sep",
							"Oct",
							"Nov",
							"Dec"	};

	char *ptr;
	int i;

	ptr = strtok(bdate, " ");
	for(i=1; i<13 && ptr; ++i)
	{
		if(stricmp(mn[i], ptr) == 0)
		{
			pbi->month = i;
			break;
		}
	}

	ptr = strtok(NULL, " ");
	if(ptr)
	{
		pbi->day = atoi(ptr);
	}

	ptr = strtok(NULL, " ");
	if(ptr)
	{
		pbi->year = atoi(ptr);
	}

	ptr = strtok(btime, ":");
	if(ptr)
		pbi->hour = atoi(ptr);

	ptr = strtok(NULL, ":");
	if(ptr)
		pbi->min = atoi(ptr);


	ptr = strtok(NULL, ":");
	if(ptr)
		pbi->sec = atoi(ptr);
}

5. Conclusion

내가 늘 회사에서 하는 실수는 dll을 컴파일하고 나서 버전을 변경하지 않는 실수를 하는 것이었다. 그것은 업데이트 소프트웨어가 dll을 제대로 패치하지 못하게 만들었고, 결국 엉성한 버전들로 구성된 프로그램은 잘못된 연산을 하기가 쉽상이었다.

여기에 적용된 기법에 프로그래머가 버전 관리를 위해서 개입해야 하는 부분은 전혀 없다. 자신이 해당 함수를 익스포트한 이후에는 컴파일할때마다 버전은 자동으로 변경되게 된다. 따라서 버전을 고치지 않는 실수를 미연에 방지할 수 있는 것이다.

"UNIX/Linux C" 카테고리의 다른 글
  • [PPT] C가 보이는 그림책 (0)2007/03/21
  • 두 변수의 값을 바꾸는 환상의 매크로 (0)2007/02/22
  • 내장 매크로를 사용한 버전 자동화 기법 (0)2006/12/27
  • 리눅스 커널 코딩 스타일 (0)2006/12/27
  • 표준 입력 버퍼의 진상. (0)2006/12/27
2006/12/27 15:35 2006/12/27 15:35
Posted by webdizen
Tags 매크로
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2530

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Functor
  • 구글
  • 메모리 관리
  • sprintf
  • WHAT-WHY-HOW
  • 유럽
  • 대회
  • 썸씽 스페셜
  • SQL Server 2000
  • 다이얼로그
  • 원격 네트워크
  • UI
  • 데이터 정렬
  • VSTO
  • 추상화
  • WinAPI
  • Polling
  • 변수
  • Labs
  • NULL

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
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          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.