این تابع یک API ویندوز میباشد و برای اجرا کردن فایل اجرایی از Hard میباشد .
این تابع در ویندز XP و Server 2003 بعد از آنها قابل استفاده میباشد و در Kernel32.dll موجود است .

BOOL WINAPI CreateProcess(
  LPCTSTR               lpApplicationName,
  LPTSTR                lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCTSTR               lpCurrentDirectory,
  LPSTARTUPINFO         lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

توضیح آرگمان ها :
lpApplicationName :
نام فایل اجرایی میباشد .
lpCommandLine :
پارامترهای ارسالی به پروسس از خط فرمان میباشد .
توجه : برای ارسال آرگمان دوم این تابع بهتر است همیشه مقدار آن در بافری ذخیره گردد و بافر را به تابع فرستاد . زیرا به طور پیشفرض آرگمان دوم بصورت خواندنی و نوشتنی میباشد ، در صورتی که آرگمان دوم بصورت یه رشته به صورت مستقیم فرستاده شود بصورت فقط خواندنی میشود که خلاف استاندارد این تابع میباشد .

نام و آدرس فایل را میتوان با این آرگمان ارسال کرد .
این تابع به ترتیب در قسمت های زیر به دنبال فایل اجرایی میگردد :
پوشه ای که شامل فایل .exe پروسس والد است .
فولدر جاری پروسس والد .
پوشه سیستمی ویندوز (system32) .
پوشه ویندوز (c:\Windows) .
پوشه هایی که در متغیر های محیطی PATH میباشد .
اگر مسیر کامل به آن داده شود در آن پوشه سرچ میکند.

ملاحظه امنیتی در مدل فراخوانی یک پروسس :
برای اجرا کردن یه پراسس درون پراسس والد بهتر است از مدل ارائه شده در مثال استفاده کرد (به مدل استرینگ ارسالی به آرگمان دوم توجه کنید) .

dwCreationFlags :
شامل پرچم هایی است که بر نحوه ایجاد پروسس تاثیر گذار است . میتوان چندین پرچم را با هم OR بیتی کرد .
بعضی از پرچرم های پر کار برد عبارتند از :
1 -DEBUG_PROCESS : این پرچم به سیستم میگوید که پروسس والد قصد دیباگ پروسس فرزند را دارد ( و همینطور پروسسهایی که توسط فرزند ایجاد میگردند ) .
2- DEBUG_ONLY_THIS_PROCESS : همانند مدل اول میباشد ، با این تفاوت که پروسس هایی که توسط پروسس فرزند ایجاد میگردد در حالت دیباگ قرار نمیگیرند .
3-CREATE_SUSPENDED : باعث میگردد که پروسس ایجاد شود ، اما Thread اولیه آن به حالت تعلیق در بیاید این کار برای اعمال تغییرات به روی Thread ، یا فضای آدرس حافظه ی پروسس فرزند میباشد . بعد از اتمام کار میتوان با فراخوانی تابع ResumeThread آن را از حالت تعلیق خارج کرد .
پرچم هایی برای اولویت بندی :
1_IDLE_PRIORITY_CLASS : بیکار (idle)
2_ELOW_NORMAL_PRIORITY_CLASS : پایینتر از حد طبیعی (below normal)
3_NORMAL_PRIORITY_CLASS :طبیعی(normal)
4_ABOVE_NORMAL_PRIORITY_CLASS : بالا تر از حد طبیعی (above normal)
5_HIGH_PRIORITY_CLASS : بالا (high)
6_REALTIME_PRIORITY_CLASS : بی درنگ (realtime)

   برنامه نمونه :

#include <Windows.h>
#include <iostream>


int main()
{
BOOL B = FALSE;
TCHAR szCommandLine[]=TEXT("\"C:\\calc.exe\" -L -S");
STARTUPINFO si;
PROCESS_INFORMATION pi;

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

B = CreateProcess(NULL, szCommandLine, NULL, NULL,
FALSE, 0, NULL, NULL, &si, &pi);

if (B == TRUE)
{
std::cout << "Running ... \n";
}
else
{
std::cout << "CreateProcess failed \n";
}
system("pause");
return 0;
}