Silverlight를 설치하려면 여기를 클릭합니다.*
Korea 대한민국변경|Microsoft 전체 사이트
MSDN
|개발자 센터|라이브러리|MSDN Online|다운로드|코드 센터|Subscriptions|MSDN 행사
MSDN Home   MSDN Home
MSDN 홈 > .NET Framework 홈 > 기술 문서(Articles) > Windows Vista의 Win32 I/O 취소 지원

Windows Vista의 Win32 I/O 취소 지원

  


Microsoft Corporation

2005 년 9 월

Gerald Maffeo 및 Paul Sliwowicz
Microsoft Corporation

개요

이 백서는 새로운 취소 지원을 이용하여, Windows 응용 프로그램의 신뢰성을 높이는 것에 관심이 있는 소프트웨어 개발 파트너 및  개발자를 대상으로 합니다. 취소 지원은  직접 취소나 복구를 실시하여 느려지거나 차단 된 파일 입출력을 통해  사용자 경험을 향상시킵니다.

Windows Vista 에서는 커널이나 드라이버가 강화되어 Win32 응용 프로그램 프로그래밍 인터페이스가 새로워졌습니다.
네이티브 Win32 파일 관리 기능의 확장 취소가 가능하며, 동기 조작의 취소도 새롭게 지원됩니다.

 

목차

시작하며
배경
Vista 취소 확장
새로운 파일 I/O 취소 API 사용
비동기 I/O 취소
동기 I/O 취소
요약
관련 링크
부록 A : 새로운 I/O 취소 API
부록 B : 취소 가능한 파일 I/O API

시작하며

이 백서에서는 Windows Vista 의 Win32 파일 입출력 (I/O) 조작에 대한 새로운 취소 지원을 설명합니다.
네이티브 응용프로그램에서 취소 지원을 사용하기 위한 상세한 정보를 다룹니다.

이 백서의 설명은 네이티브 코드에 대해서만 적용되는 것에 주의해 주세요. .Net Framework 라이브러리 (WinFX)에서의 취소는 현재 낮은 레벨의 파일 I/O에 관한 취소 지원에서는 이용할 수 없습니다.

배경

응용 프로그램 종료시 문제

Windows 응용 프로그램은 사용자가 응용 프로그램을 닫았을 때에 (제목 표시줄의 [X] 를 클릭했을 경우 등), 정상적으로 종료하지 않는 경우가 있습니다. 이때, 응용 프로그램의 윈도우는 닫혔지만, 잘 살펴보면 응용 프로그램의 프로세스가 프로세스 리스트에 남아 있습니다. 이러한 프로세스를 "좀비" 프로세스라 부릅니다. 좀비 프로세스는 강제 종료할 수 없습니다. 좀비 프로세스에 의해 응용 프로그램을 재시동 할 수 없는 경우, 예기치 않은 동작을 하기도 합니다.복구하려면 컴퓨터를 재시동해야 합니다.

마이크로소프트에서는 이러한 동작에 관한 사례를 다수 확인하여, 문제가 있는 드라이버가 원인으로 추측하였습니다. 또, 근본적인 원인을 파악하여 그 해결 방법을 명확히 하기 위해, 신뢰를 할 수 있는 데이터를 조사하였습니다. 이러한 데이터를 수집하기 위해, 특수한 기능을 갖춘 Windows XP 버전을 개발했습니다.이 버전은 커널 데이터의 수집과 리포트를 실시합니다.이 데이터에는 스택 프로세스를 대기하는 드라이버 요청에 관한 데이터도 포함되어 있습니다. 베타 프로그램을 통해 마이크로소프트의 내부 사용자 및 선발한 고객에 대해서 배포 했습니다.

보고된 리포트를 통하여, 마이크로소프트에서 추측했던 원인 뿐만 아니라, 종료시 문제나 응용 프로그램으로부터 응답이 없는 문제는 Windows 나 드라이버에 생성 요청을 취소하는 기능이 없는 것이 원인이라는 것을 알게 되었습니다. 이러한 문제를 해결하기 위해, Windows를 수정할 필요가 있었습니다.

