Entwickler-Ecke

Windows API - ShellExecute mit ActionClients ruft die Proggz doppelt auf


Lui - Fr 17.01.03 20:10
Titel: ShellExecute mit ActionClients ruft die Proggz doppelt auf
Hallo,

sorry wenn ich mich hier in die falsche Sparte poste.

Hab ein kleines Problem.

Hab unter Delphi6 ein progg gemacht was Standartproggz wie Browser, Suchen, "tolle Spiele",usw. über ShellExecute ausführt.

Jetzt unter Delphi7 werden die proggz beim anklicken des entsprechenden buttons doppelt ausgeführt. Es sollte sich aber nur einmal öffnen, wieso macht es das denn auf einmal nicht mehr?

Über eine Antwort wäre ich sehr dankbar!

Hier noch ein "code-Stück":


Quelltext
1:
2:
3:
4:
procedure TForm1.Action15Execute(Sender: TObject);
begin
 ShellExecute(Application.Handle, 'open' ,PChar('explorer.exe'), nil, PChar('C:\WINNT'), sw_ShowNormal);
end;


Raphael O. - Sa 18.01.03 01:10

müsste eigentlich funktionieren...

mach mal das "Pchar" immer weg...

könntest auch folgende Prozedur verwenden:

Quelltext
1:
WinExec('C:\MeinPfad\MeinProgramm.exe', 0);                    


Fiji-Fighter


Lui - Sa 18.01.03 01:43
Titel: Trotz WinExec werden die proggs doppelt ausgeführt
Danke für den Tip, so geht's auch...

Nur die Proggz werden trotzdem doppelt ausgeführt.
Woran kann das liegen?

Ich hab keine Ahnung, vielleicht weis ja einer von euch bescheid.

MfG

Lui


Raphael O. - Sa 18.01.03 01:44

dann wird die prozedur wahrscheinlich zweimal aufgerufen...

Fiji-Fighter


Raphael O. - Sa 18.01.03 01:47

mach mal zum testen nen ganz simples Programm

wo nur einmal bem start oder so einmal winexec/shellexecute aufgerufen wird und guck ob dann auch zwaimal geöffnet wird...

mach mal nen haltepunkt, an der stelle wo das andere Programm ausgeführt wird und schau wie oft der "abgegangen" wird

Fiji-Fighter


Delete - Sa 18.01.03 06:30

Fiji-Fighter hat folgendes geschrieben:
könntest auch folgende Prozedur verwenden:

Quelltext
1:
WinExec('C:\MeinPfad\MeinProgramm.exe', 0);                    


Bitte nicht. Diese Funktion wurde von Microsoft als obsolet gekennzeichnet und sollte nicht mehr verwendet werden. Sie existiert nur noch aus Kompatibilitätsgründen und wird in zukünftigen Versionen von Windows wohl nicht mehr unterstützt!


Raphael O. - Sa 18.01.03 11:10

@ Luckie Danke für die information :wink:

fand ich aber eigentlich schöner diese prozedur, und einfacher zu merken...

naja man kann ja nicht alles haben...

was war denn an der so schlecht, dass sie in zukunft nicht mehr unterstützt wird???

Fiji-Fighter


Tino - Sa 18.01.03 11:29

Fiji-Fighter hat folgendes geschrieben:
was war denn an der so schlecht, dass sie in zukunft nicht mehr unterstützt wird???

Die Funktion hat einfach ausgedient. Nicht mehr genügend Einstellungsmöglichkeiten... und und und!

Gruß
TINO


Delete - Sa 18.01.03 14:05

Das sind einfach noch Überbleibsel von Win3.11 Zeiten. Und es wird wohl langsam Zeit, diese mal über Bord zu werfen.


Lui - So 19.01.03 16:20
Titel: Danke, also mach ich mit ShellExecute weiter...
Ok dann lasse ich das mit dem WinExec mal, aber wieso werden die Programme denn doppelt aufgerufen?

Kann sich das von euch denn keiner erklären?


Quelltext
1:
2:
3:
4:
procedure TForm1.Action15Execute(Sender: TObject);
begin
ShellExecute(Application.Handle, 'open' ,PChar('explorer.exe'), nil, PChar('C:\WINDOWS'), sw_ShowNormal);
end;


Delete - So 19.01.03 16:28

An dem von dir geposteten Code liegt es nicht, so wie ich das sehe. Der Code wird bestimmt an anderer Stelle noch mal ausgeführt, da bin ich mir fast zu 100% sicher.


Delete - So 19.01.03 18:46
Titel: Re: Danke, also mach ich mit ShellExecute weiter...
Das denke ich auch, Luckie. Da ist irgendwo der Wurm drin, denn für sich allein wird die Funktion nicht doppelt aufgerufen!

Im übrigen reicht ein einfaches

Quelltext
1:
2:
ShellExecute(Application.Handle,'open','c:\windows',
  nil,nil,SW_SHOWNORMAL);

schon aus.


Delete - So 19.01.03 18:50

Ach wo wir schon dabei sind, wegen dem richtig machen: "c:\windows" würde bei mir nicht gehen. :roll: Den Ordner gibt es bei mir nämlich nicht.


Lui - So 19.01.03 19:00
Titel: Stimmt aber wieso?
Vielen Dank für die Tips und Anregungen!

Zitat:

Im übrigen reicht ein einfaches
Code:
ShellExecute(Application.Handle,'open','c:\windows',
nil,nil,SW_SHOWNORMAL);

schon aus.


Stimmt! Damit öffnet er nur den 'windows' Ordner mit Hilfe des Explorers.

Nur wenn ich eine '*.exe' aufrufe wird der OnExecute Befehl zweimal ausgeführt.

Zitat:

Der Code wird bestimmt an anderer Stelle noch mal ausgeführt, da bin ich mir fast zu 100% sicher.


Stimmt und zwar OnMouse Down und OnMouseUp, habs mal versucht mit gedrückter Maus den button zu verlassen und erst außerhalb loszulassen.
Und schon wurde das Programm nur einmal ausgeführt.

D.h. er führt den OnExecute Befehl tatsächlich zwei mal aus.

Aber wieso erkennt er beide "Mauszustände" (MouseDown und MouseUp) als OnExecute an?

Ich blick da nicht ganz durch...

:(