createObject в VB6 не работает при запуске exe

У меня есть программа VB6, которая пытается запустить DLL, написанную на C #.
Эта DLL имеет интерфейс COM, поэтому я могу создать в ней объект класса с помощью CreateObject. Проблема в том, что он запускается и работает хорошо, когда я запускаю его из VB6 IDE, но когда я создаю EXE и пытаюсь запустить его, он выдает исключение:
«Ошибка автоматизации. Система не может найти указанный файл ( -2147024894) ".

Почему это происходит и как это решить?


person La La La    schedule 05.06.2011    source источник
comment
Какая ОС? Вы используете IDE с повышенными привилегиями или скомпилированную программу от имени стандартного пользователя? Можете ли вы показать небольшую процедуру, в которой это не удается, то есть какой-то код, но не фрагмент кода, в котором отсутствуют важные детали? Включите, пожалуйста, объявление переменной ссылки на объект, чтобы мы могли видеть, выполняете ли вы позднюю привязку или раннюю привязку.   -  person Bob77    schedule 05.06.2011


Ответы (4)


Посмотрите Project, References в IDE и посмотрите, какой файл dll или ocx принадлежит объекту, на который вы ссылаетесь с помощью CreateObject (диспетчер объектов также может помочь выяснить). Этот файл dll должен быть доступен и при компиляции exe. Обычно вам необходимо зарегистрировать его с помощью regsvr32.exe.

person stracktracer    schedule 05.06.2011

Метод, который я использую для выявления проблем этого типа, заключается в открытии диалогового окна добавления ссылки в Visual Basic 6. Я прокручиваю список доступных COM-библиотек и смотрю, есть ли в нем проблемная DLL. Если это так, CreateObject должен работать, вы должны иметь возможность назначить ему вариантный вариант и использовать позднее связывание для доступа к его членам.

Кроме того, попробуйте временно установить ссылку на переменную и вместо использования CreateObject используйте = New и посмотрите, какие сообщения об ошибках, если таковые имеются, он выдает. В общем, я обнаружил, что они более информативны, чем те, что создает CreateObject.

Наконец, будет полезно, если вы опубликуете причину, по которой вы решили использовать CreateObject вместо установки ссылки. Если DLL является известным объектом, который будет постоянно использоваться программой, тогда должна быть установлена ​​ссылка и обычно используется раннее связывание.

Наконец, возможно, что ошибка возникла из-за зависимости C # COM DLL, а не самой DLL. Если, например, я должен был взять Com-библиотеку и должным образом зарегистрировать ее, но она полагается на COM-библиотеку Widget2000 и НЕ зарегистрирована, то это вызовет ошибку автоматизации. Особенно, если вы тестируете EXE в установленной среде, а не в среде, в которой вы его выполняли.

Например, предположим, что у меня есть программа САПР, написанная на VB6, и у меня есть дерево исходных текстов, которое начинается с MyCAD. EXE находится в MyCAD / MainEXE, а библиотека форм находится в MyCAD / ShapeLibrary. Запускаю IDE все нормально. Затем я выполняю настройку, перехожу к своей тестовой машине и устанавливаю ее, и она вызывает ошибку при создании shapelibrary.

Первым делом я бы проверил, будет ли MainEXE запускаться прямо из каталога MainEXE моего дерева исходных текстов. Этот тест позволит исключить, является ли это проблемой установки или причудой среды IDE по сравнению с соответствующей версией. Затем я смотрел на настройку и смотрел, что не регистрируется. Также посмотрите либо исходный код библиотеки C #, либо настройку библиотеки и посмотрите, какие зависимости ей нужны. Поскольку это согласованная COM-DLL, вы должны иметь возможность использовать инструмент обходчика зависимостей, чтобы узнать, какие COM-ссылки ему нужны. Наконец, убедитесь, что установлена ​​правильная версия .NET framework.

person RS Conley    schedule 06.06.2011

Если вы компилируете C # DLL на своем тестовом компьютере - убедитесь, что вы отметили зарегистрируйтесь для настройки COM-взаимодействия. Если вы компилируете не на одном компьютере, вам необходимо запустить RegAsm с параметром / codebase.

person Matt Wilko    schedule 08.06.2011

попробуйте скомпилировать его как установщик и включить dll / com, который вы используете при компиляции пакета установщика, чтобы используемая вами dll / com была включена в компиляцию вашего exe .., и установите его в окнах, а не просто скопируйте его.

person rekcah101    schedule 23.06.2011