다음을 통해 공유


SHCreateThreadWithHandle 함수(shlwapi.h)

새 스레드를 만들고 해당 핸들을 검색합니다.

구문

BOOL SHCreateThreadWithHandle(
  [in]            LPTHREAD_START_ROUTINE pfnThreadProc,
  [in, optional]  void                   *pData,
  [in]            SHCT_FLAGS             flags,
  [in, optional]  LPTHREAD_START_ROUTINE pfnCallback,
  [out, optional] HANDLE                 *pHandle
);

매개 변수

[in] pfnThreadProc

형식: LPTHREAD_START_ROUTINE

LPTHREAD_START_ROUTINE 형식의 애플리케이션 정의 함수에 대한 포인터입니다. 새 스레드가 성공적으로 만들어진 경우 이 애플리케이션 정의 함수는 해당 스레드의 컨텍스트에서 호출됩니다. SHCreateThreadWithHandlepfnThreadProc 이 가리키는 함수가 완료된 후 호출자에게 반환되기를 기다리지 않습니다. pfnThreadProc에서 지정한 함수의 반환 값은 스레드의 종료 코드입니다.

[in, optional] pData

형식: void*

초기화 데이터를 포함하는 선택적 애플리케이션 정의 데이터 구조에 대한 포인터입니다. pfnThreadProc에서 가리키는 함수 및 필요에 따라 pfnCallback이 가리키는 함수에 전달됩니다.

[in] flags

형식: SHCT_FLAGS

함수의 동작을 제어하는 플래그입니다. 하나 이상의 CTF 상수입니다.

[in, optional] pfnCallback

형식: LPTHREAD_START_ROUTINE

LPTHREAD_START_ROUTINE 형식의 선택적 애플리케이션 정의 함수에 대한 포인터입니다. 이 함수는 pfnThreadProc 에서 가리키는 함수가 호출되기 전에 생성된 스레드의 컨텍스트에서 호출됩니다. 또한 pData 를 인수로 받습니다. SHCreateThreadWithHandlepfnCallback 이 가리키는 함수가 완료되기를 기다린 후 호출자에게 돌아갑니다. pfnCallback에서 지정한 함수의 반환 값은 무시됩니다.

[out, optional] pHandle

형식: HANDLE*

생성된 스레드의 HANDLE 에 대한 포인터입니다. 더 이상 필요하지 않은 경우 CloseHandle 함수를 호출하여 이 핸들을 닫아야 합니다. 이 값은 NULL일 수 있습니다.

반환 값

형식: BOOL

스레드 가 성공적으로 만들어지면 TRUE이고, 그렇지 않으면 FALSE입니다.

설명

Windows 7 이전에는 이 함수에 연결된 헤더 또는 라이브러리 파일이 없었습니다. 이전 운영 체제에서 이 함수를 사용하려면 DLL 이름(Shlwapi.dll)을 사용하여 LoadLibrary 를 호출하여 모듈 핸들을 가져옵니다. 그런 다음, 해당 모듈 핸들과 함수 서수 615를 사용하여 GetProcAddress 를 호출하여 이 함수의 주소를 가져옵니다.

pfnThreadProcpfnCallback에서 가리키는 함수는 다음 형식을 사용해야 합니다.

DWORD WINAPI ThreadProc(LPVOID pData)
{
    ...
}

함수 이름은 임의입니다. pData 매개 변수는 초기화 정보가 있는 애플리케이션 정의 데이터 구조를 가리킵니다.

예제

다음 코드 예제에서는 서수로 SHCreateThreadWithHandle 을 호출하기 위한 함수 포인터 프로토타입 typedef를 제공하고 이러한 호출을 수행하는 방법을 보여줍니다.

// Define SHCREATETHREADWITHHANDLE as a function pointer to SHCreateThreadWithHandle.
typedef BOOL (STDMETHODCALLTYPE *SHCREATETHREADWITHHANDLE)(LPTHREAD_START_ROUTINE, 
                                                           void *, 
                                                           DWORD, 
                                                           LPTHREAD_START_ROUTINE, 
                                                           HANDLE *);

// CallSHCreateThreadWithHandle is an example function that:
// 1. Accepts parameters for the SHCreateThreadWithHandle function.
// 2. Loads Shlwapi.dll, which implements SHCreateThreadWithHandle.
// 3. Obtains the address of SHCreateThreadWithHandle in the loaded library.
// 4. Calls SHCreateThreadWithHandle through a SHCREATETHREADWITHHANDLE function pointer.

BOOL CallSHCreateThreadWithHandle(LPTHREAD_START_ROUTINE pfnThreadProc, 
                                  void *pData,
                                  DWORD dwFlags, 
                                  LPTHREAD_START_ROUTINE pfnCallback, 
                                  HANDLE *pHandle)
{
    // Build a string that contains the local path to Shlwapi.dll.
    WCHAR szPath[MAX_PATH];
    GetSystemDirectory(szPath, ARRAYSIZE(szPath));  
    PathAppend(szPath, L"shlwapi.dll");

    // Attempt to load Shlwapi.dll.
    HMODULE hModule = LoadLibrary(szPath);

    HRESULT hr = hModule ? S_OK : HRESULT_FROM_WIN32(GetLastError());
    if (SUCCEEDED(hr)) 
    {
        // Shlwapi.dll is loaded. 
        // Before Windows 7, SHCreateThreadWithHandle must be accessed through 
        // its ordinal. The following commented lines are used for this.
        
        // Get the address of SHCreateThreadWithHandle through its ordinal value of 615.
        // SHCREATETHREADWITHHANDLE pfn =
        //     (SHCREATETHREADWITHHANDLE)GetProcAddress(hModule, MAKEINTRESOURCEA(615));
        //
        // hr = pfn ? S_OK : HRESULT_FROM_WIN32(GetLastError());
        //
        // if (SUCCEEDED(hr))
        // {
        //     // Call SHCreateThreadWithHandle through SHCREATETHREADWITHHANDLE.
        //     hr = pfn(pfnThreadProc, pData, dwFlags, pfnCallback, pHandle) 
        //               ? S_OK : HRESULT_FROM_WIN32(GetLastError());
        // }
        // FreeLibrary(hModule);
        
        hr = SHCreateThreadWithHandle(pfnThreadProc, pData, dwFlags, pfnCallback, pHandle) 
                       ? S_OK : HRESULT_FROM_WIN32(GetLastError());
    }
    return SUCCEEDED(hr);
}

요구 사항

   
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 shlwapi.h
라이브러리 Shlwapi.lib
DLL Shlwapi.dll(버전 6.0 이상)

추가 정보

GetLastError

GetProcAddress

GetSystemDirectory

HRESULT_FROM_WIN32

LoadLibrary