응용 프로그램의 취소 지원

파일 조작에서는 응용 프로그램의 스레드를 차단하고, 처리의 계속을 중단할 수 있습니다. 설계가 잘 되어 정상적으로 응답하는 응용 프로그램은 적어도  두 개의 스레드에서 구성됩니다.이러한 응용 프로그램의 스레드에서는 사용자 인터페이스 (UI)의 서비스를 실시하여,  미응답의 원인이 될 수 있는 API 를 직접적으로도 간접적으로도 호출하지 않습니다. 조작을 차단하는 경우는  한번 이상의 "작업자" 스레드("worker" thread)가 실행 됩니다.

이 작업자 스레드(worker thread)를 이용하는 것으로써, 응용 프로그램으로 [Cancel] 나 [Stop] 버튼 또는 처리 상황 인디케이터(indicator)를 사용한 취소를 지원 할 수 있습니다. 많은 경우, 사용자가 조작을 중지할 때는 작업자 스레드(worker thread)를 무시해도 문제는 없습니다 (작업자 스레드(worker thread)에 대해 조작을 실시하지 않는다).예를 들어, DNS 확인자의 호출이나, 다른 네트워크 호출이 최종적으로 종료되면, 작업자 스레드(worker thread)는  자신을 소거 합니다.

다만, 실제 I/O 취소 지원이 필요한 경우도 있습니다.그 예로서 매우 느린 디바이스에 대한 OpenFile 호출 중지가 있습니다.이 호출을 즉시 재실행할 때, 경우에 따라 다른 매개 변수가 필요합니다.이러한 상황이 발생했을 경우, 사용자가 필요로 하는 유일한 대처 방법은 응용 프로그램의 종료입니다 (전에 설명한 것처럼, 응용 프로그램이 예기치 않은 동작을 할 가능성이 있습니다). 요청의 취소 기능을 사용자에 제공하려면, Windows 와 그 드라이버군이 취소를 완벽히 지원해야 합니다.이 지원에서는 동기 조작의 취소도 해당됩니다.

Vista 의 취소 확장

커널, I/O 매니저 추가

드라이버로의 생성 요청을 취소하는 기능 (IRP_MJ_CREATE)이, Vista에서는 지원됩니다.드라이버로의 생성 요청에 일치되는 Win32 API 에는 CreateFile OpenFile 이 있습니다.

이러한 요청은 기초가 되는 드라이버에 의해 반드시 발생한다는 것이 아닙니다.생성 요청의 완료에 시간이 걸리는 드라이버에는 취소 지원을 구현 할 필요가 있습니다. 마이크로소프트에서는 드라이버 I/O의 완료와 취소에 관한 가이드 라인을 작성했습니다. 또, Vista 의 드라이버 검증 도구 v2 용의 새로운 옵션을 개발하여, 완료 동작과 취소 동작의 테스트를 지원합니다 (관련 링크의 Driver Hang Verifier 를 참조해 주세요).

마이크로소프트 제공의 드라이버는 필요에 따라 작성 요청의 취소를 지원 합니다.특히 Microsoft Multi-UNC Provider (MUP)나 redirector에서는 빈번히 이용됩니다.

새로운 파일 I/O 취소 API

Windows XP 나 Windows Server 2003의 파일 I/O API 는 제한부의 I/O 취소 지원 기능을 갖추고 있습니다.이 지원에서는 특정의 파일 핸들에 대한 호출 스레드에 의해 발행된, 보류중의 비동기 I/O를 CancelIo 함수를 사용해 취소합니다. 다만, CancelIo 는 기능이 한정되어 이하의 취소는 지원 하지 않습니다.

  • 다른 스레드가 파일 핸들에 대해 발행한 I/O 조작
  • 특정 I/O 조작
  • 동기 I/O 조작 (operating system이 사실상 차단 된 후)
  • 완료 포토에 대해 발행된 I/O 또는 IOSB 범위에 관련된 I/O

