AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Datei per Doppelklick im laufenden Prozess öffnen (Unicode)
Thema durchsuchen
Ansicht
Themen-Optionen

Datei per Doppelklick im laufenden Prozess öffnen (Unicode)

Ein Thema von Patrick · begonnen am 14. Apr 2010 · letzter Beitrag vom 16. Apr 2010
Antwort Antwort
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

Datei per Doppelklick im laufenden Prozess öffnen (Unicode)

  Alt 14. Apr 2010, 15:31
Hallo,

Ich möchte eine Datei per Doppelklick in meinem schon laufenden Prozess öffnen. Dazu überprüfe ich beim starten des zweiten Prozesses das alt bekannte Mutex-Handle. Gibt es das schon, wird geschaut ob eine Datei im "Paramstr" übergeben wurde. Ist das der Fall hole ich mir das Handle einer Komponente vom ersten Prozess, die das Draggen von Files akzeptiert und "dragge" per PostMessageW die Datei im Paramstr auf die Komponente. Unter Delphi 2007 hatte ich einen Ähnlichen Code schon am laufen. Leider funktioniert er unter Delphi 2010 nicht mehr. Ich vermute dass ich Unicode-Probleme habe.

Die Funktion zum Absenden sieht folgendermaßen aus:
Delphi-Quellcode:
  function DropFilesOnWnd(AWnd: HWND; AFiles: String): Boolean; // WM_DROPFILES Message versenden
  var LInfo: PDragInfoW;
      LRes: Boolean;
      LHGlobal: Cardinal;
  begin
    LRes := False;
    if copy(AFiles, length(AFiles), 1) <> #0 then
      AFiles := AFiles + #0;
    LHGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDragInfoW) + length(AFiles)*SizeOf(WideChar) + 1);
    if LHGlobal <> 0 then
    begin
      LInfo := GlobalLock(LHGlobal);
      if LInfo <> nil then
      begin
        LInfo.uSize := SizeOf(TDragInfoA);
        Move(AFiles[1], PChar(Cardinal(LInfo) + LInfo.uSize)^, length(AFiles)*SizeOf(WideChar));
        GlobalUnlock(LHGlobal);
        LRes := PostMessageW(AWnd, WM_DROPFILES, LHGlobal, 0);
      end;
      if not(LRes) then
        GlobalFree(LHGlobal);
    end;
    result := LRes;
  end;
Die Funktion, die es empfängt schaut so aus:
Delphi-Quellcode:
procedure TMainGUI.LvSubClassWndProc(var Message: TMessage);
var
  Counts, Size: Integer;
  PCharFileName: PWideChar;
begin
  PCharFileName:=nil;
  Counts := DragQueryFileW(Message.WParam, $FFFFFFFF, PCharFileName, 255);
  //for i := 0 to Counts - 1 do
  if Counts > 0 then
  begin
    Size:=DragQueryFileW(Message.WParam, {i}0, nil, 0) + 1; // <--- Hier bekomme ich immer 1 zurück, wenn obrige Funktion sendet?
    PCharFileName:=StrAlloc(Size);
    DragQueryFile(Message.WParam, {i}0, PCharFileName, Size);

    //ShowMessage(String(PCharFileName));
    if LowerCase(copy((String(PCharFileName)),length(String(PCharFileName))-4, 5))='.abcdthen
    begin
      if CloseAnalysis then
        LoadAnalysis(String(PCharFileName));
    end;

    StrDispose(PCharFileName);
  end;
  DragFinish(Message.WParam);
end;

procedure TMainGUI.LvSubClassWndProcGrid(var Message: TMessage);
begin
  if Message.Msg = WM_DROPFILES then
    LvSubClassWndProc(Message);
  OldWindowProcGrid(Message);
end;
Also das Empfangen funktioniert beim draggen aus dem Explorer super. Also scheint die sendende Funktion Probleme zu haben.
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico

  Alt 14. Apr 2010, 17:00
HI,

versuche es mal mit SendMessageW. Ich denke, dass deine Sendeprozedur einfach nur zu früh das LHGlobal wieder aus dem Speicher nimmt. PostMessage(A/W) setzt eine Nachricht nur ans Ende der Nachrichtenschleife und gibt eigentlich nichts zurück. Die Frage ob die Nachricht angekommen und/oder behandelt wurde, wird nämlich nicht beantwortet. SendMessage(A/W) gibt erst ein Ergebnis zurück, wenn die Nachricht vollständig abgearbeitet wurde.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico

  Alt 15. Apr 2010, 08:59
Wenn ich SendMessageW verwende kommt die Nachricht zwar an, aber das Ergebnis von DragQueryFileW ist 0...

Mit PostMessageW kommt ja uch was an, aber eben nur das erste Zeichen, weil die Size = 1+1 = 2 ist. Nur warum?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico

  Alt 16. Apr 2010, 17:09
Also wenn ich DropFilesOnWnd(AWnd: HWND; AFiles: AnsiString): Boolean; verwende, dann funktionierts, solange im Dateinamen keine Unicode-Zeichen vorkommen. Hier stimmt die Size dann auch. Da Windows da mit einem Null-terminierten String arbeitet kann ich dann auch verstehen, dass bei mir nur ein Buchstabe ankommt. Weil bei Unicode ist das zweite Byte = 0. Und wenn Windoof das als AnsiCode liest, dann ist der String Null-terminiert. Den Empfänger habe ich auch mit DragQueryFileW (also Unicode) getestet, leider bisher ohne Erfolg...
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico

  Alt 16. Apr 2010, 17:25
Mit DropFilesOnWnd(AWnd: HWND; AFiles: UTF8String): Boolean; und DragQueryFileW funktioniert es fast perfekt. Nur bekomme ich nun Hässlichkeiten bei chinesischen Schriftzeichen. Die Frage ist nur, welchen Zeichensatz beim lesen erwartet wird. Aber ich weiss definitiv, dass der Empfänger funktioniert, weil das Draggen einer Datei mit Unicode-Filename funktioniert tadellos. Also welchen Zeichensatz muss ich beim versenden verwenden?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 08: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