MICROSOFT C Run-Time Win32 1

2023. 3. 11. 19:16프로그래밍

728x90

모듈 A 구현 사양 MICROSOFT C Run-Time Win32 1

아래의 튜토리얼과는 달리 이클립스 환경 + 윈도우 SDK 를 사용하여 컴파일하고 빌드 하였다. 다음을 참고로 한다.

이 모듈에서 이야기 하는 것들

 

  1. 배경 지식: TheMicrosoft C Run-time 라이브러리들
  2. 표준 C++ 라이브러리
  3. 런타임 함수들
  4. 디렉토리 조작
  5. 디렉토리 조작 함수들
  6. 프로그램 예제들

 

알아야 할 기술 들

 

1. 표준 C 및 구현 사양에 대해 알 수 있습니다.

2. Windows 파일 시스템, 파일 및 디렉토리의 기초를 알 수 있습니다.

3. 함수를 사용하여 작업을 수행하기 위해 필요한 정보를 찾아 수집 할 수 있습니다.

4. 자신의 프로그램에서 라이브러리에서 사용할 수있는 함수들을 이해하고 사용할 수 있습니다.

 

§ 이 모듈에서는 Microsoft C로서의 C의 완전한 구현에 대해 소개 할 예정입니다. 그렇지만 GUI 타입의 프로그램으로 구현 하지는 않을 것입니다

 

§ 이렇게 해서 Windows 응용 프로그램을 컴파일하는 컴파일러의 특정 사용법을 소개하며 개발 된 프로그램은 Windows 플랫폼에서 실행하기에 특화된 기능을 제공합니다. 이 모듈의 토론 및 프로그램 예제는 나중에 표준 및 비표준 (Microsoft 확장) 라이브러리와 함께 사용될 것입니다.

 

§ 함수의 사용법을 배울 것이기 때문에 이미 함수들에 대해서 이미 친근해 졌다고 확신합니다. 매개 변수, 반환 값 등과 같은 함수에 관한 모든 것을 외워야 됩니다. 이 모듈의 최종 목적은 실제로 프로그램 개발에 필요한 다양한 문서에서 필요한 모든 정보를 찾아서 수집하는 방법을 보여주기 위해 실제 예제를 수행 합니다.

 

§ 일반적으로 라이브러리에는 헤더 파일을 통해 정의되고 액세스되는 다음과 같은 것들이 있음을 알아야만 합니다.

1. 매크로 정의.

2. 함수 프로토 타입.

3. 구조체 정의 (구조체).

4. 열거 형 정의 (열거 형).

5. 데이터 유형 정의.

6. typedef 사용법.

 

이터 타입과 구조체 정의에 대해서는 struct, typedef, enum의 사용 하는 법을 배울 것이고, 이 개념들은 Win32 프로그래밍 (다른 모듈에서 논의 될 것입니다)에 대해서도 마찬가지로 사용됩니다.

 

이를 더 잘 이해하기 위해서는 그러한 것들에 능숙해 질 필요가 있습니다. 문제가 발생하면 tenouk.com을 참고하여 기본 사항으로 다시 돌아봐야 합니다. 다른 사전 요구 사항 항목에는 배열 및 포인터가 포함됩니다.

 

 

배경지식: 마이크로소프트 C 런타임 라이브러리들

다음 표에는 C 런타임 (CRT) 라이브러리와 관련 컴파일러 옵션 및 전 처리기 지시문을 구성하는 다양한 .lib 파일이 나열되어 있습니다. 라이브러리에는 C 런타임 라이브러리 함수가 들어 있습니다.

 

이러한 라이브러리의 경우 프로그램에서 사용되는 헤더 파일의 확장명은 .h 여야합니다

 


