Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Устранение ошибки "Invalid FORMATETC structure" при загрузке документов Word в OLEContainer в Delphi 7 на Windows 2003 в среде Terminal Services

Delphi , Технологии , OLE

Устранение ошибки "Invalid FORMATETC structure" при загрузке документов Word в OLEContainer в Delphi 7 на Windows 2003 в среде Terminal Services

При работе с компонентами OLE в среде Delphi 7, разработчики могут столкнуться с различными проблемами, особенно в специфических условиях, таких как терминальные серверы Windows 2003. Одной из таких проблем является ошибка "Invalid FORMATETC structure" при попытке загрузки документов Word в OLEContainer. В данной статье мы рассмотрим, как можно устранить эту ошибку, основываясь на информации из контекста заданного вопроса.

Описание проблемы

Разработчики, использующие Delphi 7 для загрузки Word документов в OLEContainer, могут столкнуться с ошибкой "Invalid FORMATETC structure" в среде терминальных сервисов Windows 2003. Простая программа с OLEContainer и кнопкой на форме может работать без ошибок для некоторых пользователей, но выдавать ошибку для других, несмотря на то, что все они работают на одном терминальном сервере и используют один и тот же документ Word.

Пример кода, вызывающего ошибку

procedure TForm1.Button1Click(Sender: TObject);
begin
  OleContainer1.CreateObjectFromFile('c:\tmp\test.doc', false);
end;

Возможные причины и решения

Конкурентность

Одна из возможных причин - конкурентный доступ к одному документу. Однако, в данном случае, это не является проблемой, так как ошибка воспроизводится при работе одного пользователя.

Версия Delphi

Использование разных версий Delphi может влиять на поведение программы. В более новых версиях, таких как Delphi XE3, параметр lpFormatEtc в вызове OleCreateFromFile передается как nil, что может быть ключевым отличием.

Ошибка в сообщении

Было предложено проверить, содержит ли сообщение об ошибке дополнительную информацию, которая может помочь в диагностике.

Ошибка Microsoft KB

Указано на существующую ошибку Microsoft KB 297217, которая может быть связана с проблемой использования интерфейсов OLE, использующих структуру FORMATETC в терминальных службах Windows 2000.

Альтернативный путь загрузки

Предложено использовать IPersistFile для автоматического управления Word, который может предоставить альтернативный способ загрузки файла.

Подтвержденное решение

После серии тестов было обнаружено, что метод TOleContainer.LoadFromStream всегда работает. Однако, он требует, чтобы в поток передавался OLE-поток, а не просто поток с документом Word. Было выполнено обратное инжинирирование формата OLE-потока, что позволило создать его вручную. Структура OLE-потока включает в себя заголовок, сам документ Word, а затем подвал, состоящий из 256 байтов ASCII-0.

Пример создания OLE-потока

function OLEStreamFromDoc(const inDocFileName : String) : TMemoryStream;
var
  aFileStream : TMemoryStream;
  aPadding    : array[1..256] of byte;
  aHeader     : array[1..12] of byte;
  aSize       : int64;
  i           : integer;
begin
  for i := low(aHeader) to High(aHeader) do
    aHeader[i] := 0;
  for i := low(aPadding) to High(aPadding) do
    aPadding[i] := 0;
  Result := TMemoryStream.Create;
  aFileStream := TMemoryStream.Create;
  try
    aFileStream.LoadFromFile(inDocFileName);
    aFileStream.Seek(0,0);
    aSize := aFileStream.Size + SizeOf(aPadding);
    aHeader[1] := Ord('B');
    aHeader[2] := Ord('D');
    aHeader[3] := Ord('O');
    aHeader[4] := Ord('C');
    aHeader[5] := 1;
    aHeader[9]  := aSize and 255;
    aHeader[10] := (aSize shr 8) and 255;
    aHeader[11] := (aSize shr 16) and 255;
    aHeader[12] := (aSize shr 24) and 255;
    Result.Write(aHeader, SizeOf(aHeader));
    aFileStream.SaveToStream(Result);
    Result.Write(aPadding, sizeof(aPadding));
    Result.Seek(0,0);
  finally
    aFileStream.Free;
  end;
end;

Использование этой функции OLEStreamFromDoc позволит создать поток, который можно загрузить в TOleContainer без возникновения ошибки "Invalid FORMATETC structure".

Заключение

Используя предложенные методы и примеры кода, разработчики могут устранить ошибку "Invalid FORMATETC structure" при работе с документами Word в Delphi 7 в среде терминальных сервисов Windows 2003. Важно тщательно проверить среду выполнения, провести тестирование и, при необходимости, применить альтернативные методы загрузки документов.

Создано по материалам из источника по ссылке.

Описание: При работе с компонентами OLE в Delphi 7 на Windows 2003 в среде Terminal Services возникает ошибка "Invalid FORMATETC structure" при загрузке документов Word в OLEContainer, которую можно устранить, используя альтернативные методы загрузки, на


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: OLE ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 16:07:21/0.0036640167236328/0