Fonction SHCreateThreadWithHandle (shlwapi.h)

Crée un thread et récupère son handle.

Syntaxe

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

Paramètres

[in] pfnThreadProc

Type : LPTHREAD_START_ROUTINE

Pointeur vers une fonction définie par l’application de type LPTHREAD_START_ROUTINE. Si un nouveau thread a été créé avec succès, cette fonction définie par l’application est appelée dans le contexte de ce thread. SHCreateThreadWithHandle n’attend pas que la fonction pointée vers pfnThreadProc se termine avant de revenir à son appelant. La valeur de retour de la fonction spécifiée par pfnThreadProc est le code de sortie du thread.

[in, optional] pData

Type : void*

Pointeur vers une structure de données facultative définie par l’application qui contient des données d’initialisation. Il est passé à la fonction pointée vers pfnThreadProc et, éventuellement, à la fonction pointée vers par pfnCallback.

[in] flags

Type : SHCT_FLAGS

Indicateurs qui contrôlent le comportement de la fonction ; une ou plusieurs constantes CTF .

[in, optional] pfnCallback

Type : LPTHREAD_START_ROUTINE

Pointeur vers une fonction facultative définie par l’application de type LPTHREAD_START_ROUTINE. Cette fonction est appelée dans le contexte du thread créé avant que la fonction pointée par pfnThreadProc ne soit appelée. Il recevra également pData comme argument. SHCreateThreadWithHandle attend que la fonction pointée par pfnCallback se termine avant de revenir à son appelant. La valeur de retour de la fonction spécifiée par pfnCallback est ignorée.

[out, optional] pHandle

Type : HANDLE*

Pointeur vers le HANDLE du thread créé. Lorsqu’il n’est plus nécessaire, ce handle doit être fermé en appelant la fonction CloseHandle . Cette valeur peut être NULL.

Valeur retournée

Type : BOOL

TRUE si le thread a été créé ; sinon, FALSE

Remarques

Avant Windows 7, cette fonction n’avait pas d’en-tête ou de fichier de bibliothèque associé. Pour utiliser cette fonction sous ces systèmes d’exploitation antérieurs, appelez LoadLibrary avec le nom de DLL (Shlwapi.dll) pour obtenir un handle de module. Ensuite, appelez GetProcAddress avec ce handle de module et un ordinal de fonction de 615 pour obtenir l’adresse de cette fonction.

La fonction pointée vers par pfnThreadProc et pfnCallback doit prendre la forme suivante.

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

Le nom de la fonction est arbitraire. Le paramètre pData pointe vers une structure de données définie par l’application avec des informations d’initialisation.

Exemples

L’exemple de code suivant fournit un prototype de pointeur de fonction typedef pour appeler SHCreateThreadWithHandle par ordinal et montre comment effectuer un tel appel.

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

Configuration requise

   
Client minimal pris en charge Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau uniquement]
Plateforme cible Windows
En-tête shlwapi.h
Bibliothèque Shlwapi.lib
DLL Shlwapi.dll (version 6.0 ou ultérieure)

Voir aussi

Obtenir la dernière erreur

GetProcAddress

GetSystemDirectory

HRESULT_FROM_WIN32

LoadLibrary