Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kontextmenü soll mehrere Dateien einem Pragramm schicken (https://www.delphipraxis.net/110195-kontextmenue-soll-mehrere-dateien-einem-pragramm-schicken.html)

binio 14. Mär 2008 13:42


Kontextmenü soll mehrere Dateien einem Pragramm schicken
 
Hallo ich suche eine Lösung das mir wie man es von ZIP oder Antivir her kennt.
Meine bisherige Lösung ist addRegKey('.hbs','text vom kontextmenü','"/c:/angriff.exe" "%1" "modus=eins"')
Somit wird wenn jemand im Explorer 2 Dateien auswählt und mein KOntextmenüeintrag auswählt 2 mal meine angriff.exe gestartet.
Was ich aber nicht möchte.
Ich will das nur einmal meine angriff.exe starten und mit den 2 ausgewählten Dateien als Parameter aufgerufen wird.
Sodas ich in meiner angriff.exe die eine oder mehrere Parameter abarbeiten kann.
Es sollen bis zu 100 Dateien(Parameter) übergeben werden sollen.
Wie sicht der dazugehörige Registryeintrag aus ??

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

s-off 14. Mär 2008 14:06

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Hallo,

guckst Du hier

Lasse2002 20. Mär 2008 13:04

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Die Methode vom SwissDelphiCenter scheint aber auch das Programm 100 mal zu starten, wenn der Anwender 100 Dateien ausgewählt hat. Bei so vielen Dateien ist es besser, das ganze per IDropTarget zu machen. Weil dann wird deine Anwendung nur ein einziges mal gestartet, egal wieviele Dateien der Benutzer ausgewählt hat.

Luckie 21. Mär 2008 14:15

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Zitat:

Zitat von Lasse2002
Die Methode vom SwissDelphiCenter scheint aber auch das Programm 100 mal zu starten, wenn der Anwender 100 Dateien ausgewählt hat.

Dann muss man das Programm so bauen, dass es mu einmal gestartet werden kann und bei jedem weiteren Start seine Paramter an die erste Instanz übergibt.

binio 9. Apr 2008 15:14

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Hmmm das Programm erfüllt auch nicht richtig das was es soll.
Also ich verstehe das IDropTarget auch nicht so richtig.
Gibt es da nicht ein einfachen Registry Eintrag ?
Hab geguckt ob ich für Winamp oder Antivir das so ein Menü hat was finde. Die Registry will mir aber nicht so wirklich helfen :o(

gmc616 10. Apr 2008 13:42

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Ich kenne keinen Registry-Eintrag dafür.

Du muß dafür sorgen, so wie Luckie schreibt, dass dein Programm nur ein mal startet.
Hier im Forum suchenMutex ist hier das Stichwort.
Schlägt das Erstellen des Mutex fehl, heißt das i.a.R., dass dein Programm bereits läuft.
In diesem Fall mußt du nur dafür sorgen, das der/die Parameter, mit dem dein Programm gerufen wurde, an das bereits laufende Programm gesendet wird.

In einem meiner alten Projekte hab ich das in der *.dpr so in etwa gelöst:
Delphi-Quellcode:
const
  cProgrammname = 'Dein Programmname';
  // alternativ bevorzuge ich einen GUID (STRG+SHIFT+G in der IDE drücken)
  cProgrammName = '{ACE3F9C0-C0E3-443A-9C04-A3F98F6578F1}';

  cFormCaption = 'Dein Fenstertitel';

var
  dwMutex  : DWORD;
  dwMessage : DWORD;
  hWindow  : DWORD;
  cdWork   : TcsCopyDataStruct

begin

  dwMessage := RegisterWindowMessage(GUID_Message);

  dwMutex  := CreateMutex(nil,true,cProgrammname);

  if GetLastError <> ERROR_ALREADY_EXISTS then
  begin
    Application.Initialize;
    Application.CreateForm(TForm, Form1);
    Application.Run;
  end
  else
  begin
    hWindow := FindWindow(nil,cFormCaption);
    if hWindow <> 0 then
    begin
      if (paramcount > 0) and FileExists(paramstr(1)) then
      begin

        cdWork.dwData := dwMessage;
        cdWork.cbData := Length(paramstr(1))+1;
        cdWork.lpData := AllocMem(cdWork.cbData);

        try
          CopyMemory(cdWork.lpData,@paramstr(1)[1],cdWork.cbData-1);
          SendMessage(hWindow,WM_COPYDATA,0,lParam(@cdWork));
        finally
          FreeMem(cdWork.lpData,cdWork.cbData);
        end;
      end;
    end;
  end;

  if dwMutex <> 0 then
  begin
    CloseHandle(dwMutex);
  end;
Zum Empfangen der Daten hab ich die WinProc der MainForm (Form1) überschrieben. In etwa so:
Delphi-Quellcode:
procedure TForm1.WndProc(var msg: TMessage);
var
  dwLen    : DWORD;
  cdWork   : PcsCopyDataStruct;
begin
  if msg.Msg = WM_COPYDATA then
  begin
    cdWork := PcsCopyDataStruct(msg.lParam);
    if cdWork.dwData = dwMessage then
    begin
      // Dein Code ... z.B.
      ShowMessage (PChar(cdWork.lpData));      
    end else
      inherited WndProc(msg);

  end else
    inherited WndProc(msg);
Ich hoffe der Code funktioniert so noch...

Natürlich mut du noch im FormCreate der Form1 auf paramstr(1) prüfen, damit auch das erste Starten des Programms die Parameter berücksichtigt.

Vielleicht hilfts :stupid:

Edit: Code geändernt!
Hab grade eben erst gemerkt, das die DP meine spitzen Klammern aus dem Code heraus formatiert.

binio 10. Apr 2008 14:27

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Wau da bin ich erstmal total von Fremdwörtern und fremdfunktionen überschüttet :o(
Das ist ja hammer. Ich denke ich werde ordentlich Zeit dafür brauchen um es zu verstehen.
Sieht aber ganz Betriebssystem nah aus. Also mit @ und co habe ich noch nie programmiert.
Was sollte den dein Programm eigentlich machen ????
kannst du mir vieleicht die .pas , .dfm und .dpr als Persönliche Nachricht schicken ?
Ich schreibe für Blinde ein Programm das es ermöglicht normale Bücher ein zu scannen und in Punktschrift umzuformatieren. Der User soll also später mehrere *.jpg im Windows Explorer auswählen können und es zur verarbeitung an das Programm schicken. Würde mich über weiter Hilfe sehr freuen

Danke schonmal für den Quelltext

_frank_ 11. Apr 2008 00:16

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab den code von gmc616 bisschen modifiziert (hat eine weile gedauert, bis das mit dem Restore geklappt hat) ;)

vielleicht findet es ja noch platz in der codelib...

Gruß Frank

gmc616 11. Apr 2008 00:40

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
Danke Frank :thumb:

Das wollte ich zwar grad selbst machen, hatte bis jetzt nur keine Zeit gefunden.
Aber so isses auch gut. Brauch ich mir nicht die Arbeit machen. :-D
Dein Code sieht eh besser aus als meiner. :stupid:

Nur eine Sache:
Für RegisterWindowMessage und CreateMutex verwende ich zwei unterschiedliche GUIDs.
Sollte aber keinen Unterschied machen.

Hab eben erst gemerkt, dass die DP spitze Klammern heraus filtert bzw. nicht "reinfiltert".
In meinen Team verwenden wir spitze Klammern um den anderen zu zeigen, dass an dieser Stelle noch etwas zu ergänzen ist. Ich glaube, dass das irgendeiner Syntax-Beschreibung entspricht. In nem HTML-Code macht sich das natürlich doof. :wall:


Zitat:

Zitat von binio
Was sollte den dein Programm eigentlich machen ????

Naja, was so ein MP3-Player halt machen können soll. Mehrere MP3-Dateien in den Player laden.
Da macht es sich natürlich blöd, wenn für jede MP3 ein neuer Player gestartet wird.
Das ganze über einen eigenen Menü-Punkt im Explorer-Kontextmenü, um dort auszuwählen in welcher Liste die Dateien letzen Endes landen sollen.

Zitat:

Zitat von binio
Danke schonmal für den Quelltext

Kein Problem! :zwinker:
Hab mir damals den Code mehr oder weniger hier in der DP zusammen gesucht.
Schön, wenn man der DP mal etwas wieder geben kann.

:dp:

_frank_ 11. Apr 2008 00:44

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken
 
ich denke, auf das registerMessage kann man auch verzichten.
Es wird ja nur als kenner für das WM_CopyData verwendet, aber nicht ausgewertet. Von daher eigentlich sinnlos...die Unterscheidung, ob es wirklich die selbe anwendung ist, wird in dem Code ja anders gemacht (application.exename).
für Anregungen bin ich offen :)

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz