Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 05:36

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Parameter Handling in Anwendungen
BeitragVerfasst: Mi Jan 07, 2009 19:53 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Serv,

ich habe 2 eigene "Kontextmenü" Einträge im Windows-Explorer per Registry Änderung hinzugefügt.

- Add items
- Process items

Meine Anwendung ist so gebaut, das diese die 2 Parameterarten verarbeiten kann.
Das Funktioniert problemlos für "Einzelne" Dateien und Ordner.

Es gibt eine art Queue wo die Parameter (Directories oder Dateien) gespeichert werden.
- Bei Add werden sollten sie nur hinzugefügt werden
- Bei Process sollte der vorherige Inhalt geleert werden, der neue hinzu und die Verarbeitung gestartet werden.

Falls die Anwendung schon läuft, erkennt es den vorhanden Mutex und Sendet den Parameter direkt mit WM_COPYDATA an das Hauptfenster der offenen Anwendung und beendet sich selbst.



Nun kommt aber mein problem:

Die Anwendung braucht einige Sekunden um Hochzufahren.
Während dieser Zeit ist das Hauptfenster nicht sichtbar, somit können keine WM_COPYDATA nachrichten empfangen werden.

Sobald ich nun mehrere Dateien oder Ordner markiere und im Contextmenü eintrag "Add" oder "Process" auswähle, dann kommt effektiv nur der letzte parameter oder mal 2-3 an und die Logik der Anwendung fängt an Rumzuspinnen, weil für jeden Parameter der per WM_COPYDATA reinkommt, sofort behandelt wird.

Halt aus dem Grund weil die Parameter an die Anwendung geschickt werden die zuerst gestartet wurde und diese Botschaft aber nicht ankommen kann, weil das Hauptfenster ne zeit zum laden brauch.



Dazu kommt noch das man auch einfach im Windows Explorer Eingabe drücken kann nachdem man was markiert hat und die jeweiligen Anwendungen die der Erweiterung zugeordnet sich gestartet werden.

Somit meine Anwendung pro markierten Eintrag gestartet wird, aber trotzdem irgendwie nur den letzten Eintrag davon in die Queue haut und verarbeitet.



Was macht man in dem Fall ?

Was gibts da für möglichkeiten, vor allem dingen was gibt es für andere Wege von Anwendung > Anwendung zu kommunizieren, ausser WM_COPYDATA.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 20:14 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, also ich hab zwar nicht wirklich Ahnung davon, aber vllt kann man die Daten in eine Memory Mapped File schreiben.
Ich hab allerdings lange nicht damit gearbeit und weiß garnicht was passiert, wenn die File vergessen wird, ob die dann noch die ganze Zeit im Hauptspeicher rumliegt.
Auf jeden Fall ist das eine Möglichkeit unter Anwendungen Daten zu verschicken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 20:31 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
steht vielleicht was in paramstr(1) usw.?
oder verstehe ich dich gerade völlig falsch (was ich nicht ausschließen mag)
Falls du Lazarus nutzt, dann gugg dir mal das an.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 22:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Mermory Mapped File dürfte unter Vista aus Sicherheitsgründen nicht mehr gehen (es sei denn die Anwendung ist ein System Service).

Insofern ich dein Problem richtig Verstanden haben hier 2 Möglichkeiten:

Ich würde versuchen das message handling in ein seperates Fenster auszulagern (welches direkt beim start der Anwendung - also bevor irgendetwas anderes gemacht wird erzeugt wird). So kannst du wenigstens immer auf die WM_COPYDATA Nachrichten reagieren und sie dann in ne Queue kopiere die ausgeführt wird sobald die Anwendung ready ist.

Alternativ das senden der WM_COPYDATA so lange verzögern bis die Anwendung richtig hochgefahren ist.
(Am besten existens des empfänger Fensters per FindWindow überprüfen oder mit mehreren MUTEX Objekten arbeiten).

Die einzige andere mir bekannte Möglichkeit zum Datenaustausch wären COM Interfaces (viel spaß damit :twisted: )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 08:33 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Per WindowsAPI ein unsichtbares Fenster erstellen, dasz noch vor dem Mutex erstellt wird, koennte dein Problem loesen :-) Dann kann die Anwendung auch noch ne Weile blockieren, in der MessageQueue des Fensters landen die Nachrichten schon.

Warum MMFs unter Vista nicht gehen sollten ist mir aber nicht klar. Klappt imho fast wie immer nur dasz Services jetzt ihre MMFs global ablegen und User-Anwendungen "lokal" suchen - da musste dann ein bischen Tricksen, ... Siehe auch http://msdn.microsoft.com/en-us/library/aa382954.aspx , http://blogs.msdn.com/maartenb/archive/ ... vista.aspx . Ist fuer das Mutex auch nicht schlecht, wenn man da ein Global\\ vorsetzt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]