![]() |
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:
Die Funktion, die es empfängt schaut so aus:
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;
Delphi-Quellcode:
Also das Empfangen funktioniert beim draggen aus dem Explorer super. Also scheint die sendende Funktion Probleme zu haben.
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; |
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 |
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? |
Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico
Also wenn ich
Delphi-Quellcode:
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...
DropFilesOnWnd(AWnd: HWND; AFiles: AnsiString): Boolean;
|
Re: Datei per Doppelklick im laufenden Prozess öffnen (Unico
Mit
Delphi-Quellcode:
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?
DropFilesOnWnd(AWnd: HWND; AFiles: UTF8String): Boolean;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz