Aracılığıyla paylaş


İşlem oluşturma

CreateProcess işlevi, oluşturma işleminden bağımsız olarak çalışan yeni bir işlem oluşturur. Kolaylık olması için bu ilişkiye üst-alt ilişki adı verilir.

Aşağıdaki kodda bir işlemin nasıl oluşturulacağı gösterilmektedir.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

CreateProcess başarılı olursa, yeni işlemin ve birincil iş parçacığının tanıtıcılarını ve tanımlayıcılarını içeren bir PROCESS_INFORMATION yapısı döndürür. İş parçacığı ve işlem tanıtıcıları tam erişim haklarıyla oluşturulur, ancak güvenlik tanımlayıcıları belirtirseniz erişimi kısıtlayabilirsiniz. Bu tanıtıcılara artık ihtiyacınız kalmadığında, CloseHandle işlevini kullanarak bunları kapatın.

Ayrıca createProcessAsUser kullanarak veya CreateProcessWithLogonW işlevlerini bir işlem oluşturabilirsiniz. Bu işlevler, işlemin çalıştırıldığı kullanıcı hesabının güvenlik bağlamını belirtmenize olanak tanır.