The problem is in the lpCommandLine parameter. I suspect you are doing something like this:
var CmdLine: string; ... CmdLine := 'notepad.exe'; CreateProcess(nil, PChar(CmdLine), ...)
This results in an access violation because CmdLine is not writeable memory. The string is a constant string stored in read-only memory.
Instead you can do this:
CmdLine := 'notepad.exe'; UniqueString(CmdLine); CreateProcess(nil, PChar(CmdLine), ...)
This is enough to make CmdLine be backed by writeable memory.
It is not enough just to make the variable holding the string non-const, you need to make the memory that backs the string writeable too. When you assign a string literal to a string variable, the string variable points at read-only memory.
參考來源：Access Violation in function CreateProcess in Delphi 2009