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

Решение проблемы копирования и вставки сообщений Outlook в терминальном сервере Delphi

Delphi , ОС и Железо , DOS и Консоль

Решение проблемы копирования и вставки сообщений Outlook в терминальном сервере в Delphi

Пользователь столкнулся с проблемой при попытке копирования и вставки сообщений Outlook с рабочей станции на терминальный сервер, используя Delphi. В коде, предоставленном пользователем, при копировании и вставке сообщений Outlook размер потока данных (aStreamStat.cbSize) был равен 0, что не позволяло прочитать содержимое потока.

Основная проблема:

  • При работе с некоторыми типами данных, такими как CF_FILEDESCRIPTORW или CF_FILEDESCRIPTORA, Windows предоставляет поток IStream, который не поддерживает функцию Seek и не корректно отображает размер потока в поле cbSize. Вместо этого необходимо использовать поля nFileSizeLow и nFileSizeHigh структуры TFileDescriptor.
  • Функция CopyFrom класса TStream, при передаче нулевого значения в качестве второго параметра, пытается вызвать функцию Seek, что приводит к ошибке EOleSysError, так как Seek не поддерживается.

Решение:

  1. Изменить метод LoadFromIStream класса TMyMemoryStream: pascal procedure TMyMemoryStream.LoadFromIStream(AStream: IStream); var oOLEStream: TOleStream; iSize: Cardinal; begin oOLEStream := TOleStream.Create(AStream); try if AStream.GetSizeMax(iSize) then begin Self.Clear; Self.CopyFrom(oOLEStream, iSize); end; finally oOLEStream.Free; end; end;
  2. Использовать метод GetSizeMax для получения размера потока данных.

Подтвержденный ответ:

Исправление кода заключается в использовании метода GetSizeMax для получения размера потока данных, что позволяет корректно скопировать данные из потока IStream.

Альтернативные варианты решения:

  • Проверить, что поток данных поддерживает операцию Seek перед её выполнением.
  • Убедиться, что параметры функции CopyFrom корректны для использования с текущим потоком данных.

Важные замечания:

  • Всегда проверять результаты вызовов функций на успешность выполнения.
  • В случае ошибок логировать информацию для удобства отладки.

Пример кода на Object Pascal (Delphi):

procedure TMyMemoryStream.LoadFromIStream(AStream: IStream);
var
  oOLEStream: TOleStream;
  iSize: Cardinal;
begin
  oOLEStream := TOleStream.Create(AStream);
  try
    if AStream.GetSizeMax(iSize) then
    begin
      Self.Clear;
      Self.CopyFrom(oOLEStream, iSize);
    end;
  finally
    oOLEStream.Free;
  end;
end;

Этот код должен быть интегрирован в класс TMyMemoryStream, используемый в контексте работы с данными, копируемыми в буфер обмена. Применение данного решения позволит корректно копировать данные из потоков, предоставляемых Windows для форматов CF_FILEDESCRIPTORW или CF_FILEDESCRIPTORA.

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

Пользователь столкнулся с технической проблемой, связанной с копированием и вставкой сообщений Outlook в среду терминального сервера, используя Delphi, и нуждается в исправлении кода для корректной работы с потоками данных.


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

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




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


:: Главная :: DOS и Консоль ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 22:07:08/0.003450870513916/0