모듈 A 구현 사양 MICROSOFT C Run-Time Win32 1
시작하기에 앞서서 다음 리포지터리를 생성하였음
아래의 튜토리얼과는 달리 이클립스 환경 + 윈도우 SDK 를 사용하여 컴파일하고 빌드 하였다. 다음을 참고로 한다.
이 모듈에서 이야기 하는 것들
- 배경 지식: TheMicrosoft C Run-time 라이브러리들
- 표준 C++ 라이브러리
- 런타임 함수들
- 디렉토리 조작
- 디렉토리 조작 함수들
- 프로그램 예제들
알아야 할 기술 들
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 메뉴를 선택하십시오.
- 다음 그림은 프로젝트 속성 페이지입니다.
- C 런타임 라이브러리를 지정하는 컴파일러 옵션 없이 프로그램을 명령 줄에서 연결하면 링커는 기본적으로 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);
예 :
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.
이상.
'프로그래밍' 카테고리의 다른 글
Maraa 와 wiringPi 라이브러리로 라즈베리 파이에서 센서 제어해 보기 (0) | 2023.03.13 |
---|---|
개발하고 있는 웹페이지의 javascript 파일이 갱신 되지 않을때 (0) | 2023.03.12 |
[JavaScript] URL 파라메터 얻기 (1) | 2023.03.10 |
Load-time relocation of shared libraries (0) | 2023.03.09 |
윈도우 SDK와 커맨트 프롬프트를 이용한 C++ 프로젝트 컴파일하기 (0) | 2023.02.26 |