Pure C run-time library
Characteristics
Compiler Option
Preprocessor directives
LIBC.LIB
Single-threaded, static link.
/ML
-
LIBCMT.LIB
Multithreaded, static link.
/MT
_MT
MSVCRT.LIB
Multithreaded, dynamic link (import library for MSVCR70.DLL).
Be aware that if you use the Standard C++ Library, your program will need MSVCP70.DLL to run.
/MD
_MT, _DLL
LIBCD.LIB
Single-threaded, static link (debug).
/MLd
_DEBUG
LIBCMTD.LIB
Multithreaded, static link (debug).
/MTd
_DEBUG, _MT
MSVCRTD.LIB
Multithreaded, dynamic link (import library for MSVCR70D.DLL) (debug)
/MDd
_DEBUG, _MT, _DLL


Table 1: C run-time libraries

 

§ 컴파일러 옵션, 전처리 지시문 및 기타 구성 설정은

Project 메뉴 →your_project_name Properties ...

하위 메뉴에서 액세스 할 수 있습니다.

 

§ 솔루션 탐색기 창에서 프로젝트 디렉토리를 선택하여 액세스 할 수도 있습니다. → 오른쪽 클릭 → 아래 표시된 것처럼 Properties 메뉴를 선택하십시오.

 

  • 다음 그림은 프로젝트 속성 페이지입니다.
  • 런타임 라이브러리를 지정하는 컴파일러 옵션 없이 프로그램을 명령 줄에서 연결하면 링커는 기본적으로 LIBC.LIB를 사용합니다.

§ 응용 프로그램의 디버그 버전을 작성하려면 _DEBUG 플래그를 정의해야 하며, 응용 프로그램을 이러한 라이브러리 중 하나의 디버그 버전과 연결해야 합니다.

§ 그러나 이 모듈에서는 다음과 같이 명령 행 대신에 Visual C ++ .Net IDE의 메뉴를 사용하여 컴파일하고 링크합니다 : o).

 

표준 C++ 라이브러리

 

§ 런타임 라이브러리에는 iostream 라이브러리와 표준 C ++ 라이브러리가 포함 된 .lib 파일도 포함됩니다. 이러한 .lib 파일 중 하나에 명시적으로 연결할 필요가 없습니다. 각 라이브러리의 헤더 파일은 그에 맞는 .lib 파일에 링크됩니다.

§

§ 이 오래 된 iostream 라이브러리를 사용하는 프로그램은 헤더 파일에 .h 확장자가 필요합니다.

  •  

§ Visual C ++4.2 이전에는 C 런타임 라이브러리에 iostream 라이브러리 함수가 포함되었습니다. Visual C ++ 4.2 이상에서는 LIBC.LIB, LIBCD.LIB, LIBCMT.LIB,LIBCMTD.LIB, MSVCRT.LIB 및 MSVCRTD.LIB에서는 이전 iostream 라이브러리 함수가 제거되었습니다.

§ 이 변경 사항은 Visual C ++에 표준 C ++ 라이브러리가 추가되었으며 새로운 iostream 라이브러리 집합이 포함되어 있기 때문에 변경되었습니다.

 

§ 따라서 두 세트의 iostream 함수가 이제 Visual C ++에 포함됩니다. 이전 iostream 함수는 이제 다음 표에 표시된 대로 자체 라이브러리에 존재합니다.

Old iostream library
Characteristics
Compiler Option
Preprocessor directives
LIBCI.LIB
Single-threaded, static link.
/ML
-
LIBCIMT.LIB
Multithreaded, static link.
/MT
_MT
MSVCIRT.LIB
Multithreaded, dynamic link (import library for MSVCI70.DLL).
/MD
_MT, _DLL
LIBCID.LIB
Single threaded, static link.
/MLd
_DEBUG
LIBCIMTD.LIB
Multithreaded, static link.
/MTd
_DEBUG, _MT
MSVCIRTD.LIB
Multithreaded, dynamic link (import library for MSVCI70D.DLL).
/MDd
_DEBUG, _MT, _DLL


Table 2: Old iostream libraries

§ 표준 C ++ 라이브러리에있는 새로운 iostream 함수 및 기타 많은 새로운 함수가 다음 표에 나와 있습니다.

