Einzelnen Beitrag anzeigen

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, 14: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