XE6 ClientDataSet AV пытается загрузить данные из Firebird

У меня есть минималистский проект с FireDac FDConnection и FDSqlQuery, DataSetProvider и ClientDataSet, пытаясь получить доступ к примеру Employee.FDB, который поставляется с пакетом Firebird 2.5, который я загрузил от SourceForge сегодня.

Все настроено на значения по умолчанию, поскольку они выходят за пределы палитры, кроме имени базы данных, на вкладке "Всплывающая информация" FDConnection и FDQuery Sql, которая установлена ​​на select * from employee.

FDQuery открывается отлично, но как только я пытаюсь для открытия CDS, в среде IDE или запуска моего приложения, я получаю нарушение прав доступа.

Это все мой код:

FDQuery1.Open;
 Caption := IntToStr(FDQuery1.RecordCount); // this shows 42 on the form caption
 CDS1.Open; // AV here

Итак, FDQuery открывается нормально, но CDS не делает.

Во время выполнения исключение происходит здесь:

function TCustomClientDataSet.CreateDSBase: IDSBase;
 begin
 CreateDbClientObject(CLSID_DSBase, IDSBase, Result);
 Check(Result.SetProp(dspropANSICODEPAGE, DefaultSystemCodePage)); <-- Exception here
 Check(Result.SetProp(dspropUTF8METADATA, **********(True)));
 Check(Result.SetProp(dspropUTF8ERRORMSG, **********(True)));
 end;

Исключением msg является

Проект FBTest1 поднял класс исключений $C0000005 с сообщение 'access vioaltion на 0x0075d05b: чтение адреса 0x00000000'.

В IDE я получаю аналогичное исключение, если я пытаюсь установить Active = True на CDS, которое сообщение было записано в DSnap200.Bpl.

В первый раз, когда это произошло во время выполнения, у меня появилось какое-то всплывающее сообщение "Инцидент" предлагая сообщить об этом Embarcadero. Впервые я это видел.

Если я заменил SqlConnection и SqlQuery для компонентов FDac, я получаю та же ошибка.

Итак, я думаю, мой вопрос заключается в том, может ли CDS быть спровоцированным таким поведением, просто используя параметры свойств по умолчанию для проекта так же просто, как этот, то есть я пропустил шаг или, скорее всего, это вещь EMBA QC?

1 ответ

Решено! Благодаря предложению Graymatter попробовать использовать MidasLib, у меня есть в нижней части проблемы и исправил ее, чтобы приложение теперь работает с помощью Midas.Dll. Я отправляю это как ответ, а не комментарий, во-первых, потому что он слишком длинный для этого, но, что более важно, причина была довольно странной, и решение может помочь любому другому, кто сталкивается с проблемой.

Во-первых, я пробовал использовать MidasLib, и приложение работает нормально, без AV, о котором идет q.

Итак, заверил, что проблема не возникает с текущим кодом MidasLib, я пошел назад, чтобы попытаться заставить приложение работать с Midas.Dll. Я проверил Midas.Dll версии в каталоге XE6 bin и \Windows\SysWOW64, и оба они были как я ожидал, 20.0.16277.1276 от 16 июня 2014 года.

Отслеживание в CheckDBlient в DataSnap.DSIntf и наблюдение тщательно, копейки упал, и я понял, что происходит:

procedure CheckDbClient(const CLSID: TGUID);
[...]
begin
 [...]
 if DbClientHandle = 0 then
 begin
 Size := 256;
 SetLength(FileName, Size);
 if RegQueryValue(HKEY_CLASSES_ROOT, PChar(Format('CLSID\%s\InProcServer32',
 [GUIDToString(CLSID)])), PChar(FileName), Size) = ERROR_SUCCESS then
 SetLength(FileName, Size) else
 begin
 [...]
 end;
 DbClientHandle := LoadLibrary(PChar(FileName));

Это получает путь к Midas.Dll из ключа InProcServer при регистрации, и это не указывал на каталог XE6 bin или SysWOW64, но в другое место, которое не было моего создания и в котором содержалась версия Midas.Dll, датированная с 2007 года. Как ни странно, в отличие от копии, которую я имею в Dll, датируемой эпохой D7, эта Dll не имеет информации о версии на своей странице свойств, но имеет дату создания 9 августа 2002 года и размер файла 351 КБ.

Итак, как только я обнаружил, что исправление проблемы было так же просто, как переименование этой Dll, так что ОС не загрузит его и не перерегистрирует версию в SysWOW64.

Где изгнанник Midas.Dll пришел не ясно, но он, безусловно, прибыл с тех пор на прошлой неделе, потому что это не в резервной копии, которую я, случается, с прошлым вечером в четверг.

Единственное, что я установил с тех пор, это несколько утилит сторонних GUI для управление/доступ к базам данных Access, IB и Firebird, поэтому виновник, похоже, был один из них.

licensed under cc by-sa 3.0 with attribution.