§ 이 새로운 iostream 라이브러리를 사용하는 프로그램에는 <string>과 같은 .h 확장자가없는 헤더 파일이 필요합니다.

 
Standard C++ Library
Characteristics
Compiler Option
Preprocessor directives
LIBCP.LIB
Single-threaded, static link
/ML
-
LIBCPMT.LIB
Multithreaded, static link
/MT
_MT
MSVCPRT.LIB
Multithreaded, dynamic link (import library for MSVCP70.dll)
/MD
_MT, _DLL
LIBCPD.LIB
Single-threaded, static link
/MLd
_DEBUG
LIBCPMTD.LIB
Multithreaded, static link
/MTd
_DEBUG, _MT
MSVCPRTD.LIB
Multithreaded, dynamic link (import library for MSVCP70.DLL)
/MDd
_DEBUG, _MT, _DLL


Table 3: Standard C++ libraries

 

§ 표준 C ++ 라이브러리와 기존 iostream 라이브러리는 호환되지 않습니다. 즉, 혼용되어 사용 할 수 없으며 둘 중 하나만 프로젝트에 연결할 수 있습니다.

§ 오래된 iostream 라이브러리 표준이 아직 성숙되지 않았을 때 만들어진 것입니다.

 

§ 프로젝트의 릴리스 버전을 빌드 할 때 기본 C 런타임 라이브러리 (LIBC.LIB,LIBCMT.LIB 및 MSVCRT.LIB) 중 하나가 선택한 컴파일러 옵션에 따라 기본적으로 연결됩니다 (단일 스레드 , 다중 스레드 또는 DLL).

 

§ 코드에서 사용하는 헤더에 따라 표준 C ++ 라이브러리의 라이브러리 또는 기존 iostream 라이브러리의 라이브러리도 링크 될 수 있습니다. 예를 들면 다음과 같습니다

 

1. 표준 C ++ 라이브러리 헤더를 코드에 포함하면 표준 C ++ 라이브러리는 컴파일시 Visual C ++에서 자동으로 링크됩니다.

예 :

#include <ios>
 

2. 이전 iostream 라이브러리 헤더를 포함하면 컴파일 타임에 이전 iostream 라이브러리가 Visual C ++에 의해 자동으로 링크됩니다.

예 :

#include <ios.h>
 

 

§ 헤더는 표준 C ++ 라이브러리, 기존 iostream 라이브러리 또는 둘 중 어느 것이 링크되는지 여부를 결정합니다. 컴파일러 옵션은 링크 될 라이브러리 중 어느 것이 기본 (단일 스레드, 다중 스레드 또는 DLL)인지 결정합니다.

 

  • 특정 라이브러리 컴파일러 옵션이 정의되면 해당 라이브러리가 기본 라이브러리로 간주되고 해당 전처리 기 지시문이 자동으로 정의됩니다.

또한 전체 동작에 대한 Module 23을 읽어 보십시오.

 

§ 결론적으로, 전형적인 C 및 C ++ 프로그램의 경우 적절한 헤더 파일을 제공함으로써 컴파일러에서 어떤 라이브러리가 링크 될 수 있는지를 결정하게 합니다.

 

런 타임 함수들

§ 다음 섹션에서는 C 런타임 라이브러리에서 사용할 수 있는 몇 가지 기능에 대해 자세히 설명합니다.

§ 이러한 함수는 표준 C / C ++에서 사용할 수 없는 Windows의 많은 작업을 자동화하는 데 사용할 수 있는 루틴을 만드는 데 사용됩니다.

§ 카테고리로 시작한 할 것이고, 해당 카테고리에서 사용할 수 있는 함수가 그리고 마지막으로 그 중에 일부의 함수들을 사용하는 프로그램 예제를 만들 것입니다.

§ 여기에서 설명하는 기능은 주로 디렉토리와 파일을 처리합니다.

§ 자세한 내용은 Microsoft Visual C ++ 설명서 (온라인 MSDN :Microsoft Visual C ++)를 참조하십시오. 나머지로, 다음은 함수를 사용하고자 할 때 완전히 이해 해야 하는 것들이며,