이상과 같은 이유로 새로운 Win32 취소 API 가 Windows Vista 에 구현 되었습니다. CancelIo 과는 달리 새로운 CancelIoExCancelSynchronousIo API 는 취소 대상이 되는 보류중의 I/O 요청에 표시를 붙여 즉시 돌려줍니다. 다음이 중요한 포인트가 됩니다.

  • 취소와 완료 중에는 고유의 경합 상태가 있습니다.이것은 I/O 요청을 취소하는 요청이 존재해도, I/O 요청은 정상적으로 완료하기 위해서 입니다.
  • 조작이 정상적으로 완료했는지, 취소되었는지를 검증할 필요가 있습니다 (취소 API 를 사용해 요청을 취소했을 경우, 최종적으로는 요청은 완료합니다).
  • 완료의 상태 코드는 조작이 정상적으로 완료됐는지, 취소되었는지 (ERROR_OPERATION_ABORTED)를 나타냅니다.또 어떠한 오류에 의해 실패했는지 보여주는 경우도 있습니다.

이러한 새로운 API 의 프로토 타입을 이용할 수 있습니다. 관련 링크 참조해 주세요.  자세한 정보는「부록 A : 새로운 I/O 취소 API」를 참조하세요.

취소 가능한 파일 I/O API

대부분의 파일 I/O API 는 취소가 가능합니다.

다만, CopyFile 등의 일부 복잡한 Win32 API 는 취소할 수 없습니다. CopyFileEx 등의 취소 가능한 API 가 제공되기 때문에, 이것을 사용하기를 추천합니다.이러한 API 에는 취소 지원 뿐만 아니라, 호출의 진행 상황을 추적하기 위한 콜백이 가능합니다.

취소 가능한 파일 I/O API 의 목록에 대해서는「부록 B」를 참조해 주세요.

새로운 파일 I/O 취소 API  사용

비동기 I/O 취소

비동기 I/O는 I/O 를 발행한 프로세스내의 모든 스레드에서  취소할 수 있습니다.이것을 실시하려면,  I/O 가 실행되고 있는 핸들을 지정하면 됩니다.옵션으로서 I/O 의 실행으로 사용된, 오버랩 한 구조체도 지정할 수 있습니다.다음 예는 루틴에서는 타임 아웃을 사용하여, 읽기를 실행합니다. 시간이 만료되면, CancelIoEx 에 의해 읽기가 취소됩니다. 다만 CancelIoEx의 호출에 의해 읽기가 반드시 취소된다고 할 수 없습니다 .취소를 처리하는 드라이버가 이 취소 가능한 API 를 지원한다는 점에 주의해 주세요.

비동기의 경우는 오버랩 된 구조체(structure)를 받을 때나, 완료 콜백 사용시의 상태를 조사를 통해 취소를 실행할지를 판별할 수 있습니다. ERROR_OPERATION_ABORTED 상태는 조작이 취소된 것을 보여줍니다.

BOOL
DoCancelableRead(
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped,
    DWORD dwTimeout,
    LPBOOL bCancelCalled
)
{
    BOOL result;
    DWORD waitResult;

    *bCancelCalled = FALSE;
    
    result = ReadFile( hFile,
                       lpBuffer,
                       nNumberOfBytesToRead,
                       lpNumberOfBytesRead,
                       lpOverlapped );

    
if (!result) {
        if (GetLastError() != ERROR_IO_PENDING) {
            return result; 
        }
    } else {
        return result;
    }

    //
    // I/O 가 보류 상태가 되었습니다.타임 아웃을 대기합니다.
    // 루틴을 호출하기 전에
    // 오버랩 한 이벤트가 설정되어 있어야 합니다.
    //
    waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                      dwTimeout );

    if (waitResult == WAIT_TIMEOUT) {
        result = CancelIoEx( hFile,
                             lpOverlapped );

        *bCancelCalled = TRUE;

        //
        // I/O 완료를 대기합니다 (취소되는 경우와
        // 취소되지 않는 경우가 있습니다)
        //
     waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                          0 );
    }

    return result;
}

