I was trying to get Sean's StdoutToVar_CreateProcess working on x64 unicode ahkL. So far I was only successful with 32 bit unicode.
For 64 bit, I tried to change variable types and recalculated the struct positions, but the ReadFile function (step 11) still fails. Anybody has an idea what's wrong?
Script I use for testing:
Code:
sOutput:=StdoutToVar_CreateProcess(A_WinDir "\system32\ipconfig.exe")
Exitapp
StdoutToVar_CreateProcess(sCmd)
{
Success:=DllCall("CreatePipe", "Ptr*", hStdInRd
, "Ptr*", hStdInWr
, "Uint", 0
, "Uint", 0)
if Success=0
{
msgbox,Step 1 (CreatePipe)`nSuccess=%Success%
Return
}
Success:=DllCall("CreatePipe", "Ptr*", hStdOutRd
, "Ptr*", hStdOutWr
, "Uint", 0
, "Uint", 0)
if Success=0
{
msgbox,Step 2 (CreatePipe)`nSuccess=%Success%
Return
}
Success:=DllCall("SetHandleInformation", "Ptr", hStdInRd
, "Uint", 1
, "Uint", 1)
if Success=0
{
msgbox,Step 3 (SetHandleInformation)`nSuccess=%Success%
Return
}
Success:=DllCall("SetHandleInformation", "Ptr", hStdOutWr
, "Uint", 1
, "Uint", 1)
if Success=0
{
msgbox,Step 4 (SetHandleInformation)`nSuccess=%Success%
Return
}
VarSetCapacity(pi, 24, 0)
NumPut(VarSetCapacity(si,96,0), si, 0, "UInt")
NumPut(0x100 , si, 56, "UInt") ; DWORD Flags
NumPut(hStdInRd , si, 72, "UPtr") ; 64bit HANDLE StdInput
NumPut(hStdOutWr, si, 80, "UPtr") ; 64bit HANDLE StdOutput
NumPut(hStdOutWr, si, 88, "UPtr") ; 64bit HANDLE StdError
Success:=DllCall("CreateProcess", "Uint", 0
, "Ptr", &sCmd
, "Uint", 0
, "Uint", 0
, "int", True
, "Uint", 0x08000000
, "Uint", 0
, "Uint", 0
, "UPtr", &si
, "UPtr", &pi)
if Success=0
{
msgbox,Step 5 (CreateProcess)`nSuccess=%Success%
Return
}
Success:=DllCall("CloseHandle","UPtr",NumGet(pi,0,"UPtr"))
if Success=0
{
msgbox,Step 6 (CloseHandle)`nSuccess=%Success%
Return
}
Success:=DllCall("CloseHandle","UPtr",NumGet(pi,8,"UPtr"))
if Success=0
{
msgbox,Step 7 (CloseHandle)`nSuccess=%Success%
Return
}
Success:=DllCall("CloseHandle","UPtr",hStdOutWr)
if Success=0
{
msgbox,Step 8 (CloseHandle)`nSuccess=%Success%
Return
}
Success:=DllCall("CloseHandle","UPtr",hStdInRd)
if Success=0
{
msgbox,Step 9 (CloseHandle)`nSuccess=%Success%
Return
}
Success:=DllCall("CloseHandle","UPtr",hStdInWr)
if Success=0
{
msgbox,Step 10 (CloseHandle)`nSuccess=%Success%
Return
}
VarSetCapacity(sTemp,4095)
nSize:=0
Success:=DllCall("ReadFile", "Ptr*", hStdOutRd
, "Uint", &sTemp
, "Uint", 4095
, "UintP", nSize
, "Uint", 0)
If Success
{
msgbox,Step 11`nSuccess=%Success%
NumPut(0,sTemp,nSize,"Uchar")
VarSetCapacity(sTemp,-1)
sOutput:=StrGet(&sTemp,nSize,"")
msgbox,%sOutput%
}
else
msgbox,Step 11 (ReadFile) failed
Success:=DllCall("CloseHandle", "Ptr", hStdOutRd)
if Success=0
{
msgbox,Step 12 (CloseHandle)`nSuccess=%Success%
Return
}
Return sOutput
}
I assumed 64 bit STARTUPINFO struct would look like this:
Code:
0 DWORD cb;-------------------
4 LPTSTR lpReserved; 8 Bytes
12 LPTSTR lpDesktop; 8 Bytes
20 LPTSTR lpTitle; 8 Bytes
28 DWORD dwX;
32 DWORD dwY;
36 DWORD dwXSize;
40 DWORD dwYSize;
44 DWORD dwXCountChars;
48 DWORD dwYCountChars;
52 DWORD dwFillAttribute;
56 DWORD dwFlags;--------------
60 WORD wShowWindow;
62 WORD cbReserved2;
64 LPBYTE lpReserved2; Lenght 8 bytes?
72 HANDLE hStdInput;------------8 Bytes
80 HANDLE hStdOutput;-----------8 Bytes
88 HANDLE hStdError;------------8 Bytes
96
and PROCESS_INFORMATION struct like this:
Code:
0 HANDLE hProcess; 8 Bytes
8 HANDLE hThread; 8 Bytes
16 DWORD dwProcessId;
20 DWORD dwThreadId;
24