Информация об изменениях

Сообщение Получение списка файлов из буфера обмена от 13.03.2023 6:45

Изменено 13.03.2023 9:05 xteam777

Получение списка файлов из буфера обмена
Делаю выборку форматов, и если попадается CF_HDROP пытаюсь забрать из него список файлов.
Получаю либо какой то мусор, либо строку, обрезанную слева.
Утилиты для просмотра содержимого буфета обмена показывают все правильно.
Что я делаю не так?

uses ShlObj, Clipbrd;

function TForm2.Get_ClipboardFiles: String;
var
  len, fmt: integer;
  tmp: array of Byte;

  Data: THandle;
  DataPtr: Pointer;
  DataLen: integer;

  pFormatName: String;
  sTmp: WideString;

begin
  Result := '';

  Clipboard.Open;
  try
    fmt := EnumClipboardFormats(0);
    while (fmt > 0) do
    begin
      Data := GetClipboardData(fmt);
      if Data <> 0 then
      begin
        DataPtr := GlobalLock(Data);
        if DataPtr <> nil then
          try
            DataLen := GlobalSize(Data);
            if DataLen > 0 then
            begin
              SetLength(pFormatName, 255);
              len := GetClipboardFormatName(fmt, @pFormatName[1], 255);
              SetLength(pFormatName, len);

              if fmt = CF_HDROP then
                SetString(Result, PFileGroupDescriptor(DataPtr)^.fgd[0].cFileName, Length(PFileGroupDescriptor(DataPtr)^.fgd[0].cFileName));
            end;
          finally
            GlobalUnlock(Data);
          end;
      end;
      fmt := EnumClipboardFormats(fmt);
    end;
  finally
    Clipboard.Close;
  end;
end;
Получение списка файлов из буфера обмена
Делаю выборку форматов, и если попадается CF_HDROP пытаюсь забрать из него список файлов.
Получаю либо какой то мусор, либо строку, обрезанную слева.
Утилиты для просмотра содержимого буфера обмена показывают все правильно.
Что я делаю не так?

uses ShlObj, Clipbrd;

function TForm2.Get_ClipboardFiles: String;
var
  len, fmt: integer;
  tmp: array of Byte;

  Data: THandle;
  DataPtr: Pointer;
  DataLen: integer;

  pFormatName: String;
  sTmp: WideString;

begin
  Result := '';

  Clipboard.Open;
  try
    fmt := EnumClipboardFormats(0);
    while (fmt > 0) do
    begin
      Data := GetClipboardData(fmt);
      if Data <> 0 then
      begin
        DataPtr := GlobalLock(Data);
        if DataPtr <> nil then
          try
            DataLen := GlobalSize(Data);
            if DataLen > 0 then
            begin
              SetLength(pFormatName, 255);
              len := GetClipboardFormatName(fmt, @pFormatName[1], 255);
              SetLength(pFormatName, len);

              if fmt = CF_HDROP then
                SetString(Result, PFileGroupDescriptor(DataPtr)^.fgd[0].cFileName, Length(PFileGroupDescriptor(DataPtr)^.fgd[0].cFileName));
            end;
          finally
            GlobalUnlock(Data);
          end;
      end;
      fmt := EnumClipboardFormats(fmt);
    end;
  finally
    Clipboard.Close;
  end;
end;