동기 I/O 취소

동기 I/O는 I/O를 발행한 프로세스내의 어느 스레드에서든  취소할 수 있습니다.동기 I/O 를 취소하려면, 현재 I/O 를 실행하고 있는 스레드에 대한 핸들을 지정합니다.

다음의 예는 두 가지의 루틴을 보여줍니다.

  • SynchronousIoWorker는 CreateFile 호출로부터 시작되는 동기 파일 I/O 를 구현 하는 작업자 스레드(worker thread)입니다.동기 파일 I/O 가 성공하면, 이후 조작이 실행됩니다 (이 예에서는 나타나고 있지 않습니다).글로벌 변수gCompletionStatus는 모든 조작이 성공했는지 또는 조작이 실패/취소되었는지를 판별하는 경우에 사용됩니다.글로벌 변수dwOperationInProgress는 파일 I/O 가 처리중 인지를 나타냅니다.이 예에서는 UI 스레드는 작업자 스레드(worker thread)의 존재를 체크할 수 있습니다. SynchronousIoWorker 에서는 수동으로 보충 체크 (이 예에서는 없습니다.)를 해야합니다. 이것은 각 파일 I/O 의 호출간의 몇 안 되는 기간에 취소가 요청된 것을 확인하기 위한 조작입니다. 취소가 요청되었을 경우는 나머지의 조작은 취소됩니다.
  • MainUIThreadMessageHandler는 UI 스레드의 윈도우 프로시저 내에 있는 메시지 처리기를 시뮬레이트 합니다. 컨트롤을 클릭하면, 동기 파일 조작세트가 요청되고, 사용자 정의의 윈도우 메시지 WM_MYSYNCOPS 가 생성됩니다. 이 메시지 용무의 코드에 의해, SynchronousIoWorker 가 시작되는 루틴 CreateFileThread 를 포함한 새로운 스레드가 작성됩니다. 요청된  I/O를 작업자 스레드(worker thread)가 실행하고 있는 동안, UI 스레드는 메시지의 처리를 계속합니다.미완료의 조작을 취소하는 경우 (일반적으로는 취소 버튼을 클릭), WM_MYCANCEL의 코드에서는 CreateFileThread 에 의해 반환된 스레드 핸들을 사용하여, CancelSynchronousIo를 호출합니다. CancelSynchronousIo는 취소 실행 후 즉시 제어를 반환합니다.다만, 작성 조작이 반드시 취소된다고는 할 수 없습니다.사용자 또는 응용 프로그램은 다음에, 파일 조작이 완료했는지의 영향을 받는 다른 조작을 요청하는 경우가 있습니다.이러한 경우, WM_PROCESSDATA 부분의 샘플 코드에서는 최초로 조작의 완료 상태를 확인한 후 소거 코드를 실행합니다.이 예에서는 조작 순서의 어느 부분에서도 취소가 발생하여, 완료 상태가 변화될 가능성이 있습니다.이 때문에, 처리를 계속하는 경우, 호출  완료 상태가 변화되지  않는 것 확인해 두거나, 적어도 상태가 변화돼서는 안 된다는 것을 알고 있어야 합니다.
DWORD gCompletionStatus;      // 전회의 조작의 완료 상태
DWORD dwOperationInProgress;   // 조작이 실행중의 경우는 TRUE

VOID
SynchronousIoWorker( VOID * pv )
{
    LPCSTR lpFileName = (LPCSTR) *pv;
    HANDLE hEvent = lpCreateParams->hEvent;
    HANDLE hFile;

    dwOperationInProgress = TRUE;   
    gCompletionStatus = ERROR_SUCCESS;
    hFile = CreateFileA( lpFileName,
                         GENERIC_READ,
                         0,
                         NULL,
                         OPEN_EXISTING,
                         0,
                         NULL );


    if (hFile != INVALID_HANDLE_VALUE) {
   
        /* TODO: CreateFile 가 성공했을 경우는 hFile를 사용해 동기 호출을 실행 */
        
        if (result == FALSE) {
            // 조작이 실패 또는 취소되었습니다.취소되었을 경우는
            // GetLastError()는 ERROR_OPERATION_ABORTED를 돌려줍니다.

            gCompletionStatus = GetLastError() ;            
        }
             
        CloseHandle(hFile);

    } else {
        // CreateFile 실패 또는 취소되었습니다.취소되었을 경우는
        // GetLastError()는 ERROR_OPERATION_ABORTED 를 돌려줍니다.
        gCompletionStatus = GetLastError();
    }

    dwOperationInProgress = FALSE;
}



