problem beim senden eines "auftrages" an die cmd.exe über writepipe
-
hi
ich habe eine pipe erzeugt und mit dieser die cmd.exe als childprocess aufgerufen
nun sende ich ihr als reaktion auf einen mausklick folgendes!
case WM_LBUTTONDOWN: WriteFile(newwrite,"regedit\r\n",9,&bio2,NULL);daraufhin sehe ich zwar im taskmanager die regedit.exe, aber auf dem bildschirm noch nicht
wenn ich dann nochmal die mausdrücke erscheint eine regedit doch ich habe dann 2 im taskmanager, ich schließe die erschienene und eine bleibt übrig(niht zu sehen)
beende ich dann mein programm, dann erscheint "endlich" auch die nun zweite regedit
woran könnte das liegen??
muss ich nach writefile noch irgend was machen???
danke + cu
error
ps: befehle wir dir oder auch consolenprogramme wie ping funktionieren sofort(sehe ich, wenn ich die ausgabe auslese)
-
hi, noch ein versuch

ich bekomms nicht hin ... woran könnte es liegen??
hier mal etwas testcode, vielleicht hilfts ja?!:
#include <windows.h> #include <process.h> #define ID_EDIT 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); TCHAR szAppName[] = TEXT ("PopPad1") ; LPTSTR comandline; LPTSTR *test; int *pNumArgs; unsigned long bio; //bytes in/out unsigned long bio2; unsigned long exitcode=0; unsigned long avail; static HWND hwndEdit; TCHAR buf[10000]; //in buffer /*const */TCHAR buffer[6]="dir\r\n"; //out buffer /*const */TCHAR buffer2[1024];//="ping zimmer2\r\n"; STARTUPINFO si; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi; HANDLE read, newread, write, newwrite; //pipe handles // Global variable CRITICAL_SECTION CriticalSection; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { comandline=szCmdLine; /*int nArgs; comandline=GetCommandLine(); test = CommandLineToArgvW(comandline, &nArgs); if( NULL == test ) { MessageBox (NULL, TEXT ("Fehler"), szAppName, 0) ; return 0; } comandline+=lstrlen(test[0])+3; MessageBox (NULL, comandline, szAppName, 0) ;*/ HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; InitializeCriticalSection(&CriticalSection); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } DeleteCriticalSection(&CriticalSection); return (int) msg.wParam ; } void ThreadProc(PVOID pParam) { while(true) { WaitForSingleObject(pi.hProcess,true); PeekNamedPipe(newread,buf,10000,NULL,&avail,NULL); if(avail!=0) { RtlZeroMemory(&buf,10000); //Hier darf uns nichts zwischen funken! EnterCriticalSection(&CriticalSection); ReadFile(newread,buf,10000,&bio,NULL); SendMessage(hwndEdit,EM_SETSEL,-1,0); SendMessage(hwndEdit,EM_REPLACESEL,FALSE,(LPARAM)buf); //ok, jetzt kann jemand anderes übernehmen LeaveCriticalSection(&CriticalSection); } } } LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static LRESULT lResult; switch(message) {//dir funzt sofort, regedit oder ähnliches nicht!??(erst nach erneutem senden) warum case WM_RBUTTONDOWN: WriteFile(newwrite,"regedit\r\n",9,&bio2,NULL); return 0 ; case WM_LBUTTONDOWN://funktioniert ohne probleme WriteFile(newwrite,"ping\r\n",6,&bio2,NULL); return 0 ;//statt ping könnte man auch dir oder so machen case WM_CREATE : hwndEdit = CreateWindow (TEXT ("edit"), NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 0, 0, hWnd, (HMENU) ID_EDIT,((LPCREATESTRUCT) lParam) -> hInstance, NULL) ; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = true; //allow inheritable handles //Pipe to read from Child if(!CreatePipe(&newread,&read,&sa,0)) { MessageBox(hWnd,TEXT("CreatePipe"),TEXT("FEHLER"),0); CloseHandle(read); CloseHandle(newread); return -1; } //Pipe to write to Child if(!CreatePipe(&write,&newwrite,&sa,0)) { MessageBox(hWnd,TEXT("CreatePipe"),TEXT("FEHLER"),0); CloseHandle(write); CloseHandle(newwrite); return -1; } si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdOutput= read; si.hStdError=read; si.hStdInput=write; si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; //spawn the child process if (!CreateProcess(NULL,comandline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) { MessageBox(hWnd,TEXT("CreateProcess"),TEXT("FEHLER"),0); CloseHandle(read); CloseHandle(newread); CloseHandle(write); CloseHandle(newwrite); return -1; } //not needed CloseHandle(write); CloseHandle(read); _beginthread(ThreadProc,0, NULL); return 0 ; case WM_SETFOCUS : SetFocus (hwndEdit) ; return 0 ; case WM_SIZE : MoveWindow (hwndEdit, 0, 0, 600, 500, TRUE) ; return 0 ; case WM_DESTROY : //clean up some stuff TerminateProcess(pi.hProcess,0); CloseHandle(newread); CloseHandle(newwrite); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hWnd, message, wParam, lParam) ; }bitte nichts stilistisches beanstanden
soll ein reines testprogramm sein!!das problem tritt bei WM_RBUTTONDOWN auf, rechtsklick irgend wo im rechten bereich des festers...
man sollte, nachdem das prompt nach dem start ausgegeben wurde, alles löschen und zb durch "regedit"
achja, als komandozeilenparameter bitte "cmd"
ich danke für eventuelle mühen
mfg
error