Compartilhar via


Função SHCreateThreadWithHandle (shlwapi.h)

Cria um novo thread e recupera seu identificador.

Sintaxe

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
);

Parâmetros

[in] pfnThreadProc

Tipo: LPTHREAD_START_ROUTINE

Um ponteiro para uma função definida pelo aplicativo do tipo LPTHREAD_START_ROUTINE. Se um novo thread tiver sido criado com êxito, essa função definida pelo aplicativo será chamada no contexto desse thread. SHCreateThreadWithHandle não aguarda a função apontada por pfnThreadProc ser concluída antes de retornar ao chamador. O valor retornado para a função especificada por pfnThreadProc é o código de saída do thread.

[in, optional] pData

Tipo: void*

Um ponteiro para uma estrutura de dados opcional definida pelo aplicativo que contém dados de inicialização. Ele é passado para a função apontada por pfnThreadProc e, opcionalmente, a função apontada por pfnCallback.

[in] flags

Tipo: SHCT_FLAGS

Sinalizadores que controlam o comportamento da função; uma ou mais das constantes CTF .

[in, optional] pfnCallback

Tipo: LPTHREAD_START_ROUTINE

Um ponteiro para uma função opcional definida pelo aplicativo do tipo LPTHREAD_START_ROUTINE. Essa função é chamada no contexto do thread criado antes que a função apontada por pfnThreadProc seja chamada. Ele também receberá pData como seu argumento. SHCreateThreadWithHandle aguarda a função apontada por pfnCallback ser concluída antes de retornar ao chamador. O valor retornado para a função especificada por pfnCallback é ignorado.

[out, optional] pHandle

Tipo: HANDLE*

Um ponteiro para o HANDLE do thread criado. Quando não for mais necessário, esse identificador deverá ser fechado chamando a função CloseHandle . Esse valor pode ser NULL.

Valor retornado

Tipo: BOOL

TRUE se o thread for criado com êxito; caso contrário, FALSE

Comentários

Antes do Windows 7, essa função não tinha um arquivo de cabeçalho ou biblioteca associado. Para usar essa função nesses sistemas operacionais anteriores, chame LoadLibrary com o nome DLL (Shlwapi.dll) para obter um identificador de módulo. Em seguida, chame GetProcAddress com esse identificador de módulo e um ordinal de função de 615 para obter o endereço dessa função.

A função apontada por pfnThreadProc e pfnCallback deve assumir o seguinte formato.

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

O nome da função é arbitrário. O parâmetro pData aponta para uma estrutura de dados definida pelo aplicativo com informações de inicialização.

Exemplos

O exemplo de código a seguir fornece um typedef de protótipo de ponteiro de função para chamar SHCreateThreadWithHandle por ordinal e mostra como realizar essa chamada.

// 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);
}

Requisitos

   
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho shlwapi.h
Biblioteca Shlwapi.lib
DLL Shlwapi.dll (versão 6.0 ou posterior)

Confira também

Obter Último Erro

GetProcAddress

Getsystemdirectory

HRESULT_FROM_WIN32

LoadLibrary