AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kontextmenü soll mehrere Dateien einem Pragramm schicken
Thema durchsuchen
Ansicht
Themen-Optionen

Kontextmenü soll mehrere Dateien einem Pragramm schicken

Ein Thema von binio · begonnen am 14. Mär 2008 · letzter Beitrag vom 30. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von binio
binio

Registriert seit: 25. Nov 2005
Ort: Werl, Iserlohn, Dortmund, Hagen
85 Beiträge
 
Delphi 2006 Professional
 
#1

Kontextmenü soll mehrere Dateien einem Pragramm schicken

  Alt 14. Mär 2008, 13:42
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]
if(copy_paste==false)
Programmierer=Hilflos;
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#2

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 14. Mär 2008, 14:06
Hallo,

guckst Du hier
  Mit Zitat antworten Zitat
Lasse2002

Registriert seit: 29. Nov 2004
79 Beiträge
 
RAD-Studio 2009 Pro
 
#3

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 20. Mär 2008, 13:04
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.
Lasse
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 21. Mär 2008, 14:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von binio
binio

Registriert seit: 25. Nov 2005
Ort: Werl, Iserlohn, Dortmund, Hagen
85 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 9. Apr 2008, 15:14
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(
if(copy_paste==false)
Programmierer=Hilflos;
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 10. Apr 2008, 13:42
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

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

Registriert seit: 25. Nov 2005
Ort: Werl, Iserlohn, Dortmund, Hagen
85 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 10. Apr 2008, 14:27
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
if(copy_paste==false)
Programmierer=Hilflos;
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#8

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 11. Apr 2008, 00:16
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
Angehängte Dateien
Dateityp: zip singleinstance_153.zip (101,2 KB, 34x aufgerufen)
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 11. Apr 2008, 00:40
Danke Frank

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.
Dein Code sieht eh besser aus als meiner.

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.


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 von binio:
Danke schonmal für den Quelltext
Kein Problem!
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.

  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#10

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 11. Apr 2008, 00:44
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.
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