Поделиться через


Функция 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. Если новый поток был успешно создан, эта определяемая приложением функция вызывается в контексте этого потока. SHCreateThreadWithHandle не дожидается завершения функции, на которую указывает pfnThreadProc , прежде чем вернуться к вызывающей. Возвращаемое значение для функции, указанной pfnThreadProc , представляет собой код выхода потока.

[in, optional] pData

Тип: void*

Указатель на дополнительную структуру данных, определяемую приложением, которая содержит данные инициализации. Он передается в функцию, на которую указывает pfnThreadProc , и, при необходимости, в функцию, на которую указывает pfnCallback.

[in] flags

Тип: SHCT_FLAGS

Флаги, управляющие поведением функции; одна или несколько констант CTF .

[in, optional] pfnCallback

Тип: LPTHREAD_START_ROUTINE

Указатель на необязательную определяемую приложением функцию типа LPTHREAD_START_ROUTINE. Эта функция вызывается в контексте созданного потока перед вызовом функции, на которую указывает pfnThreadProc . Он также получит pData в качестве аргумента. SHCreateThreadWithHandle ожидает завершения функции, на которую указывает pfnCallback , прежде чем вернуться к вызывающей. Возвращаемое значение для функции, указанной pfnCallback , игнорируется.

[out, optional] pHandle

Тип: HANDLE*

Указатель на HANDLE созданного потока. Если он больше не нужен, этот дескриптор следует закрыть, вызвав функцию CloseHandle . Это значение может иметь значение NULL.

Возвращаемое значение

Тип: BOOL

Значение TRUE , если поток успешно создан; в противном случае — FALSE

Комментарии

До Windows 7 у этой функции не было связанного файла заголовка или библиотеки. Чтобы использовать эту функцию в предыдущих операционных системах, вызовите LoadLibrary с именем DLL (Shlwapi.dll), чтобы получить дескриптор модуля. Затем вызовите GetProcAddress с этим дескриптором модуля и порядком функции 615, чтобы получить адрес этой функции.

Функция, на которую указывают pfnThreadProc и pfnCallback , должна иметь следующую форму.

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

Имя функции является произвольным. Параметр pData указывает на определяемую приложением структуру данных со сведениями об инициализации.

Примеры

В следующем примере кода представлено определение типа прототипа указателя функции для вызова SHCreateThreadWithHandle по порядковой номеру и показано, как выполнить такой вызов.

// 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
Header shlwapi.h
Библиотека Shlwapi.lib
DLL Shlwapi.dll (версия 6.0 или более поздняя)

См. также раздел

Getlasterror

Функция GetProcAddress

GetSystemDirectory

HRESULT_FROM_WIN32

LoadLibrary