여기에서는 _chsize ()가 예제로 사용됩니다.

 

1. 함수를 사용한다는 것은 무엇일까요? 이것은 "당신은 무엇을 하고 무엇을 만들 것입니까?"와 동일한 말일 겁니다. 몇 가지 작업을 수행하려면 하나이상의 함수를 조합해서 사용해야 할 것입니다

예 :

_chsize() 함수는 파일 크기를 바꿀 때 사용됩니다.

 

2. 함수 프로토 타입이 무엇인지 알고 있어야, 함수의 적절한 구문을 작성 (호출) 할 수 있습니다.

예 :

int _chsize(int handle, long size);
 
3. 함수 프로토 타입에서 몇 개의 매개 변수가 필요한 지, 순서 및 형식이 무엇인지 알아야, 필요한 변수를 만들 수 있을 겁니다.

예 :

handle
파일을 열기위한 참조 핸들.
size
바이트 단위의 파일의 새로운 크기.

 

4. 어떤 헤더 파일을 포함시켜야 하는 지도 알아야 합니다? 예를 들어 _chsize 함수는 다음 헤더가 필요합니다.

<io.h>
 

5. 반환 유형 및 값도 알아야 합니다

예 :

 

_chsize()는 파일 크기가 성공적으로 변경되면 0을 반환합니다. 반환 값이 -1 일 경우 오류를 나타냅니다.

errno는 지정된 파일이 액세스에 대해 잠긴 경우 EACCES로 설정되고

지정된 파일이 읽기 전용이거나 핸들이 유효하지 않은 경우

EBADF로 설정되며, 장치에 공간이 없을 경우 ENOSPC로 설정됩니다.

 

§ 그럼, 프로그램에서 이 함수를 사용할 준비가 되었을 것입니다. 함수에 대해 여전히 애매하면 C & C ++ 함수 자습서1를 읽으십시오. 여기에 필요한 모든 정보가 제공되는 것은 아니며, 완전한 정보는 Microsoft Visual C ++ / MSDN / SDK 플랫폼 문서 또는 여기2를 참조하십시오.

§ C ++의 경우 클래스와 함께 MFC(Microsoft Foundation Class) 및 ATL(Automatic Template Library)을 사용하여 프로그램을 개발할 때 사용됩니다.

§ MSDN 문서의 식별자에 사용되는 표기 규칙은 헝가리어 표기법이며 C & C ++ 표기법3에 대해 설명합니다.

 

--------------------The Story and Program Examples---------------------

 

 

디렉토리 조작

§ 이 범주에서 사용할 수 있는 함수들은 디렉토리 구조에 대한 접근, 수정 및 정보를 얻기 위해 사용되며 다음 표에 나열되어 있습니다.

§ 대부분의 함수 이름은 밑줄 (_) 접두사를 제외하고는 표준 C와 유사하다는 점에 유의하십시오. 이 범주에서 사용할 수 있는 함수들은 다음 표에 나열되어 있습니다

 

디렉토리 조작 함수들

 

§ 다음 표는 디렉토리 제어 및 관리에 사용되는 기능을 나열합니다.

 
Function
Use
_chdir(), _wchdir()
Change current working directory.
_chdrive()
Change current drive.
_getcwd(), _wgetcwd()
Get current working directory for default drive.
_getdcwd(), _wgetdcwd()
Get current working directory for specified drive.
_getdiskfree()
Populates a _diskfree_t structure with information about a disk drive.
_getdrive()
Get current (default) drive.
_getdrives()
Returns a bitmask representing the currently available disk drives.
_mkdir(), _wmkdir()
Make new directory.
_rmdir(), _wrmdir()
Remove directory.
_searchenv(), _wsearchenv()
Search for given file on specified paths.


Table 4: Directory control functions

§ 다음은_getdrives() 함수를 사용하기 위해 필요한 정보의 예입니다.

 
 