LRESULT
CALLBACK
MainUIThreadMessageHandler(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    HANDLE syncThread;

    /* TODO: 그 외의 초기 처리 등. */

    switch (uMsg) {

    case WM_MYSYNCOPS:   // 사용자가 파일에 대한 조작을 요구했습니다
        /* TODO: 매개 변수로부터 파일명을 취득 */

        syncThread = CreateThread( NULL,
                                0,
                                (LPTHREAD_START_ROUTINE) SynchronousIoWorker,
                                &lpFileName,
                                0,
                                NULL );

        if (syncThread == INVALID_HANDLE_VALUE) {
            /* TODO: 실패시의 처리 */
        }
        break;
    
    // 사용자가 취소 버튼을 클릭했습니다
    case WM_MYCANCEL:
        if (syncThread != INVALID_HANDLE_VALUE) {
            CancelSynchronousIo(syncThread);
        }
        Break;

    case WM_PROCESSDATA:
        if (!dwOperationInProgress) {
            if (gCompletionStatus == ERROR_OPERATION_ABORTED) {
                /* TODO: 적절한 소거를 실행 */
            } else if (...) {
                /* TODO: 다른 케이스를 처리 */
            }
        }
        break;
    
    case ...:
        /* TODO: 다른 모든 케이스를 처리 */
    }

    return TRUE;
}

취소의 원인

문제가 있는 드라이버

기반이 되는 드라이버가 취소를 적절히 지원 할지 어떨지는 보장 되지 않습니다. 취소를 올바르게 요청해도, 요청된 조작을 드라이버가 차단하고, 완료할 수 없게 되는 경우가 있습니다. 문제가 더 심각한 경우, 취소 기능을 적절히 지원 하는 응용 프로그램이, 드라이버 (바이러스 대책이나 파이어 월(fire wall) 필터의 드라이버등)의 설치나 업데이트, 시스템 재구성 후, 취소 요구에 대해서 갑자기 응답하지 않을 가능성도 있습니다.

잠재적인 경합 상태

다른 스레드로  I/O 조작을 취소하는 경우, 개발자가 고려할 필요가 있는 동기의 문제가 발생합니다.

비동기의 경우, 오버랩 한 구조체를 지정하지 않으면 CancelIoEx를 호출하여, 프로세스내에 있는 모든 스레드의 미처리된 파일 I/O 가 취소됩니다.이 API 는 스레드를 개별적으로 처리하기 때문에, 하나의 스레드를 처리한 후, 파일에 대한 다른 I/O 취소가 처리됩니다.다른 모든 스레드가 파일 I/O 의 취소가 종료할 때까지, 처리하고 있다는 것에 주의해 주세요.

또 개발자는 오버랩 한 구조체와 대상이 되는 취소를 조합하여 재사용하는 경우에도 주의할 필요가 있습니다. CancelIoEx 를 호출한 직후에 구조체를 재사용하는 것은 안전하지 않습니다. I/O 조작이 완료하면 (상태가 성공 또는 취소의 어느 쪽의 경우든), 오버랩 한 구조체는 시스템에서는 미사용이 되어, 재사용이 가능합니다.

