DSiWin32.DSiGetHtmlFormatFromClipboard не работает?

Я пытаюсь использовать DSiGetHtmlFormatFromClipboard функция из хорошо известной библиотеки DSiWin32.

Редактировать: есть гораздо более новая версия DSIWin32.pas 1.94 от 2016-10-19, который содержится в текущей версии OmniThreadLibrary_3.07.1. Тот, на который я ссылался в первой строке моего вопроса, намного старше: 1.66 от 2012-04-20. Тем не менее, также в этой более новой версии DSIWin32.pas функция DSiGetHtmlFormatFromClipboard не работает, хотя я удостоверился, что никакие другие программы буфера обмена не работают.

Поэтому я поместил в буфер обмена некоторый текст, включающий формат HTML, например, скопировав некоторый текст из веб-браузера Chrome.

И затем я использую этот код, чтобы получить формат HTML из буфера обмена:

if DSiWin32.DSiIsHtmlFormatOnClipboard then 
begin
   CodeSite.Send('HTML-Format string:', DSiWin32.DSiGetHtmlFormatFromClipboard);
end;

В то время как DSiIsHtmlFormatOnClipboard функция работает (возвращает True если есть формат HTML в буфере обмена и возвращает False если в буфере обмена нет формата HTML), DSiGetHtmlFormatFromClipboard Функция всегда возвращает пустую строку, хотя в буфере обмена есть HTML-формат:

Итак, я отладил function DSiGetHtmlFormatFromClipboard: string; в DSiWin32.pas:

На этой линии:

hClipData := GetClipboardData(GCF_HTML);

hClipData всегда 0, поэтому следующий код не выполняется.

GetClipboardData это функция от Winapi.Windows и согласно документации MSDN:

Извлекает данные из буфера обмена в указанном формате. Буфер обмена должен быть открыт ранее.

Что имеет место в DSiWin32 код.

Так почему же DSiGetHtmlFormatFromClipboard всегда возвращать пустую строку?

ОС: Windows 7 x64


GetLastError извлекается сразу после строки hClipData := GetClipboardData(GCF_HTML);:

ERROR_CLIPBOARD_NOT_OPEN 1418 (0x58A) В теме нет открытого буфера обмена.

Это странно, потому что предыдущая строка: Win32Check(OpenClipboard(0)); и это не подведет.

Вот соответствующие части MCVE:

var
  GCF_HTML: UINT;

function DSiIsHtmlFormatOnClipboard: boolean;
begin
  Result := IsClipboardFormatAvailable(GCF_HTML);
end; { DSiIsHtmlFormatOnClipboard }

function DSiGetHtmlFormatFromClipboard: string;
var
  hClipData       : THandle;
  idxEndFragment  : integer;
  idxStartFragment: integer;
  pClipData       : PChar;
begin
  Result := '';
  if DSiIsHtmlFormatOnClipboard then
  begin
    Win32Check(OpenClipboard(0));
    try
      hClipData := GetClipboardData(GCF_HTML);
      if hClipData = 0 then
        RaiseLastOSError;
      pClipData := GlobalLock(hClipData);
      Win32Check(assigned(pClipData));
      try
        idxStartFragment := Pos('<!--StartFragment-->', pClipData); // len = 20
        idxEndFragment := Pos('<!--EndFragment-->', pClipData);
        if (idxStartFragment >= 0) and (idxEndFragment >= idxStartFragment) then
          Result := Copy(pClipData, idxStartFragment + 20, idxEndFragment - idxStartFragment - 20);
      finally GlobalUnlock(hClipData); end;
    finally Win32Check(CloseClipboard); end;
  end;
end; { DSiGetHtmlFormatFromClipboard }

procedure TForm1.Button1Click(Sender: TObject);
begin
  if DSiIsHtmlFormatOnClipboard then
    ShowMessage(DSiGetHtmlFormatFromClipboard)
  else
    ShowMessage('No HTML Format on Clipboard');
end;

initialization
  GCF_HTML := RegisterClipboardFormat('HTML Format');
end.

0 ответов

Другие вопросы по тегам