Bagikan melalui


Fungsi SHCreateThreadWithHandle (shlwapi.h)

Membuat utas baru dan mengambil handelnya.

Sintaks

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

Parameter

[in] pfnThreadProc

Jenis: LPTHREAD_START_ROUTINE

Penunjuk ke fungsi jenis LPTHREAD_START_ROUTINE yang ditentukan aplikasi. Jika utas baru berhasil dibuat, fungsi yang ditentukan aplikasi ini dipanggil dalam konteks utas tersebut. SHCreateThreadWithHandle tidak menunggu fungsi yang ditunjukkan oleh pfnThreadProc selesai sebelum kembali ke pemanggilnya. Nilai yang dikembalikan untuk fungsi yang ditentukan oleh pfnThreadProc adalah kode keluar dari utas.

[in, optional] pData

Jenis: void*

Penunjuk ke struktur data opsional yang ditentukan aplikasi yang berisi data inisialisasi. Ini diteruskan ke fungsi yang ditunjukkan oleh pfnThreadProc dan, secara opsional, fungsi yang ditunjukkan oleh pfnCallback.

[in] flags

Jenis: SHCT_FLAGS

Bendera yang mengontrol perilaku fungsi; satu atau beberapa konstanta CTF .

[in, optional] pfnCallback

Jenis: LPTHREAD_START_ROUTINE

Penunjuk ke fungsi jenis LPTHREAD_START_ROUTINE yang ditentukan aplikasi opsional. Fungsi ini dipanggil dalam konteks utas yang dibuat sebelum fungsi yang ditunjukkan oleh pfnThreadProc dipanggil. Ini juga akan menerima pData sebagai argumennya. SHCreateThreadWithHandle menunggu fungsi yang ditunjukkan oleh pfnCallback selesai sebelum kembali ke pemanggilnya. Nilai yang dikembalikan untuk fungsi yang ditentukan oleh pfnCallback diabaikan.

[out, optional] pHandle

Jenis: HANDLE*

Penunjuk ke HANDLE dari utas yang dibuat. Ketika tidak lagi diperlukan, handel ini harus ditutup dengan memanggil fungsi CloseHandle . Nilai ini bisa NULL.

Menampilkan nilai

Jenis: BOOL

TRUE jika utas berhasil dibuat; jika tidak, FALSE

Keterangan

Sebelum Windows 7, fungsi ini tidak memiliki file header atau pustaka terkait. Untuk menggunakan fungsi ini di bawah sistem operasi sebelumnya, panggil LoadLibrary dengan nama DLL (Shlwapi.dll) untuk mendapatkan handel modul. Kemudian panggil GetProcAddress dengan handel modul tersebut dan ordinal fungsi 615 untuk mendapatkan alamat fungsi ini.

Fungsi yang ditunjukkan oleh pfnThreadProc dan pfnCallback harus mengambil formulir berikut.

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

Nama fungsi bersifat arbitrer. Parameter pData menunjuk ke struktur data yang ditentukan aplikasi dengan informasi inisialisasi.

Contoh

Contoh kode berikut menyediakan typedef prototipe penunjuk fungsi untuk memanggil SHCreateThreadWithHandle berdasarkan ordinal dan menunjukkan cara menyelesaikan panggilan seperti itu.

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

Persyaratan

   
Klien minimum yang didukung Windows Vista [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 [hanya aplikasi desktop]
Target Platform Windows
Header shlwapi.h
Pustaka Shlwapi.lib
DLL Shlwapi.dll (versi 6.0 atau yang lebih baru)

Lihat juga

GetLastError

GetProcAddress

GetSystemDirectory

HRESULT_FROM_WIN32

LoadLibrary