Как проверить, загружен ли MIDAS.DLL?

Я использую Datasnap на Delphi 2007. На некоторых конкретных машинах, когда пользователь пытается открыть приложение, он получает ошибку «Ошибка загрузки Midas.DLL», и приложение аварийно завершает работу.

Я никогда не мог определить, в каком сценарии это происходит, потому что я всегда распространяю MIDAS.DLL со своими приложениями, и этот файл всегда находится в той же папке, что и EXE-файл приложения.

Я знаю, что мог бы использовать MidasLib, чтобы избежать этого, но я не могу этого сделать, потому что мое приложение использует защиту от взлома, которая шифрует EXE и в конечном итоге не совместимо со встроенным Midaslib. Так что Midaslib для меня не вариант.

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

Вот что я пробовал:

function testMidas : boolean;
var c : tclientdataset;
begin
try 
c := tclientdataset.create(nil);
c.loadfromfile('c:\somefile.dat');
c.free;
result := true;
// everything fine
except
result := false;
// problem, do something to fix
end;
end;

Эта функция работает, она завершится ошибкой, если Midas.dll не загружен и результат будет ложным, поэтому я могу что-то сделать, чтобы решить проблему. НО я хочу получить тот же результат без вызова «loadfromfile». Только создание TClientDataset не приведет к возникновению исключения.

Любые идеи, пожалуйста?

Спасибо!


person delphirules    schedule 18.03.2019    source источник
comment
GetModuleHandle('midas.dll') сообщит вам, загружена ли в данный момент DLL в вызывающем процессе или нет. Кстати, когда LoadFromFile() терпит неудачу, вы теряете TClientDataSet.   -  person Remy Lebeau    schedule 18.03.2019
comment
Лол, верно, я тоже буду .free, кроме :P   -  person delphirules    schedule 19.03.2019
comment
Вместо этого лучше использовать try..finally   -  person Remy Lebeau    schedule 19.03.2019


Ответы (2)


Delphi определяет, откуда загрузить Midas.Dll, изучая раздел реестра. Взгляните на исходный код CheckDBClient в DSIntf.Pas, который должен находиться в вашей папке [Delphi\Source\VCL.

Вы увидите, что эта подпрограмма CheckDBClient генерирует исключение, которое вы видите, поэтому на самом деле нет необходимости проверять, загружен ли Midas.Dll, хотя вы можете использовать метод, предложенный Реми в комментарии, для проверки значения глобальной переменной DbClientHandle, которая инициализируется (или нет) CheckDbClient.

CheckDBClient вызывается через CreateDbClientObject при вызове TCustomClientDataSet.CreateDSBase в DBClient.Pas.

Чтобы исправить ошибку, зарегистрируйте Midas.Dll из командной строки, используя TRegSvr.Exe Delphi или RegSvr32 Windows. Или вы можете зарегистрировать его самостоятельно в стартовом коде вашего проекта. Delphi поставляется с исходным кодом TRegSvr (проверьте папку [delphi]\demos\activex), чтобы вы могли сами увидеть, как он выполняет процесс регистрации.

person MartynA    schedule 18.03.2019
comment
Глобальная переменная DbClientHandle недоступна за пределами устройства Datasnap.DSIntf.pas - person Chau Chee Yang; 26.09.2019

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

function testMidas : boolean;
var c : tclientdataset;
begin
try 
c := tclientdataset.create(nil);
c.FieldDefs.Add('test', ftString, 20);
c.createdataset;
c.open;
c.free;
result := true;
// everything fine
except
c.free;
result := false;
// problem, do something to fix
end;
end;

Кстати, я рад, что когда я публикую вопрос о Delphi, всегда есть ответы, что указывает на то, что Delphi все еще жив и здоров, несмотря на то, что многие люди продолжают говорить, что он мертв :)

person delphirules    schedule 18.03.2019
comment
Что делать, если создание c не удается, вы получаете AV в блоке исключений, помещаете строку создания за пределы блока try - кроме блока и выбираете использование try - finally, где вы освобождаете c в блоке finally - person Nasreddine Galfout; 19.03.2019