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.