Information
Description
The function 
_getdrives().
The use
Returns a bitmask representing the currently available disk drives.
The prototype
int _getdrives(void);
Example
ULONG DriveMask = _getdrives();


while (DriveMask)
// list all the drives...
if(DriveMask & 1)
printf(mydrives);
++mydrives[1];
// shift the bit masks binary to the right and repeat
DriveMask >>= 1;
}
The parameters
void
The return value
If the function succeeds, the return value is a bitmask representing the currently available disk drives. Bit position 0 (the least-significant bit) is drive A, bit position 1 is drive B, bit position 2 is drive C, and so on. If the function fails, the return value is zero. To get extended error information, call GetLastError().
The header file
<direct.h>


Table 5: _getdrives() information

§ 다음 프로그램 예제는 _getdrives() 함수를 사용하여 현재 컴퓨터에서 사용 가능한 논리 드라이브를 나열합니다.

#include <windows.h>
#include <direct.h>
#include <stdio.h>
#include <tchar.h>

// buffer, be careful with terminated NULL. Must match with ++mydrives[1]...that is one space
// for example if no one space: "A:"--> ++mydrives[0];
// you may try char mydrives[ ] = {" A: "}; or char mydrives[ ] = " A: ";
TCHAR mydrives[ ] = " A: ";

int main()
{
	// get the drives bit masks...1 is available, 0 is not available A = least significant bit...
	ULONG DriveMask = _getdrives();

	// if something wrong
	if(DriveMask == 0)
		printf("_getdrives() failed with failure code: %d\n", GetLastError());
	else
	{
		printf("This machine has the following logical drives:\n");

		while (DriveMask)
		{ // list all the drives...

			if(DriveMask & 1)
				printf(mydrives);

			// go to the next drive strings with one space
			++mydrives[1];

			// shift the bit masks binary to the right and repeat
			DriveMask >>= 1;
		}
		printf("\n");
	}
	return 0;
}
 

출력값:

 
This machine has the following logical drives:
A: C: D: E: F: G: H: I: J: K: L:
Press any key to continue

 

 다음은 _getdiskfree() 함수를 사용하기 위해 필요한 정보의 예입니다.

 
Information
Description
The function
_getdiskfree().
The use
Populates a _diskfree_t structure with information about a disk drive.
The prototype
unsigned _getdiskfree( unsigned drive, struct _diskfree_t * driveinfo);
Example
struct _diskfree_t df = {0};
unsigned uDrive;
_getdiskfree(uDrive, &df);
The parameters
drive - The disk drive for which you want information.
driveinfo - A _diskfree_t structure that will be populated with information about the drive. _diskfree_t is defined in direct.h.
The return value
If the function succeeds, the return value is zero. If the function fails, the return value is the error code. To get extended error information, call GetLastError().
The header file
<direct.h>


Table 6: _getdiskfree() information

 

§ 다음 프로그램 예제에서는 _getdiskfree() 함수를 사용하여 현재 시스템의 논리 드라이브 정보를 나열합니다.

#include <windows.h>
#include <direct.h>
#include <stdio.h>
#include <tchar.h>


TCHAR g_szText[ ] = _T("Drive Total_clus Available_clus Sec/Cluster Bytes/Sec\n");
TCHAR g_szText1[ ] = _T("----- ---------- -------------- ----------- ---------\n");
TCHAR g_szInfo[ ] = _T("-> \n");

// ...for data display format...
// right justified, thousand comma separated and other format for displayed data
void utoiRightJustified(TCHAR* szLeft, TCHAR* szRight, unsigned uValue)
{
	TCHAR* szCur = szRight;
	int nComma = 0;
	
	if(uValue)
	{
		while(uValue && (szCur >= szLeft))
		{
			if(nComma == 3)
			{
				*szCur = ',';
				nComma = 0;
			}
			else
			{
				*szCur = (uValue % 10) | 0x30;
				uValue /= 10;
				++nComma;
			}
			--szCur;
		}
	}
	else
	{
		*szCur = '0';
		--szCur;
	}

	if(uValue)
	{
		szCur = szLeft;
		while(szCur <= szRight)
		{ // if not enough field to display the data...
			*szCur = '*';
			++szCur;
		}
	}
}