동기의 경우, CancelSynchronousIo 호출에 의해, 스레드 현재의 동기 호출이 취소됩니다.동기를 신중하게 하지 않으면 연속된 호출내 잘못된 호출이 취소되는 경우도 있습니다. 호출은 예측 불가능하고, 좀처럼 발생하지 않는 경우도 있습니다.이 때문에, 호출의 분석은 매우 어렵습니다.합니다.호출의 분석에 사용할 수 있는 방법으로서 CancelSynchronousIo 호출이 있습니다. 이 API 는 지정된 동기 조작에만 사용할 수 있는 것이지만, 그 조작의 완료 후 (정상 종료나 오류의 발생에 관련되지 않고)에만 실행 됩니다.스레드가 최초 조작을 호출한 다음, 다른 동기 호출을 시작하는 경우, 취소 호출에 의해 새로운 I/O 가 중단되는 경우가 있습니다.이것 때문에 비정상적인 결과가 발생하므로, 취소시에는 주의해야 합니다.

동기 I/O 에는 하나 더 동일한 경합 상태가 있습니다.스레드가 스레드 풀 스레드등의 응용 프로그램이 다른 부분에서 공유되는 경우입니다.

그 예로서 서브 응용 프로그램 1 이 스레드 2 로 CreateFile 를 호출하여, 스레드 1에서 취소를 발행하는 경우를 생각해 봅시다.또, 서브 응용 프로그램 2 가 스레드 2 를 공유하여 다른 스레드로부터 취소를 실행하는 Flush를 호출한다고 합니다.이러한 스레드가 적절히 조정되어 있지 않은 경우, 취소 요구에 의해 잘못된 조작이 취소될 가능성이 있습니다.

요약

Windows Vista 의 커널이나 드라이버에서는 취소 지원의 기능이 향상되고 있습니다. 새로운 Win32 응용 프로그램 프로그래밍 인터페이스를 사용하면, 파일에의 동기 요청을 취소할 수 있습니다.이러한 API 는 응용 프로그램의 종료에 관한 신뢰성을 높이고, Vista 의 사용자 요구를 만족시키기 위해 개발되었습니다.또, 속도가 느린  파일 입출력이나 차단 된 파일 입출력에 관한 직접 취소 및 복구지원을 통해 사용자 경험이 향상시켜드립니다..

 

관련 링크

상세 정보는 다음을 참조하세요.

부록 A : 새로운 I/O 취소 API

이 부록에 기재된 정보는 Vista 가 새로운 취소 API (관련 링크」를 참조)에 관한 추가 정보입니다.
다만, 이 정보는 잠정적이며 변경될 가능성도 있습니다.

CancelIoEx

주의    이 정보는 잠정적이며 변경될 가능성도 있습니다.

CancelIoEx 함수에 의해, 현재 프로세스내에 있는 지정된 파일 핸들에 대해서 보류중의 모든 I/O 조작이 취소와 기록됩니다.이것은 I/O 조작을 발행한 모든 스레드에 대해 행해집니다.

BOOL CancelIoEx(
  HANDLE Error! Hyperlink reference not valid.,
  LPOVERLAPPED Error! Hyperlink reference not valid.
);

매개 변수

hFile
[입력] 취소되는 I/O 조작의 대상이 되는 파일에의 핸들입니다.
lpOverlapped
[입력]OVERLAPPED (영어) 데이터 구조에의 포인터입니다. 비동기의 (오버랩 된) I/O로 사용되는 데이터를 제공합니다.

lpOverlapped이  NULL 가 아닌 경우, 지정의 오버랩 한 구조체를 사용해 발행된 요청만이 취소와 기록 됩니다. NULL의 경우는 파일 핸들에 대한 모든 I/O 요청이 취소됩니다.

반환값

취소 조작이 성공하면, 반환값은 0 이외의 값이 됩니다.

이 함수가 실패하면, 반환값은 0 이 됩니다.상세한 오류 정보가 필요한 경우는 GetLast Error (영어)를 호출합니다.

참고

CancelIoEx CancelIo는 다릅니다. CancelIo CancelIo를 호출한 스레드에 의해 발행된 I/O 요청만이 취소와 기록됩니다.

