Autor |
Beitrag |
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 27.03.05 23:34
ich habe ein problem: wenn im Windows mehre dateien makiert habe und dann einen eigenen menupunkt wähle der mit deiner funktion hinzugefügt wurde, wird meine Anwendung so oft gestartet wie viele Dateien ich makiert habe, warum ist das so ?
hier ist mein code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm3.BitBtn1Click(Sender: TObject); var i:Integer; str:String; begin for i:=0 to CheckListBox1.Items.Count-1 do begin if CheckListBox1.Checked[i] = True then begin str:=reg.GetInternalKey('.' + CheckListBox1.Items[i]); if str <> '' then reg.UnregisterType('.' + LowerCase(ChecklistBox1.Items[i]));
if reg.RegisterType('.' + ChecklistBox1.Items[i],ChecklistBox1.Items[i] + 'File123',ChecklistBox1.Items[i] + 'Dateien',GetExeDir + 'icons\' + CheckListBox1.Items[i] + '.ico') then begin reg.AddHandler('Play','"' + ParamStr(0) + '"' + ' "%1"','Wiedergabe'); reg.AddHandler('NADD','"' + ParamStr(0) + '"' + ' \NADD "%1"','Zur Neuen Playlist hinzufügen'); reg.SetDefaultHandler('Play'); end; end; end; close; end; |
in der Checklisbox stehen 15 endungen drinen die ich jenach dem reg möchte:
MID
S3M
WAV
...
PS:
Diesmal bitte nicht löschen....
Moderiert von raziel: Abgetrennt von diesem Topic
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 28.03.05 09:42
mimi hat folgendes geschrieben: | PS:
Diesmal bitte nicht löschen.... |
Dann gewöhn dir an, deine Frage in der richtigen Sparte zu stellen!
Zitat: | ich habe ein problem: wenn im Windows mehre dateien makiert habe und dann einen eigenen menupunkt wähle der mit deiner funktion hinzugefügt wurde, wird meine Anwendung so oft gestartet wie viele Dateien ich makiert habe, warum ist das so ? |
Weil dein Programm nicht richtig reagiert. Wenn du mehrere Dateien im Explorer auswählst, dann wird dein Programm entsprechend oft gestartet. Das verhinderst du, indem du dafür sorgst, dass es nur ein einziges Mal starten kann, und indem du die Dateinamen der anderen Dateien an die schon laufende Instanz weitergibst. Das ist alles. Lösungen findest du dazu im Forum genug, Beispiel: WM_COPYDATA.
Aber das hat mit der Unit von oben überhaupt nichts zu tun. So, und wenn ich jetzt mal einen Moderator um Abtrennung bitten dürfte ...
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mo 28.03.05 10:11
daran liegt das nicht, ich habe eine entsprechne komponenten die dafür sorgt, wenn ich im explorer dateien makiere und dann auf wiedergabe klicke.... ich habe mal ebend ein Test gemacht: wenn ich die anwendung ohne %l in sendo TO starte geht es.... aber wenn ich das gleiche ohne %l oder %1 bei der Wiedergabe mache geht das nicht... warum ?
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Mo 28.03.05 11:20
Mach dein Menü per ShellExt, so wie es in den Beispielen ist. Dann kannst du die übergabe an dein Programm so auswerten wie du es möchtest.
Oder du schickst nach deinem Verfahren den Dateinamen an die Hauptinstanz deiner Anwendung und schließt das Programm dann wieder.
_________________ Ciao, Sprint.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 28.03.05 11:30
Ja, angeblich hat er ja eine Komponente, die das automatisch macht. Vorausgesetzt, ich verstehe den Beitrag richtig. Und das ist ja der Punkt: Es wäre schön, wenn man nicht erraten müsste, was wohl bei den Punkten stehen könnte, sondern wenn man eine vernünftige Beschreibung bekommen würde
Zitat: | daran liegt das nicht, ich habe eine entsprechne komponenten die dafür sorgt, wenn ich im explorer dateien makiere und dann auf wiedergabe klicke.... ich habe mal ebend ein Test gemacht: wenn ich die anwendung ohne %l in sendo TO starte geht es.... aber wenn ich das gleiche ohne %l oder %1 bei der Wiedergabe mache geht das nicht... warum ? |

|
|
Sprint
      
Beiträge: 849
|
Verfasst: Mo 28.03.05 11:40
MathiasSimmack hat folgendes geschrieben: | Ja, angeblich hat er ja eine Komponente, die das automatisch macht. |
Könnte sein. Verstehe aber nicht, wofür man da eine Komponente braucht.
_________________ Ciao, Sprint.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 28.03.05 11:46
Das ist doch uninteressant. Ob Komponente oder den Code selbst schreiben ... who cares. Hauptsache der Code erfüllt seinen Zweck. Und das scheint hier nicht 100% der Fall zu sein.
Was ich mimi auch per PN erklärt habe ist, dass meine Unit lediglich die Registrierung der Dateitypen übernimmt. Das heißt, es werden die Dateiendungen und die Programme und Parameter in die Registry geschrieben, der der Anwender (mimi, in dem Fall) dort eintragen will. Das ist Standard von Microsoft, den ich mir nicht ausgedacht habe.
Und darum kann ich im gezeigten Codeschnippsel auch nichts falsches sehen, denn wenn das die Parameter sind, die mimi in der Registry haben will, dann werden sie auch so eingetragen. (Wobei man ja mal im Registryeditor nachschauen könnte, @mimi  .) Wenn, dann liegt der Fehler also an anderer Stelle im Programm.
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Mo 28.03.05 12:10
ich glaube im swissdelphicenter gabs mal ienen artikel darüber, wie man bei einem mehrfach start die params an das laufende Programm übergeben lassen kann.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 28.03.05 12:13
In dem Forum, in dem du Moderator bist, matze, übrigens auch. 
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mo 28.03.05 13:40
Das mit den mehrfach start das dies nicht geschiet funktioniert ja 100 % dafür sorgt eine komponente die macht das auch gut.
Beispiel
ich packe eine verknüpfung in den Send To ordner und starte meine anwendung dann, dann geht es.
Die Anwendung wird nur 1 mal gestartet und nicht für jede datei neu, sobalt ich aber den menupunkt Wiedergabe anklcike wird für jede datei eine neue anwendung gestartet und das geht irgenwie nicht, wenn die komponenten aktiv ist. Aber der kernpunkt ist ja: warum startet windows für jede datei die gleiche Anwendung obwohl einmal vollkommen ausreichen würde. Es reicht doch wenn windows einfach nur eine Parameter liste zum progamm senden würde, oder nicht ?
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 28.03.05 13:45
mimi hat folgendes geschrieben: | Aber der kernpunkt ist ja: warum startet windows für jede datei die gleiche Anwendung obwohl einmal vollkommen ausreichen würde. |
Nein, der Kernpunkt wäre: Was ist der Unterschied deiner "Send to"-Verknüpfung und dem Start per Explorer-Kontextmenü?
Zitat: | Es reicht doch wenn windows einfach nur eine Parameter liste zum progamm senden würde, oder nicht ? |
Ja, aber woher soll Windows wissen, dass dieses Verhalten erwünscht ist? Dafür musst du schon sorgen. Und das soll ja eigentlich diese Komponente machen, von der du dauernd sprichst, die du aber nicht näher vorstellst. Ich würde an deiner Stelle also dort mal nachschauen ob sie wirklich in jedem Fall richtig reagiert.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Mo 28.03.05 13:49
mimi hat folgendes geschrieben: | warum startet windows für jede datei die gleiche Anwendung obwohl einmal vollkommen ausreichen würde. Es reicht doch wenn windows einfach nur eine Parameter liste zum progamm senden würde, oder nicht ? |
Wenn du dieses Verhalten erreichen willst, dann musst du dir wohl eine ShellExt schreiben. Beispiele findest du in dem Demo Verzeichnis.
_________________ Ciao, Sprint.
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mo 28.03.05 13:55
Geht das nicht etwas einfacher ?
weil das beispiel verstehe ich irgenwie nicht...
gibt es da evlt eine kleine komponente oder Unit die das kann ??
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 28.03.05 14:11
Hallo Michael!
Da du uns ja nicht wirklich helfen willst Dein wirkliche Problem zu finden kann ich und will ich dir nur zwei Links geben:
...verhindern dass die Anwendung mehrmals gestartet wird?
...die Startparameter einer anderen Instanz übergeben?
Gruß
Tino
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mo 28.03.05 14:28
Zitat: | Da du uns ja nicht wirklich helfen willst Dein wirkliche Problem zu finden kann ich und will ich dir nur zwei Links geben: |
habe ich doch gesagt was mein problem ist:
Wenn ich unter Windows z.b. 20 Dateien makiert habe und dann auf meinen erzeugen Menupunkt drücke wird meine anwendung 20 mal gestartet, ich hoffe das war verstädnlich, ich weiß sonst nicht wie ich mein problem beschreiben könnten. Doch moment: macht mal folgendes:
Schreibt eine anwendung die mit mehrne parametern arbeitet kann und erzeugt bei einer Dateiendung ein Menupunkt(einen eignen) egal welcher dann makiere dateien(mehre) und Klicke auf diesen Menupunkt, was passiert bei euch ?
Es geht mir darum das Windows meine Anwendung x mal startet obwohl einmal vollkommen ausreichen würde vileicht kann man dies einfach abschalten
@Sprint
ich habe mal dies ShellExt angeschaut, aber muss es denn um das gewünschte verhalten zu bekommen so ein aufwand getrieben werden ? geht das nicht mit einer variable die man beim starten angibt es gib doch
%1-%9
und
%l vileicht sowas in der oder ???
weil ich wollte eigetnlich keine weiter DLL mitliefen oder eine schreiben, weil dann muss ja auch windows neu gestartet werden.....
aber schön das du das Problem verstanden hast....
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Mo 28.03.05 15:35
[quote=" mimi"] Zitat: | weil ich wollte eigetnlich keine weiter DLL mitliefen oder eine schreiben, weil dann muss ja auch windows neu gestartet werden.....
aber schön das du das Problem verstanden hast.... |
Hier mal ein kleines Beispiel. Wird das Programm gestartet, prüft es ob schon eine Instanz vom Programm läuft. Sollte es so sein, wird aus einer MMF das Fensterhandle gelesen und der erste Parameter an die Hauptinstanz geschickt. Auf Fehler musst du das Programm selber prüfen. Hab's nur mal so auf die schnelle geschrieben.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private lbFiles: TListBox; procedure WMCopyData(var Message: TMessage); message WM_COPYDATA; procedure SetAppHWnd; class function IsFirstInstance: Boolean; class procedure CloseOpenHandles; class function GetAppHWnd: HWND; class procedure CreateMMF; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
const WM_USER_COPYDATA = WM_USER + $101;
type PUserCopyData = ^TUserCopyData; TUserCopyData = packed record FileName: array[0..MAX_PATH-1] of Char; end;
PMMFData = ^TMMFData; TMMFData = packed record AppHWnd: HWND; end;
var hSemaphore: THandle; MMFHandle: THandle; MMFData: PMMFData;
class procedure TForm1.CloseOpenHandles; begin
if hSemaphore <> 0 then begin CloseHandle(hSemaphore); hSemaphore := 0; end;
if Assigned(MMFData) then begin UnmapViewOfFile(MMFData); MMFData := nil; end;
if MMFHandle <> 0 then begin CloseHandle(MMFHandle); MMFHandle := 0; end;
end;
class procedure TForm1.CreateMMF; begin
MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TMMFData), '{56AA1BD8-F1E1-4206-AC5D-7323F0E6FC14}');
if MMFHandle <> 0 then MMFData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TMMFData));
end;
class function TForm1.GetAppHWnd: HWND; begin
if Assigned(MMFData) then Result := MMFData^.AppHWnd else Result := 0;
end;
class function TForm1.IsFirstInstance: Boolean; var UserCopyData: TUserCopyData; CopyDataStruct: TCopyDataStruct; AppHWnd: HWND; begin
CreateMMF; hSemaphore := CreateSemaphore(nil, 0, 1, '{BBE56D31-B7FB-4E03-9546-D14392D459CC}');
if GetLastError = ERROR_ALREADY_EXISTS then begin AppHWnd := TForm1.GetAppHWnd; if (ParamCount > 0) and (IsWindow(AppHWnd)) then begin FillChar(UserCopyData, SizeOf(TUserCopyData), 0); StrLCopy(UserCopyData.FileName, PChar(ParamStr(1)), MAX_PATH); CopyDataStruct.dwData := WM_USER_COPYDATA; CopyDataStruct.cbData := SizeOf(TUserCopyData); CopyDataStruct.lpData := @UserCopyData; SendMessage(AppHWnd, WM_COPYDATA, 0, LPARAM(@CopyDataStruct)); end; Result := False; end else Result := True;
end;
procedure TForm1.SetAppHWnd; begin
if Assigned(MMFData) then MMFData^.AppHWnd := Self.Handle;
end;
procedure TForm1.WMCopyData(var Message: TMessage); begin
if PCopyDataStruct(Message.LParam)^.dwData = WM_USER_COPYDATA then begin lbFiles.Items.Add(PUserCopyData(PCopyDataStruct(Message.LParam)^.lpData)^.FileName); end else inherited;
end;
procedure TForm1.FormCreate(Sender: TObject); begin
SetAppHWnd; lbFiles := TListBox.Create(Self);
with lbFiles do begin Parent := Self; Align := alClient; end;
if ParamCount > 0 then lbFiles.Items.Add(ParamStr(1));
end;
initialization if not TForm1.IsFirstInstance then Halt(0);
finalization TForm1.CloseOpenHandles;
end. |
_________________ Ciao, Sprint.
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Fr 08.04.05 14:13
das problem liegt daran das windowas nur einen Parameter an das Programm senden und nicht alle Makierten.
danke für das Beispiel, aber dafür habe ich eine Komponente die das auch macht, wenn ich nur eine Datei makiere start meine Anwendung richtig... bei mehren dateien hängt sich meine anwendung auf und schließt sich nach einer kurzten zeit wieder.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 08.04.05 15:07
mimi hat folgendes geschrieben: | das problem liegt daran das windowas nur einen Parameter an das Programm senden und nicht alle Makierten. |
Nein das Problem ist, dass du nicht liest was wir dir schreiben. Also noch mal:
Wenn du mehrer Dateien im Explorer markierst und damit dein Programm startet, dann macht der Explorer nicht das:
notepad.exe date1 datei2 datei3 datei4,
sondern:
notepad.exe datei1
notepad.exe datei2
notepad.exe datei3
notepad.exe datei4
Lösung wäre jetzt:
Dein programm mekrt, dass es schon mal gestartet wurde und übergibt den Parameter an die erste Instanz. Dafür hat NicoDE mal eine Unit geschrieben www.luckie-online.de/Delphi/Importe/Nico/ -> oneinst.
So, da du uns beharrlich verschweigst, was das für eine Komponente ist, die du benutzt, kann ich nicht sagen, ob so was die Komponente unterstützt oder nicht bzw. ob du was falsch machst. Du solltest eventuell auch mal in Betracht ziehen dich von der Komponente zu lösen und mal etwas anderes ausprobieren.
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Fr 08.04.05 16:23
Zitat: | sondern:
notepad.exe datei1
notepad.exe datei2
notepad.exe datei3
notepad.exe datei4 |
davon rede ich die ganze zeit
In diesem beispiel ist das verhalten auch sinvoll da Notepad ja sowiso nur eine Datei öffnen kann(gleichzeitig) aber für manche anwendungen ist das nicht sinvoll wie z.b. für meinen MediaPlayer...
Ich möchte wissen ob man dieses verhalten ändern könnte geht warscheinlich nur mit ShellEXT.
Zitat: | So, da du uns beharrlich verschweigst, was das für eine Komponente ist, die du benutzt, kann ich nicht sagen, ob so was die Komponente unterstützt oder nicht bzw. ob du was falsch machst. Du solltest eventuell auch mal in Betracht ziehen dich von der Komponente zu lösen und mal etwas anderes ausprobieren. |
gut ich habe die komponete hochgeladen die ich nutze und die sie nutze ich so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.OneInstance1GetParams(Sender: TObject; const Args: array of String); var i:Integer; begin if UpperCase(Args[1]) = '\NADD' then begin Neu2Click(Sender); for i:=2 to HIGH(args) do AddPlayliste( Args[i] ); end else begin for i:=1 to HIGH(args) do AddPlayliste( Args[i] ); end;
end; |
Einloggen, um Attachments anzusehen!
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Fr 08.04.05 16:45
Ich habe deinen rat befolgt und die besagte unit genommen und alles so gemacht wie im beispiel: es funktioniert.... danke..
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
|