Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Datei per Doppelklick im laufenden Prozess öffnen (Unicode) (https://www.delphipraxis.net/150348-datei-per-doppelklick-im-laufenden-prozess-oeffnen-unicode.html)

Patrick 14. Apr 2010 14:31


Datei per Doppelklick im laufenden Prozess öffnen (Unicode)
 
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))='.abcd' then
    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.

rollstuhlfahrer 14. Apr 2010 16:00

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico
 
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

Patrick 15. Apr 2010 07:59

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico
 
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?

Patrick 16. Apr 2010 16:09

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico
 
Also wenn ich
Delphi-Quellcode:
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...

Patrick 16. Apr 2010 16:25

Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico
 
Mit
Delphi-Quellcode:
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 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