지정한 파일 핸들에 대해서 보류중의 I/O 조작이 존재하는 경우, CancelIoEx 함수에서는 그 모든 조작이 취소와 표시 됩니다.대부분의 종류의 조작은 즉시 취소할 수 있습니다.취소되지 않았던 조작은 완료를 향해서 처리를 속행하지만, 실제로 취소될 때는 호출자는 통지를 받습니다.CancelIoEx 취소된 모든 조작이 완료하는 것을 대기하지 않습니다.

취소된 조작은 최종적으로는 완료합니다.완료 상태를 조사하고, 조작이 정상적으로 완료했는지 (취소 요청은 무시된), 조작이 취소되었는지 (완료 상태ERROR_OPERATION_ABORTED) 또는 조작이 어떠한 오류에 의해 실패했는지를 판단할 필요가 있습니다.

요건

클라이언트 Windows Vista  필요
서버 Windows Server Vista 가 필요
헤더 Winbase.h  선언
라이브러리 Kernel32.lib  링크
DLL Kernel32.dll  필요

CancelSynchronousIo

주의    이 정보는 잠정적이며 변경될 가능성도 있습니다.

CancelSynchronousIo 함수에 의해 지정된 스레드가 발행한 보류중의 동기 I/O 조작이 취소와 기록됩니다.

BOOL CancelSynchronousIo(
  HANDLE Error! Hyperlink reference not valid.
);

매개 변수

hThread
[입력] 동기 I/O 조작으로 차단 된 스레드 핸들입니다.

반환값

취소 조작이 성공하면, 반환값은 0 이외의 값이 됩니다.

이 함수가 실패하면, 반환값은 0 이 됩니다.상세한 오류 정보가 필요한 경우는 GetLast Error (영어)를 호출합니다.

참고

지정한 스레드에 의해 발행된 보류중의 동기 I/O 조작이, 취소와 표시 됩니다.대부분의 종류의 조작은 즉시 취소할 수 있습니다.취소되지 않았던 조작은 완료를 향해서 처리를 속행하지만, 실제로 취소될 때는 호출자는 통지를 받습니다.CancelSynchronousIoEx 취소된 모든 조작이 완료하는 것을 대기하지 않습니다.

취소된 조작은 최종적으로는 완료합니다.완료 상태를 조사하고, 조작이 정상적으로 완료했는지, 조작이 취소되었는지 (완료 상태 ERROR_OPERATION_ABORTED) 또는 조작이 어떠한 오류에 의해 실패했는지를 판단할 필요가 있습니다.이 서비스는 사용자가 파일 핸들을 보관 유지하지 않기 때문에 발행한 작성 요청을 취소하는 경우에 편리합니다.

요건

클라이언트 Windows Vista 필요
서버 Windows Server Vista 필요
헤더 Winbase.h 선언
라이브러리 Kernel32.lib 링크
DLL Kernel32.dll 필요

부록 B : 취소 가능한 파일 I/O API