int main()
{
	TCHAR szMsg[4200];
	struct _diskfree_t df = {0};

	// search drives and assigns the bit masks to uDriveMask variable...
	ULONG uDriveMask = _getdrives();
	unsigned uErr, uLen, uDrive;
	printf("clus - cluster, sec - sector\n");

	// may need a casting from TCHAR to char * here
	// printf((char *)g_szText);
	printf(g_szText);
	printf(g_szText1);

	for(uDrive = 1; uDrive <= 26; ++uDrive)
	{
		// if the drive is available...
		if(uDriveMask & 1)
		{ // call _getdiskfree()...
			uErr = _getdiskfree(uDrive, &df);
			// provide some storage
			memcpy(szMsg, g_szInfo, sizeof(g_szInfo));
			szMsg[3] = uDrive + 'A' - 1;

			// if _getdiskfree() is no error, display the data
			if(uErr == 0)
			{
				utoiRightJustified(szMsg+4, szMsg+15, df.total_clusters);
				utoiRightJustified(szMsg+18, szMsg+29, df.avail_clusters);
				utoiRightJustified(szMsg+27, szMsg+37, df.sectors_per_cluster);
				utoiRightJustified(szMsg+40, szMsg+50, df.bytes_per_sector);
			}
			else
			{// print system message and left other fields empty
				uLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, uErr, 0, szMsg+8, 4100, NULL);
				szMsg[uLen+6] = ' ';
				szMsg[uLen+7] = ' ';
				szMsg[uLen+8] = ' ';
			}
			printf(szMsg);
		}

		// shift right the found drive bit masks and repeat the process
		uDriveMask >>= 1;
	}

	return 0;
}
 

출력 예:

clus - cluster, sec - sector
Drive Total_clus Available_clus Sec/Cluster Bytes/Sec
----- ---------- -------------- ----------- ---------
-> A 2,847 834 1 512
-> C 2,560,351 62,315 8 512
-> D 2,560,351 1,615,299 8 512
-> E 2,560,351 2,310,975 8 512
-> F 2,560,351 2,054,239 8 512
-> G 2,353,514 2,039,396 8 512
-> H 2,560,351 2,394,177 8 512
-> I 2,381,628 1,618,063 8 512
-> J 321,935 0 1 2,048
-> L 63,419 20,706 16 512
Press any key to continue

 

§ J :는 CD-RW, L :은 썸 드라이브, A :는 플로피임을 유의하십시오. 플로피 및 CD-ROM의 경우 미디어를 삽입해야합니다.

§ 다음은 VC ++ EE 2005를 사용하여 실행 한 또 다른 샘플 출력입니다.

§ 다음은 _getdrive() 함수를 사용하기 위해 필요한 정보의 예입니다.

 
Information
Description
The function
_getdrive().
The use
Gets the current disk drive.
The prototype
int _getdrive(void);
Example
int curdrive;
curdrive = _getdrive();
The parameters
void
The return value
Returns the current (default) drive (1=A, 2=B, and so on). There is no error return.
The header file
<direct.h>


Table 7: _getdrive() information

§ 다음 표에는 _chdir (), _wchdir () 함수를 사용하기 위해 필요한 정보가 나와 있습니다

 
Information
Description
The function
_chdir(), _wchdir().
The use
Change the current working directory.
The prototype
int _chdir(const char *dirname);
/* for wide character */
int _wchdir(const wchar_t *dirname);
Example
char path1[50] = "C:\\WINNT\\System32\\config";
_chdir(path1);
The parameters
dirname - Path of new working directory.
The return value
These functions return a value of 0 if successful. A return value of –1 indicates that the specified path could not be found, in which case errno is set to ENOENT.
The header file
<direct.h> or <wchar.h> for _wchdir().


Table 8: _chdir(), _wchdir() functions information

