The following example uses CreateProcess to launch calc.exe.
The call to CreateProcess in this program itself is non-blocking. so the message box doesn't wait for the calc application to close.
;;
;;File Name: launch.asm
;;
;;Assemble with
;; nasm -fwin32 launch.asm
;;
;;Link with
;; GoLink.exe /entry _main -o launch.obj kernel32.dll user32.dll
;;
;; The following definitions were taken from nagoa+.inc
;;
%define TRUE 1
%define FALSE 0
%define NULL 0
%define CREATE_NO_WINDOW 8000000h
%define MB_OK 0h
STRUC STARTUPINFO
.cb RESD 1
.lpReserved RESD 1
.lpDesktop RESD 1
.lpTitle RESD 1
.dwX RESD 1
.dwY RESD 1
.dwXSize RESD 1
.dwYSize RESD 1
.dwXCountChars RESD 1
.dwYCountChars RESD 1
.dwFillAttribute RESD 1
.dwFlags RESD 1
.wShowWindow RESW 1
.cbReserved2 RESW 1
.lpReserved2 RESD 1
.hStdInput RESD 1
.hStdOutput RESD 1
.hStdError RESD 1
ENDSTRUC
STRUC PROCESS_INFORMATION
.hProcess RESD 1
.hThread RESD 1
.dwProcessId RESD 1
.dwThreadId RESD 1
ENDSTRUC
extern CreateProcessA
extern ExitProcess
extern MessageBoxA
global _main
segment .data USE32
startinfo: ;;;;initialize STARTUPINFO hopefully zeroed!
istruc STARTUPINFO
iend
processinfo: ;;;;initialize PROCESS_INFORMATION hopefully zeroed!
istruc PROCESS_INFORMATION
iend
command: db "C:\\WINDOWS\\system32\\calc.exe",0
titlemsg: db "hello",0
infomsg: db "Calculator application launched.",0
segment .code USE32
_main: ;;entry point
push dword processinfo
push dword startinfo
push dword NULL
push dword NULL
push dword CREATE_NO_WINDOW
push dword FALSE
push dword NULL
push dword NULL
push dword command
push dword NULL
call CreateProcessA ;; launch calc.exe
push dword MB_OK
push dword titlemsg
push dword infomsg
push dword 0
call MessageBoxA ;;show a message box.
push dword 0
call ExitProcess ;; exit out