Dlaczego funkcja DragQueryFile zwraca 0?

0

Witajcie,

Utknąłem i mam nadzieje, że mi coś podpowiecie. Napisałem sobie w domu kawałek skryptu, który umożliwia Drag&Drop pliku do aplikacji. Apka działa na vcl pod windws w oparciu o DragQueryFile na Windows7 bez problem. Niestety na kompie z windows7 ale z kontem domenowym funkcja DragQueryFile zawsze zwraca 0 nawet jeśli przeciągam kilka plików. Sprawdziłem nawet debuggując na tym docelowym kompie. Używam czegoś takiego:

procedure TfmMain.SetDragAndDropOnSystemsWIthUAC(Wnd : HWND; IsEnabled : boolean);
type
  TChangeWindowMessageFilter = function(Msg : Cardinal; Action : Word) : Bool; stdcall;
const
    Msg_Add = 1;
    WM_COPYGLOBALDATA = $49;
var
    DllHandle : THandle;
    ChangeWindowMessageFilter : TChangeWindowMessageFilter;
begin
    DragAcceptFiles(Wnd, IsEnabled);
    DllHandle := LoadLibrary(user32);
    if DllHandle > 0 then
    begin
        ChangeWindowMessageFilter := GetProcAddress(DllHandle, 'ChangeWindowMessageFilter');
        if Assigned(ChangeWindowMessageFilter) then
        begin
            ChangeWindowMessageFilter(WM_DROPFILES, Msg_Add);
            ChangeWindowMessageFilter(WM_COPYGLOBALDATA, Msg_Add);
        end;
    end;
end;


procedure TfmMain.FormCreate(Sender: TObject);
begin
  SetDragAndDropOnSystemsWIthUAC(memText.Handle, True);
  FGridWNDProc := memText.WindowProc;
  memText.WindowProc := grdEmissioinWND;
end;

procedure TfmMain.grdEmissioinWND(var Message: TMessage);
begin
  FGridWNDProc(Message);
  if Message.Msg = WM_DROPFILES then
      DropFilesOnToApp(TWmDropFiles(Message));
end;

procedure TfmMain.DropFilesOnToApp(var msg: TWMDropFiles);
var
  hDrop: THandle;
  FileCount: Integer;
  i : integer;
begin
  hDrop := msg.Drop;
  // Zwraca ilosc przeciaganych plikow
  FileCount:= DragQueryFile(hDrop, $FFFFFFFF, nil, 0);
  for i:=0 to FileCount-1 do //FileCount zawsze jest 0
  begin
    //tu już nie wchodzi
  end;
end;

Jakiś pomysł dlaczego na koncie domenowym to nie bangla?

0

Widziałem ten przykład i w tamtym przykładzie gość pobiera handle przekazując do clipboard ścieżkę (katalog) do plików i potem używając clipboard zwraca handla. Ja hadla mam z WMDropDown więc nie jest to potrzebne. Nie mniej jednak nakierowało mnie to lekko i wydaje mi się, że właśnie handle jest nieprawidłowy na tym zdarzeniu ... tylko dlaczego?

1

Jeśli przeciągasz z aplikacji 64 bit do 32 bit (albo w drugą stronę, nie jestem teraz pewny) to Windows może uszkadzać handle. W moim przypadku pomogło zaimplementowanie IDropTarget w połączeniu z RegisterDragDrop.

Edit:
Sprawdziłem i jest to z 32 do 64 bit.

1 użytkowników online, w tym zalogowanych: 0, gości: 1