Делфи 7 и Проблемы элементов ActiveX
Приветствия. Это опять я.
Я пытаюсь решить эту проблему почти месяц назад. Надеюсь, вы мне поможете: я установил Delphi 7, потому что мне нужно работать в проекте для клиента. Программа уже сделана кем-то другим, просто нужно будет добавить новые функции. Он использует сторонние библиотеки DLL и работает с базой данных SQL (конечно, эта база данных также установлена на моем компьютере).
Моя главная проблема заключается в том, что когда я вызываю одну из dll-библиотек, она постоянно выдает мне ошибку "ActiveX не может создать компонент". Я долго искал решение, но, к сожалению, не могу его найти.
Код длинный, но я поставлю сегмент, где происходит ошибка:
procedure TFrm_Ent.Parameters(); var cEMP, dEMP, cBAS, dBAS : PSafeArray; i : longint; s : WideString; c : Currency; caEMP, caBAS : Smallint; begin SafeArrayAllocDescriptor(1,cEMP); cEMP.rgsabound[0].lLbound := 0; cEMP.rgsabound[0].cElements := 15; cEMP.cbElements := sizeof(c); cEMP.fFeatures := $0006; SafeArrayAllocData(cEMP); SafeArrayAllocDescriptor(1,dEMP); dEMP.rgsabound[0].lLbound := 0; dEMP.rgsabound[0].cElements := 15; dEMP.cbElements := 4; dEMP.fFeatures := $000C; SafeArrayAllocData(dEMP); SafeArrayAllocDescriptor(1,cBAS); cBAS.rgsabound[0].lLbound := 0; cBAS.rgsabound[0].cElements := 15; cBAS.cbElements := sizeof(c); cBAS.fFeatures := $0006; SafeArrayAllocData(cBAS); SafeArrayAllocDescriptor(1,dBAS); dBAS.rgsabound[0].lLbound := 0; dBAS.rgsabound[0].cElements := 15; dBAS.cbElements := 4; dBAS.fFeatures := $000C; SafeArrayAllocData(dBAS); Frm_P.Params.GetData(bNum,cEMP,dEMP,caEMP,cBAS,dBAS,caBAS); {error} {other sentences} end;
Ошибка возникает, когда я вызываю GetData (bNum исходит из другой библиотеки dll)
Когда я отслеживаю, после ошибки ocurrs он нацеливается на следующий сегмент в System.pas:
asm TEST EAX,EAX JNS @@2 MOV ECX,SafeCallErrorProc TEST ECX,ECX JE @@1 MOV EDX,[ESP] CALL ECX @@1: MOV AL,reSafeCallError {here} JMP Error @@2: end;
Дело вот в чем.... на моем боссе ПК он работает отлично.
Что я уже пробовал:
1) Регистрация/отмена регистрации библиотек DLL
2) Удаление/переустановка SQL Server (с использованием 2008 R2)
3) Изменение настроек SQL
4) изменение версии delphi (мой установщик, а затем мой босс')
5) вставка папки Delphi с компьютера босса на мой, чтобы получить его настройку
6) Регистрация/отмена регистрации MSRDO20.DLL (есть версия 6.... что-то). Также попробовал с 40-м номером.
7) направьте ODBC на мой компьютер босса, если это моя база данных. Результат хуже (не могу даже открыть его, потому что пользователь, кажется, установлен как локальный в сторонней dll)
8) использование VirtualBox с Win XP (реальная ОС-Win 10 64)
9) проверка папки SysWOW64 для выполнения регистрации propper.
10) проверьте журнал событий Windows (там ничего не показано....)
11) проверил проблемы с реестром с помощью CCleaner...
Ничего из этого не работает. И я не знаю, что еще делать. Я только могу подозревать, что моя проблема заключается либо в SafeArray (возможно, отсутствующая DLL, кроме ActiveX?), либо в огромной проблеме в моей БД (хотя она отлично работает, доступна даже в сети).
Кто-нибудь поможет?
F-ES Sitecore
Если он работает на одном компьютере, но не на другом, то, скорее всего, ваш код опирается на COM-объект, который не зарегистрирован на машине, где он не работает, как и говорится в сообщении. К сожалению, нет никакого реального способа узнать, какой именно, он может быть даже вторичным, так что ClassA, но вызовите ClassB внутренне, но ClassB не зарегистрирован, но ClassA в порядке. Есть ли у этого приложения какой-то установщик? Если COM-объекты, используемые приложением, имеют свой собственный префикс или схему именования, вы можете использовать реестр для сравнения того, что установлено на обеих машинах (в разделе "ключ"), чтобы увидеть, отсутствует ли что-то очевидное.
Member 14150748
"Если он работает на одном компьютере, но не на другом, то, скорее всего, ваш код полагается на COM-объект, который не зарегистрирован на машине, где он не работает, точно так же, как говорится в сообщении." Всегда так думал. Пропал реестр или что-то в этом роде.
"это может быть даже вторичный, так что ClassA, но вызовите ClassB внутренне, но ClassB не зарегистрирован, но ClassA в порядке." Может быть. У меня нет исходного кода библиотек DLL, но я знаю, что один из них вызывает другой (gxdata81.dll). Пытался зарегистрировать этот файл, но дал мне ошибку, потому что это не допустимый COM (regasm ни работает)
"Есть ли у этого приложения какой-то установщик?" Нет.
"Если COM-объекты, используемые приложением, имеют свой собственный префикс или схему именования, вы можете использовать реестр для сравнения того, что установлено на обеих машинах (под ключом), чтобы увидеть, отсутствует ли что-то очевидное." Не уверен насчет этого. Как я могу проверить это без кода sorce? У меня нет опыта в этом деле. И кто-то предложил мне тоже проверить реестр, но я нашел только несколько папок со странными буквенно-цифровыми названиями.
F-ES Sitecore
Корень классов содержит дочерний элемент для каждого установленного COM-объекта. Таким образом, вы увидите такие вещи, как ADODB.Recordset и ADODB.Командование там. Есть также инструменты, которые вы можете скачать, которые покажут вам все зарегистрированные COM-объекты в системе (VS действительно может сделать это, если вы добавите ссылку, есть вкладка COM, которая показывает эту информацию). Традиционно вашим объектам присваивается один и тот же префикс (например, ADODB выше), поэтому, если вы можете найти префикс, который это приложение дает своим COM-объектам, вы можете увидеть, установлены ли они на одной машине, но не на другой.