WaitForSingleObject appears to fail
BlitzMax Forums/BlitzMax Programming/WaitForSingleObject appears to fail
| ||
I've written a quick function to wait for a process to end, given part of it's name. Looks like this:Const SYNCHRONIZE:Int = 1048576 Const STANDARD_RIGHTS_REQUIRED:Int = 983040 Const INFINITE:Int = $FFFF Extern "Win32" Function WinExec(lpCmdLine:Byte Ptr,nCmdShow:Int)="WinExec@8" Function GetTickCount:Int()="GetTickCount@0" Function CreateToolhelp32Snapshot:Int(lFlags:Int, lProcessID:Int) Function Process32First(hSnapShot:Int, uProcess:Byte Ptr) Function Process32Next(hSnapShot:Int, uProcess:Byte Ptr) Function EnumWindows(lpEnumProc:Byte Ptr, lParam:Int) Function GetWindowThreadProcessId:Int(HWnd:Int, lpdwProcessID:Int Ptr) Function CloseWindow:Int(hWnd:Int) Function GetWindowText:Int(hWnd:Int, lpString:Byte Ptr, nMaxCount:Int) = "GetWindowTextA@12" Function TerminateProcess:Int(processhandle:Int, exitcode:Int) Function GetClassName(hWnd:Int, clString:Byte Ptr, nMaxCount:Int) = "GetClassNameA@12" Function SetWindowLong:Int(hwnd:Int,index:Int,value:Int)="SetWindowLongA@12" Function GetWindowLong:Int(hWnd:Int, index:Int)="GetWindowLongA@8" Function WaitForSingleObject:Int(hHandle:Int, dwMilliseconds:Int) Function OpenProcess:Int(dwDesiredAccess:Int, bInheritHandle:Int, dwProcessId:Int) Function CloseHandle:Int(hObject:Int) End Extern Function WaitProcessEx:Int(ProcessName:String) Local Result:Int = False Local ProcessID:Int Local hProcess:Int ProcessID = FindProcessEx(ProcessName) hProcess = OpenProcess(SYNCHRONIZE, False, ProcessID) Notify "Process handle of " + ProcessName + "(" + String.FromInt(ProcessID) + ") = " + String.FromInt(hProcess) WaitForSingleObject(hProcess, INFINITE) CloseHandle(hProcess) End Function Function FindProcessEx:Int(ProcessName:String) ' Return process ID, or true if no id available on the platform but process is running Local Result:Int = 0 ProcessName = ProcessName.ToUpper() Local p:PROCESSENTRY32 Local h:Int p:PROCESSENTRY32 = New PROCESSENTRY32 p.dwSize = SizeOf(processentry32) h:Int = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) Process32First(h,p) While Process32Next(h,p) If String.FromCString(Varptr p.szExeFile).ToUpper().Find(ProcessName) > -1 Then 'Notify "Process " + ProcessName + " found as " + String.FromCString(Varptr p.szExeFile).ToUpper() Result = p.th32ProcessID Exit End If Wend CloseHandle(h) Return Result End Function The FindProcessEx() function works just fine, but for some reason WaitForSingleObject() seems to be returning immediately. Does anyone know more about this and can tell me what I'm doing wrong? EDIT: Figured out what I was doing wrong, the call to OpenProcess() had the wrong security constant, I was using STANDARD_RIGHTS_REQUIRED when it requires SYNCHRONIZE. Fixed it in the code above. I hope someone finds the (corrected) code useful. |