Member 14150748 Ответов: 3

Делфи 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-объектам, вы можете увидеть, установлены ли они на одной машине, но не на другой.

3 Ответов

Рейтинг:
6

Member 14150748

Окончательно решить.

Библиотека dll отсутствовала. Это одно устанавливается другим приложением, сделанным теми же людьми, которые сделали то, над которым я работаю. Не знаю точно, какой именно, попробую выяснить позже.


Мы узнали об этой ошибке, потому что, когда мой босс работал над пустой виртуальной машиной (XP), он столкнулся с той же проблемой. Потом он вспомнил о другом заявлении.

Спасибо за вашу помощь.


Рейтинг:
2

Member 14150748

Я сделал небольшой проект на C#, чтобы протестировать dll

using System;
using AETK_LIB; // <-- This one

namespace dllTest
{
    class Program
    {
        static void Main(string[] args)
        {
            AUTPARENT params = new AUTPARENT();
            short AV9 = 0, AV17 = 0, AV16 = 0;
            System.Array AV14, AV15, AV12, AV13;
            AV12 = AV14 = AV13 = AV15 = null;
            try
            {
                params.GetData(AV9, AV14, AV15, AV17, AV12, AV13, AV16);
                Console.WriteLine("Done");
            }
            catch (Exception Ex) { Console.WriteLine(Ex.Message); }
            finally { Console.WriteLine("Terminated"); }
            Console.ReadKey();
        }
    }
}


Вставил библиотеки DLL gx в папку SysWow64 (они не могут быть зарегистрированы, потому что они не COM) и предположил....

Компонент ActiveX не может создать объект

Так что... по какой-то причине эта dll испытывает проблемы на моем компьютере, но не на моем боссе...


Member 14150748

Установил все на свой персональный компьютер, чтобы проверить, была ли проблема с разрешением, и все же я получил ту же проблему (там у меня есть Win 7)

Это становится странным.... Кончаются идеи.

Рейтинг:
1

CHill60

Взгляните на набор инструментов SysInternals Sysinternals Suite - Windows Sysinternals | Microsoft Docs[^Я думаю, что тот, который вам нужен, - это ProcMon-вы сможете сказать, к чему пытается получить доступ COM-объект, и точно определить, чего не хватает.

Также убедитесь, что вы используете правильную версию regsvr32 для версии Delphi (32 бит находится в SysWOW64, который обычно не находится на пути)


Member 14150748

Ладно, попробую. О regsvr я использую как в моем win 10, так и, конечно же, xp на виртуальной машине имеет только 1 версию.

Проверял dll файлы с помощью иллюстратора функциональных зависимостей. Он говорит, что некоторые dll-файлы отсутствуют, но они связаны с Win_CORE и тому подобным (и они не пытаются получить их по отдельности). Это странно.

Я дам ЮУ знать, как это происходит с Прокмоном

Member 14150748

Используется procmon и. Я получил кучу "имя не найдено" или "быстрый ввод-вывод запрещен" и "файл заблокирован только с помощью считывателей"


Заметил, что некоторые файлы связаны с реестром (InprocServer32, InprocHandler, AppID и т. д.) Пара в папке OLE и даже хлопотное имя dll, но с расширением .ini.

F-ES Sitecore

Вероятно, вам нужно что-то, что позволит вам контролировать доступ к реестру. Чтобы создать объект ActiveX, он запросит реестр, чтобы узнать, где живут библиотеки DLL и т. д., и один из этих reg-запросов будет неудачным, так как нужного вам компонента там не будет.

CHill60

Хороший крик! Я предложил RegMon (что я должен был сделать в первую очередь :doh:)

CHill60

Хорошая идея от @Ф-Эс-технологического оборудования … Я должен был указать вам на инструмент RegMon в том же наборе.

Member 14150748

Проверил с Regmon (пришлось скачать его аппарт, так как его не было в люксе). Тот же результат и с модулями реестра (handle, inproc и т. д.) По крайней мере, это позволило мне определить, какая папка связана с проблемной DLL

Теперь я еще больше запутался. Так как я вижу модули в regedit, то почему же монитор говорит, что не найден? Возможно, не хватает разрешений пользователя?

CHill60

Хм - возможно. Но тогда я ожидал бы проблем с их просмотром в regedit. У меня заканчиваются идеи tbh (я ненавижу такие проблемы :-( так что я действительно сочувствую вам )

Member 14150748

Перепроверив реестр, я нашел эту строку:

MyApp.exe запросить значение HKLM\программное обеспечение\Майкрософт\имя mssqlserver\клиент\подключения\localdb с\именем sqlexpress не найдено


Возможно, проблемы с базой данных?


Отредактировано: еще одна вещь, которая привлекла мое внимание:

MyApp.exe OpenKey HKCC\Software\GeneXus\GXData\Config не найден

(Хлопотный доступ dll к GxData81.dll)

CHill60

Поэтому я бы сейчас попробовал приложение Services, чтобы остановить/перезапустить службу SQLExpress (не могу точно вспомнить, как она называется в моей голове), а не агент, который является отвлекающим маневром от отзыва. У меня также было столкновение между localdb и SQL-клиентом в прошлом, но я не могу вспомнить точные детали... Я испортил установку Express поверх моего SQL 2008. Вы уверены, что у вас есть именованный экземпляр под названием "SQLExpress"? (Теперь мне интересно, чувствителен ли он к регистру)

Member 14150748

Конечно. Пришлось настроить источник данных ODBC (разместил его в Сети unstead пользователя). Там я проверил связь с БД.