Цитата(xvr @ 29.1.2012, 12:16) | Цитата(albertn @ 28.1.2012, 16:48 ) | Необходимо чтобы выполнение программ не влияло друг на друга и на сервис в целом. Как я понимаю, флаг CREATE_NEW_CONSOLE гарантирует это. |
Перебейте запускаемым программам все потоки ввода вывода (stdin/stdout/stderr), и они так же не будут влиять друг на друга и без CREATE_NEW_CONSOLE |
Выяснилась еще одна особенность, что при использовании CreateProcessAsUser для DOS программ без CREATE_NEW_CONSOLE вываливается ошибка "Неверный дескриптор." при перенаправлении. Тут я уже не знаю что делать :(
Приведу фрагмент кода, на котором происходит ошибка:
Код | #include <windows.h> #include <stdio.h>
char* getErrorDescription(int error) { char *buf = 0; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buf, 0, NULL); char* res = strdup(buf); LocalFree(buf); return res; }
int main() { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.lpDesktop = TEXT(""); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;; si.wShowWindow = SW_HIDE; HANDLE hFile = CreateFile ("c:\\output.txt", GENERIC_WRITE, FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, 0, NULL); si.hStdOutput = hFile; si.hStdError = hFile; PROCESS_INFORMATION pi; memset(&pi, 0, sizeof(PROCESS_INFORMATION)); HANDLE hUser; if (!LogonUser("user",TEXT("."),"password",LOGON32_LOGON_BATCH,LOGON32_PROVIDER_DEFAULT,&hUser)) { printf("Login error %s\n",getErrorDescription(GetLastError())); return 0; } BOOL create_ok; create_ok = CreateProcessAsUser(hUser,NULL,"C:\\1.exe",NULL,NULL,TRUE,CREATE_SEPARATE_WOW_VDM/* | CREATE_NEW_CONSOLE*/,NULL,"C:\\",&si,&pi); if (!create_ok) { printf("Run error %s\n",getErrorDescription(GetLastError())); return 0; } WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(hFile); CloseHandle(hUser); }
|
Может все-же дело в XP?
Добавлено через 2 минуты и 23 секунды
Цитата(Dem_max @ 29.1.2012, 09:19) | Попробуй без этого флага, но используй функции AllocConsole, AttachConsole |
Это не решит проблему. |