Как проверить, загружен ли MIDAS.DLL? - PullRequest
1 голос
/ 18 марта 2019

Я использую 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 не создаст исключение.

Есть идеи, пожалуйста?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

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

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

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

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

0 голосов
/ 19 марта 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 все еще жив и здоров, несмотря на то, что многие люди продолжают говорить, что он мертв :)

...