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.
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.