program launcher
integer, parameter:: BOOL = 4, POINTER_LEN = 4, DWORD = 4, HANDLE = 4
integer, parameter:: WORD = 4
integer, parameter:: LPVOID = POINTER_LEN, LPSTR = POINTER_LEN
integer, parameter:: LPBYTE = POINTER_LEN, LPCSTR = POINTER_LEN
integer (LPCSTR), parameter:: NULL = 0
TYPE T_PROCESS_INFORMATION
SEQUENCE
integer(HANDLE) hProcess ! knowns HANDLE
integer(HANDLE) hThread ! knowns HANDLE
integer(DWORD) dwProcessId ! knowns DWORD
integer(DWORD) dwThreadId ! knowns DWORD
END TYPE
TYPE T_STARTUPINFO
SEQUENCE
integer(DWORD) cb ! knowns DWORD
integer(LPSTR) lpReserved ! knowns LPSTR
integer(LPSTR) lpDesktop ! knowns LPSTR
integer(LPSTR) lpTitle ! knowns LPSTR
integer(DWORD) dwX ! knowns DWORD
integer(DWORD) dwY ! knowns DWORD
integer(DWORD) dwXSize ! knowns DWORD
integer(DWORD) dwYSize ! knowns DWORD
integer(DWORD) dwXCountChars ! knowns DWORD
integer(DWORD) dwYCountChars ! knowns DWORD
integer(DWORD) dwFillAttribute ! knowns DWORD
integer(DWORD) dwFlags ! knowns DWORD
integer(WORD) wShowWindow ! knowns WORD
integer(WORD) cbReserved2 ! knowns WORD
integer(LPBYTE) lpReserved2 ! knowns LPBYTE
integer(HANDLE) hStdInput ! knowns HANDLE
integer(HANDLE) hStdOutput ! knowns HANDLE
integer(HANDLE) hStdError ! knowns HANDLE
END TYPE
interface
function CreateProcess ( &
lpApplicationName, &
lpCommandLine, &
lpProcessAttributes, &
lpThreadAttributes, &
bInheritHandles, &
dwCreationFlags, &
lpEnvironment, &
lpCurrentDirectory, &
lpStartupInfo, &
lpProcessInformation) &
bind(C,name='CreateProcessA@40')
import
integer:: CreateProcess
integer (LPCSTR) lpApplicationName ! LPCSTR lpApplicationName
character*(*) lpCommandLine ! LPSTR lpCommandLine
integer (POINTER_LEN):: LP_PROCESS_ATTRIBUTES
integer (POINTER_LEN):: LP_SECURITY_ATTRIBUTES
integer(BOOL) bInheritHandles ! BOOL bInheritHandles
integer(DWORD) dwCreationFlags ! DWORD dwCreationFlags
integer(LPVOID) lpEnvironment ! LPVOID lpEnvironment
integer(LPCSTR) lpCurrentDirectory ! LPCSTR lpCurrentDirectory
TYPE (T_STARTUPINFO), pointer:: lpStartupInfo
TYPE (T_PROCESS_INFORMATION):: lpProcessInformation
end function
function GetLastError () &
bind (C, name='GetLastError@0')
import
integer (DWORD):: GetLastError
end function
end interface
TYPE (T_STARTUPINFO):: si
TYPE (T_PROCESS_INFORMATION):: pi
integer zero(18)
integer launched, err
zero = 0
si = transfer (zero, si)
si%CB = 68 ! sizeof(si) returns 72 so you need to do some packing
print *, 'Size of si ', si%CB
pi = transfer (zero, pi)
launched = CreateProcess ( &
NULL, & ! app name
'c:\\windows\\system32\\notepad.exe', & ! command line string
0, & ! process attr
0, & ! thread attr
0, & ! inherit handles
0, & ! creation flags
0, & ! environment
NULL, & ! current directory
si, & ! startup info
pi) ! process info
print *, 'Result is ', launched
err = GetLastError ()
print *, 'Last error ', err
print *, '87 means incorrect parameter'
print *, 'Process Handle ', pi%hProcess
print *, 'Process thread ', pi%hThread
print *, 'Process id ', pi%dwProcessId
print *, 'Thread id ', pi%dwThreadId
stop
end