API 이름 취소 가능여부 취소 메커니즘
WalkTree 부분적 WalkTree 자체는 취소를 지원 하지 않습니다. 다만,  API 는 열거 콜백을 사용하고, "작업" 을 실행합니다.이 콜백에서는 취소가 지원 됩니다. 취소되었을 경우는 열거를 정지할 수 있습니다.
DeleteTree 아니오 취소를 지원 하지 않는 WalkTree 의 콜백.
AreFileApisANSI 해당 없음
CheckNameLegalDOS8Dot3 해당 없음  
CloseHandle 해당 없음  
CopyFile 아니오 CopyFileEx  사용.
CopyFileEx 진행중의 루틴으로 취소할 수 있고 PROGRESS_CANCEL 를 돌려줍니다.또는변수 pbCancel 를 건네주고, 취소가 발생했을 경우에 TRUE 를 설정할 수 있습니다.
CreateFile  
CreateHardLink  
DeleteFile  
FindClose  
FindFirstFile  
FindFirstFileEx  
FindFirstStreamW  
FindNextFile  
FindNextStreamW  
GetBinaryType  
GetCompressedFileSize  
GetFileAttributes  
GetFileAttributesEx  
GetFileInformationByHandle  
GetFileSize  
GetFileSizeEx  
GetFileTime  
GetFileType  
GetFullPathName  
GetLongPathName  
GetShortPathName  
GetTempFileName  
GetTempPath  
MoveFile 아니오 MoveFileWithProgress 사용.
MoveFileEx 아니오 MoveFileWithProgress 사용.
MoveFileWithProgress 진행중의 루틴은 조작이 정지되면, PROGRESS_STOP 또는 PROGRESS_CANCEL 를 돌려줍니다. CopyFile과 같이, 부울 값 취소는 지원 하지 않습니다.
ReplaceFile 아니오 취소할 수 없는 소수의 스트림 카피를 실행합니다.
SearchPath  
SetFileApisToANSI 해당 없음  
SetFileApisToOEM 해당 없음  
SetFileAttributes  
SetFileSecurity  
SetFileShortName  
SetFileTime  
SetFileValidData  
CreateIoCompletionPort 해당 없음  
FlushFileBuffers
GetQueuedCompletionStatus 사용자 모드의 대기는 취소 가능합니다.
LockFile  
LockFileEx  
PostQueuedCompletionStatus 해당 없음  
ReadFile  
ReadFileEx  
ReadFileScatter  
SetEndOfFile  
SetFilePointer  
SetFilePointerEx  
UnlockFile  
UnlockFileEx  
WriteFile  
WriteFileEx  
WriteFileGather  
CreateFileMapping  
FlushViewOfFile  
MapViewOfFile  
MapViewOfFileEx  
OpenFileMapping 해당 없음  
UnmapViewOfFile 해당 없음  

 


이 문서에 기재된 정보는 이 문서의 발행시점에 있어서의 마이크로소프트의 견해를 반영한 것입니다. 마이크로소프트는 시장의 변화에 대응하기 위해, 이 문서의 내용에 관한 책임을 마이크로소프트는 추궁 당하지 않는 것으로 합니다. 또, 발행일 이후에 발표된 정보의 정확성을 보장 할 수 없습니다.

이 문서에 기재된 내용은 정보 제공만을 목적으로 하며 명시 또는 묵시에 관련되지 않고, 이러한 정보에 대해 마이크로소프트는 어떠한 책임도 지지 않는 것으로 합니다.

고객 자신의 책임에 대하고, 적용되는 모든 저작권 관련 법규에 따른 사용을 바랍니다. 이 문서의 어떠한 부분도, 미국 Microsoft Corporation 의 서면에 의한 허락을 받지 않으면, 그 목적을 불문하고, 어떠한 형태여도, 복제 또는 양도하는 것은 금지되고 있습니다.여기서 말하는 형태란, 복사나 기록 등, 전자적인 또는 물리적인 모든 수단을 포함합니다. 다만 이것은 저작권법상의 고객의 권리를 제한하는 것이 아닙니다.

마이크로소프트는 이 문서에 기재되어 있는 내용에 관해, 특허, 특허 신청, 상표, 저작권 또는 그 외의 지적재산권을 가지는 경우가 있습니다.별 도 마이크로소프트의 라이센스 계약상에 명시의 규정이 없는 한, 이 문서는 이러한 특허, 상표, 저작권 또는 그 외의 지적재산권에 관한 권리를 고객에게 허락하는 것이 아닙니다.

이 소프트웨어 및 관련하는 문서로 사용하고 있는 회사, 조직, 제품, 인물, 사건 등의 명칭은 가공의 것입니다. 실재하는 상품명, 단체명, 개인 이름 등과는 일절 관계 없습니다. ©2004 Microsoft Corporation.All rights reserved.

Microsoft, Windows및 Windows Vista는 미국 Microsoft Corporation의 미국 및 그 외의 나라에 있어서의 등록상표 또는 상표입니다.

기재되어 있는 회사명, 제품명에는 각사의 상표의 것도 있습니다.

  

Top of Page Top of Page


Microsoft