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

Влияние TsAppCmd.dll и Отсутствие TSAWARE на Работу Delphi-приложений в Терминальных Серверах

Delphi , Рабочий стол , Рабочий стол

Вопрос, заданный в контексте, касается влияния компонента TsAppCmd.dll на работу Delphi-приложений, запущенных на терминальных серверах. В частности, рассматривается проблема, связанная с неожиданным закрытием приложений Office 2007 или Office 2003 на серверах Windows Server 2008 R2, которая вызвана изменениями, вносимыми TsAppCmd.dll в Import Address Table (IAT) приложений, не поддерживающих терминальные серверы. Это может приводить к временной корректировке памяти из-за порядка загрузки модулей. В Office 2007 и Office 2003 отсутствует TSAWARE флаг, который уведомляет сервер о том, что приложение поддерживает терминальные серверы.

Основные моменты, которые стоит рассмотреть при написании статьи:

  1. Описание проблемы: Рассмотреть, влияет ли проблема, описанная в MSDN, на Delphi-приложения, запущенные в терминальных серверах.
  2. ТSAWARE флаг: Объяснить, что такое TSAWARE флаг и почему он важен для корректной работы приложений на терминальных серверах.
  3. Влияние TsAppCmd.dll: Исследовать, как TsAppCmd.dll изменяет работу приложений без TSAWARE флага и как это может приводить к ошибкам.
  4. Практический пример: Предоставить пример кода на Object Pascal для Delphi, который может быть использован для установки TSAWARE флага в приложении (используя информацию из предоставленной ссылки на блог TOndrej).
  5. Диагностика проблем: Объяснить, как использовать инструменты, такие как map2dbg и Process Explorer для диагностики и устранения блокировок в процессах.
  6. Альтернативные ответы и комментарии: Обсудить дополнительные вопросы, связанные с требованиями к приложениям для работы в терминальных серверах (например, запрет на запись в INI файлы и в HKEY_CURRENT_USER).

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

Указано, что TsAppCmd.dll влияет на любые программы, не имеющие TSAWARE флага в заголовке исполняемого файла. Однако это не обязательно означает, что все такие приложения будут затронуты конкретной ошибкой. Указан способ проверки влияния на приложение через установку TSAWARE флага или через запись в реестр, упомянутую в статье Knowledge Base.

Пример кода для установки TSAWARE флага (на основе ссылки на блог TOndrej):

uses
  System.SysUtils,
  System.Classes;

procedure SetTSAwareFlag(const aFileName: string);
var
  PEHeader: TPEHeader;
  DosHeader: TDOSHeader;
  FileStream: TMemoryStream;
  DosHeaderSize: Integer;
begin
  DosHeaderSize := SizeOf(TDOSHeader);
  GetMemoryStream(aFileName, FileStream);
  SetFilePointer(FileStream, 0, nil, fpMoveEnd);
  PEHeader.e_lfNumberOfShells := LowWord(FileStream.Size - DosHeaderSize);
  SetFilePointer(FileStream, 0, nil, fpMoveBegin);
  DosHeader.e_magic := $4550; // 'PE\0'
  DosHeader.e_cp := DosHeaderSize div SizeOf(Word);
  PEHeader.e_cSignature := $FFFF;
  PEHeader.e_lfofData := DosHeaderSize;
  WriteFileStream(FileStream, DosHeader, DosHeaderSize);
  WriteFileStream(FileStream, PEHeader, SizeOf(TPEHeader));
  FileStream.Seek(SizeOf(TDOSHeader), 0);
  WriteFileStream(FileStream, @PEHeader.e_lfofHeapData + SizeOf(Word), SizeOf(Cardinal), $00010000);
  FileStream.SaveToFile(aFileName);
end;

procedure GetMemoryStream(const aFileName: string; var aStream: TMemoryStream);
var
  FileSize: Cardinal;
begin
  aStream := TMemoryStream.Create;
  try
    FileSize := FileSizeOf(aFileName);
    SetLength(aStream, FileSize);
    aStream.LoadFromFile(aFileName);
  except
    on E: Exception do
      raise Exception.CreateFmt('Ошибка чтения файла %s: %s', [aFileName, E.Message]);
  end;
end;

procedure SetFilePointer(var aStream: TStream; const aOffset: Int64; var aCurrentPos: Longint = -1; const aFrom: TSeekOrigin = fpFromBegin): Boolean; stdcall;
begin
  Result := aStream.SetPointer(aOffset, aFrom);
end;

procedure WriteFileStream(var aStream: TStream; const aBuffer: Pointer; const aSize: Longint; const aDefault: Longint = 0);
begin
  if aSize > 0 then
    aStream.WriteBuffer(aBuffer^, aSize, aDefault);
end;

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

Заключение

В статье необходимо подвести итоги и объяснить, как разработчикам Delphi-приложений следует учитывать TSAWARE флаг и возможное влияние TsAppCmd.dll при разработке приложений для терминальных серверов.

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

Контекст относится к проблеме взаимодействия Delphi-приложений с компонентом TsAppCmd.dll в условиях работы на терминальных серверах, где отсутствие TSAWARE флага может приводить к ошибкам в приложениях Office, не поддерживающи


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

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




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


:: Главная :: Рабочий стол ::


реклама


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

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