![]() |
Re: anderes Programm beenden
Kann ich dir leider nichts sagen, da ich keine Adobe Produkte außer Acrobat Reader installiert habe.
Aber über EnumWindows und GetClassName kannst du dir selber eine Liste erstellen und guckst einfach nach. Oder du benutzt ein Tool wie Microsoft Spy++, Borland WinSight32 oder halt X-Spy von Motzi oder WinSpy von toms. Die Tools von toms und Motzi findest du hier im Forum. |
Re: anderes Programm beenden
alles klar! Danke!
|
AW: anderes Programm beenden
Hallo zusammen,
ich hatte ein ähnliches Problem und mir den Codes aus Beitrag 7 ( ![]()
Delphi-Quellcode:
Kann ich dabei den Grund irgendwie lokalisieren? Ich vermute das die Funktion hier irgendwie auf einen Fehler läuft.
EnumWindows(@EnumWindowsProc, LPARAM(List));
//--> function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; begin TList(lParam).Add(Pointer(hWnd)); Result := True; end; Hier die einzelnen Codes von "mir":
Delphi-Quellcode:
Kann das durch meine Umstellung des Programms auf 64Bit kommen?
//...global private
private { Private-Deklarationen } AppPID : DWORD; //...Programm (als bestimmter Nutzer) starten function TTools.CreateProcessAsLogon(const User, PW, Application, param, CmdLine: WideString): DWORD; var s : WideString; si : TStartupInfoW; pif : TProcessInformation; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; if CmdLine = '' then s := Application else s := Application + ' "' + CmdLine + '"'; SetLastError(0); SI.cb := SizeOf(TStartupInfo); if CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(s), CREATE_DEFAULT_ERROR_MODE, nil, PChar(param), @si, @pif) then begin AppPID := PIf.dwProcessId; CloseHandle(PIf.hProcess); CloseHandle(PIf.hThread); end; Result := GetLastError; end; //...gestartetes Programm beenden procedure TTools.EscapeClick(Sender: TObject); function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; begin TList(lParam).Add(Pointer(hWnd)); Result := True; end; var List : TList; I, answer : Integer; ProcessId : DWORD; ThreadId : DWORD; ProcessHandle: THandle; ExitCode : DWORD; begin if Instant.Enabled = true then begin answer := messagedlg('Wollen sie wirklich abbrechen?', mtConfirmation, [mbYes,mbNo], 0); if answer = mrYes then begin if AppPID <> 0 then begin List := TList.Create; try EnumWindows(@EnumWindowsProc, LPARAM(List)); //<---Hier kommt die Zugriffsverletzung for I := 0 to List.Count - 1 do begin ThreadId := GetWindowThreadProcessId(HWND(List.Items[I]), ProcessId); if ProcessId = AppPID then begin if IsWindow(HWND(List.Items[I])) then begin PostThreadMessage(ThreadId, WM_QUIT, 0, 0); ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId); if ProcessHandle <> 0 then begin GetExitCodeProcess(ProcessHandle, ExitCode); TerminateProcess(ProcessHandle, ExitCode); CloseHandle(ProcessHandle); end; end; Break; end; end; finally List.Free; end; end; //Log schreiben Logging(PfadP + Programs.items[Programs.itemindex] + ' wurde abgebrochen!'); answer := messagedlg('Wollen sie die bisherigen Daten einlesen?', mtConfirmation, [mbYes,mbNo], 0); if answer = mrYes then begin FertigClick(Sender); end; AppPID := 0; Progress.Animate := False; Run.Enabled := False; Programs.Enabled := True; Data.Enabled := True; TxTLogs.Enabled := True; Escape.Enabled := False; LogL.Hide; LogA.Hide; Timer3.Enabled := False; Instant.Enabled := False; Kopieren.Enabled := True; FilialeC.Enabled := True; BezirkS.Enabled := True; FilialenPS.Enabled := True; Manuell.Enabled := True; Last.Enabled := True; end; end else begin Progress.Animate := False; Run.Enabled := False; Programs.Enabled := True; Data.Enabled := True; TxTLogs.Enabled := True; Escape.Enabled := False; LogL.Hide; LogA.Hide; Timer3.Enabled := False; Instant.Enabled := False; Kopieren.Enabled := True; FilialeC.Enabled := True; BezirkS.Enabled := True; FilialenPS.Enabled := True; Manuell.Enabled := True; Last.Enabled := True; Watch.Stop; watch.Destroy; end; end; Edit: Wenn ich es als 32-Bit kompiliere funktioniert es einwandfrei. Wie kann ich den Teil für 64Bit ändern? |
AW: anderes Programm beenden
Zitat:
Delphi-Quellcode:
Du kannst keine nested procedure als callback für eine API-Funktion verwenden, Du mußt die EnumWindowsProc aus der Methode herausnehmen und als eigenständige Funktion implementieren. Nested procedures erfordern einen besondere struktur des callstacks, damit sie auf die parameter und lokalen variabled der umgebenden Procedure zugreifen können. Damit sind sie nicht kompatibel mit einem API callback.
procedure TTools.EscapeClick(Sender: TObject);
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; begin TList(lParam).Add(Pointer(hWnd)); Result := True; end; |
AW: anderes Programm beenden
Ok, habs.
Aber warum macht er das in 64-Bit anders? Ist das etwas was man generell wissen sollte oder einfach Willkür? |
AW: anderes Programm beenden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz