Catch MSVCR120 отсутствует сообщение об ошибке в Delphi - PullRequest
0 голосов
/ 22 октября 2018

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

Все было безупречно, пока я не развернул его вслепую в удаленной системе, к которой у меня нет доступа к удаленному рабочему столу.Инструмент сообщил в журналах, что отсутствуют библиотеки SSL.

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

На снимке экрана я вижу модальное окно из процесса csrss.exe с сообщением:

Программа может 't, потому что MSVCR120.dll отсутствует на вашем компьютере.

Окно появилось, несмотря на наличие большого количества блоков try except и обработчика Application.OnException.

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

Как этого добиться?

В текущей реализации TIdHttp.Post вызов просто зависает.

PS Я решил проблему отсутствия DLL, скопировав ее в папку приложения, но у меня вопрос о том, чтобы отловить такие ошибки.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Используя информацию из комментария Реми Лебо, я экспериментировал с функцией SetErrorMode в Delphi 6.

Установка состоит из трех проектов:

  • Хост-приложение, которое связывает абонентаДинамически DLL,
  • вызывающая DLL, которая статически связывает рабочую DLL,
  • и рабочую DLL.

Сначала я помещаю обе библиотеки DLL в папку приложения хоста, тестируючто все работает, а затем удалите рабочую DLL и протестируйте без нее.

Вот код:

Хост-приложение

program MyHost;

uses
  Windows, SysUtils;

var
  hLib: HMODULE;

procedure Box(msg: WideString);
begin
  MessageBoxW(0, PWideChar(msg), 'MyHost Message', 0);
end;

procedure ShowLastError();
begin
  Box('LastError: ' + SysErrorMessage(GetLastError()));
end;

type
  TDoWork = procedure();

var
  DoWork: TDoWork;

begin
  SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    {Without SetErrorMode it displays modal dialog.
     No exception is generated.
     After clicking at [Ok], it goes to "if hLib = 0".
     With SetErrorMode it just goes to "if hLib = 0"}
    hLib := LoadLibrary('CallerLib.dll');
    if hLib = 0 then begin
      ShowLastError();
      Halt(1);
    end;
    try
      @DoWork := GetProcAddress(hLib, 'DoWork');
      if @DoWork <> nil then DoWork();
    finally
      FreeLibrary(hLib);
    end;
  except
    on ex: Exception do Box(ex.ClassName + ': ' + ex.Message);
  end;
end.

Caller DLL

library CallerLib;

uses
  Windows;

//Static linking
procedure Function1(); stdcall; external 'MyLib.dll';
procedure Function2(); stdcall; external 'MyLib.dll';

//To be dynamically linked
procedure DoWork(); stdcall; export;
begin
  Function1();
  Function2();
end;

exports
  DoWork;

end.

Рабочая DLL

library MyLib;

uses
  Windows;

procedure Function1(); stdcall; export;
begin
  MessageBox(0, 'MyDLL.Function1', 'MyDLL', 0);
end;

procedure Function2(); stdcall; export;
begin
  MessageBox(0, 'MyDLL.Function2', 'MyDLL', 0);
end;

exports
  Function1, Function2;

end.
0 голосов
/ 22 октября 2018

Чтобы избежать этой ошибки, вы можете использовать библиотеки DLL OpenSSL, доступные на https://indy.fulgan.com/SSL/

У них нет этой зависимости от MSVCRT.

Или использовать TNetHTTPClient.

Из этого ответа :

TNetHTTPClient был представлен в Delphi XE8.

Наиболее важным преимуществом TNetHTTPClient является то, что он позволяет вашему приложениюподдерживать HTTPS, не предоставляя собственную поддержку SSL / TLS.TNetHTTPClient опирается на поддержку SSL / TLS, предоставляемую операционной системой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...