§ _chdir () 함수는 현재 작업 디렉토리를 dirname으로 지정된 디렉토리로 변경합니다. dirname 매개 변수는 기존 디렉토리를 참조해야 합니다.

§이 기능은 모든 드라이브의 현재 작업 디렉토리를 변경할 수 있습니다. 새 드라이브 문자가 dirname에 지정된 경우 기본 드라이브 문자도 변경됩니다. 예를 들어 A가 기본 드라이브 문자이고 \BIN이 현재 작업 디렉토리 인 경우 다음 호출은 C 드라이브의 현재 작업 디렉토리를 변경하고 C를 새 기본 드라이브로 설정합니다.

_chdir("c:\\temp");
 

§ 경로에 선택적인 백 슬래시 문자 (\)를 사용하는 경우 하나의 백 슬래시 (\)를 나타내기 위해 두 개의 백 슬래시 (\\)를 C 문자열 리터럴에 배치해야합니다.

§ _wchdir ()은 _chdir ()의 확장 문자 버전입니다. _wchdir ()에 대한 dirname 인수는 와이드 문자 문자열입니다. _wchdir () 및 _chdir ()은 다르게 작동합니다.

§ 우리 프로그램의 이들 중 일부 함수들을 사용합시다. 다른 기능에 대해서도 동일한 단계를 수행 할 수 있습니다 : o). 다음은 일부 함수들을 사용하는 프로그램 예제입니다.

 

/*******cruntime.cpp*******/
/***Visual C++ .Net/7.0****/
#include <stdio.h>
#include <conio.h>
#include <direct.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
	int chr, drive, curdrive;
	static char path[_MAX_PATH];
	char buffer[_MAX_PATH];
	char newdir[50] = "\\testdir";
	// char path1[50] = "C:\\Windows\\System32\\config";
	char path1[50] = "C:\\WINNT\\System32\\config";

	/* save current drive. */
	curdrive = _getdrive();
	printf("Available drives in this machine are: \n");

	/* if we can switch to the drive, it exists. */
	for(drive = 1; drive <= 26; drive++)
	if(!_chdrive(drive))

	printf("%c: ", drive + 'A' - 1);

	printf("\n\nType drive letter to check: ");
	
	chr = _getch();
	if(chr == 27)
		printf("Illegal drive input\n");
		
	if(isalpha(chr))
		_putch(chr);

	if(_getdcwd(toupper(chr) - 'A' + 1, path, _MAX_PATH) != NULL)
		printf("\nCurrent directory on that drive is:\n%s\n", path);

	/* restore original drive. */
	_chdrive(curdrive);

	/* get the current working directory */
	if(_getcwd(buffer, _MAX_PATH) == NULL)
		perror("_getcwd error");
	else
		printf("\nCurrent working directory is: %s\n", buffer);

	/* create a directory and then delete */
	if(_mkdir(newdir) == 0)
	{
		printf("\nDirectory %s was successfully created\n", newdir);
		system("dir \\testdir");

		if(_rmdir("\\testdir") == 0)
			printf("\nDirectory %s was successfully removed\n", newdir);
		else
			printf("\nProblem removing directory %s\n", newdir);
	}
	else
		printf("\nProblem creating directory %s\n", newdir);

	/* uses _chdir() function to verify that a given directory exists */
	printf("\n");
	printf("Change directory........\n");
	
	if(_chdir(path1))
		printf("Unable to locate the directory: %s\n", path1);
	else
		system("dir *.log /a");
		
	printf("\n");
	return 0;
}
 

 

출력:

Available drives in this machine are:
C: D: F:


Type drive letter to check: c
Current directory on that drive is:
c:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE


Current working directory is: D:\mcruntime


Directory \testdir was successfully created
Volume in drive D has no label.
Volume Serial Number is 90C8-54BB


Directory of D:\testdir


05/17/2005 08:54p <DIR> .
05/17/2005 08:54p <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 13,975,789,568 bytes free


Directory \testdir was successfully removed


Change directory........
Volume in drive C has no label.
Volume Serial Number is B03D-C18F


Directory of C:\WINNT\System32\config


05/17/2005 08:07p 1,024 default.LOG
05/17/2005 08:08p 1,024 SAM.LOG
05/17/2005 08:17p 1,024 SECURITY.LOG
05/17/2005 08:54p 12,288 software.LOG
06/05/2004 07:06a 1,024 system.LOG
06/05/2004 07:06a 0 TempKey.LOG
06/05/2004 07:06a 1,024 userdiff.LOG
7 File(s) 17,408 bytes
0 Dir(s) 7,208,861,696 bytes free


Press any key to continue
 

다음은 다른 머신에서 VC++ EE 2005를 사용해서 출력한 예입니다.

 

§ 다음 예제는 Windows SDK가 설치된 Visual C ++ Express Edition 2005를 사용하여 Windows XP Pro SP2에서 테스트되었습니다.

/*******cruntime.cpp*******/
/***Visual C++ EE 2005 on Win XP Pro SP 2 ****/
#include <stdio.h>
#include <conio.h>
#include <direct.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
	int chr, drive, curdrive;
	static char path[_MAX_PATH];
	char buffer[_MAX_PATH];
	char newdir[50] = "\\testdir";
	// char path1[50] = "C:\\WINNT\\System32\\config";
	char path1[50] = "C:\\Windows\\System32\\config";

	/* save current drive. */
	curdrive = _getdrive();

	printf("Available drives in this machine are: \n");

	/* if we can switch to the drive, it exists. */
	for(drive = 1; drive <= 26; drive++)
		if(!_chdrive(drive))
			printf("%c: ", drive + 'A' - 1);

	printf("\n\nType drive letter to check: ");

	chr = _getch();

	if(chr == 27)
		printf("Illegal drive input\n");

	if(isalpha(chr))
		_putch(chr);

	if(_getdcwd(toupper(chr) - 'A' + 1, path, _MAX_PATH) != NULL)
		printf("\nCurrent directory on that drive is:\n%s\n", path);

	/* restore original drive. */
	_chdrive(curdrive);

	/* get the current working directory */
	if(_getcwd(buffer, _MAX_PATH) == NULL)
		perror("_getcwd error");
	else
		printf("\nCurrent working directory is: %s\n", buffer);

	/* create a directory and then delete */

	if(_mkdir(newdir) == 0)
	{
		printf("\nDirectory %s was successfully created\n", newdir);
		system("dir \\testdir");

		if(_rmdir("\\testdir") == 0)
			printf("\nDirectory %s was successfully removed\n", newdir);
		else
			printf("\nProblem removing directory %s\n", newdir);
	}
	else
		printf("\nProblem creating directory %s\n", newdir);

	/* uses _chdir() function to verify that a given directory exists */
	printf("\n");

	printf("Change directory........\n");

	if(_chdir(path1))
		printf("Unable to locate the directory: %s\n", path1);
	else
		system("dir *.log /a");

	printf("\n");

	return 0;
}
 

 

출력 샘플:

대표

 

Visual C++ Express Edition 2005, 2008 그리고 Visual C++2005/Visual Studio 2008 에서 예제 샘플을 구동.

 

§ 위에서 언급 한 IDE의 경우 Character Set을 Not Set로 설정해야합니다. 그렇지 않으면 프로그램의 모든 유형을 유니 코드로 변경해야합니다. 다음 그림은 프로젝트에서 사용되는 문자 집합에 대한 프로젝트 설정을 보여줍니다.

 

Visual C++Express Edition 2005

 

Visual C++ 2005of the Visual Studio 2005

Furtherreading and digging:

1. Check the bestselling C, C++ and Windows books at Amazon.com.

2. Microsoft Visual C++,online MSDN.

3. ForMultibytes, Unicode characters and Localization please refer to Locale,Wide Character & Unicode (Story)and Windows Users & Groups tutorial (Implementation).

4. Notationused in MSDN is Hungarian Notation instead of CamelCase and is discussed in C & C++ Notations.

 

이상.


 

 

728x90