Документация запутанная, но правильная. Страница MSDN, на которую вы ссылаетесь, помогает объяснить, почему ваш GetObject
вызов не выдает ошибку:
Если путь [ первый аргумент ] является строкой нулевой длины
(""), GetObject возвращает новый объект
экземпляр указанного типа. Если
аргумент пути не указан,
GetObject возвращает текущий активный
объект указанного типа. Если нет
объект указанного типа существует,
происходит ошибка.
Это тонко, но подразумевается, что
GetObject "", "ProjectName.ClassName
фактически эквивалентно
CreateObject "ProjectName.ClassName"
То есть передача пустой строки первому параметру GetObject
заставляет его работать точно так же, как CreateObject
, что означает, что он создаст новый экземпляр класса, а не вернет ссылка на уже работающий экземпляр.
Возвращаясь к отрывку MSDN, он упоминает, что полное пропускание первого аргумента для GetObject
приведет к тому, что GetObject
вернет ссылку на уже запущенный экземпляр, если он существует. Такой вызов будет выглядеть так:
GetObject , "ProjectName.ClassName" 'Note nothing at all is passed for the first argument'
Однако, если вы попытаетесь это сделать, вы сразу же получите ошибку во время выполнения. Это тот случай использования, на который ссылается документация, когда говорится, что GetObject
не работает с классами, созданными с помощью VB6.
Причина, по которой это не работает, заключается в том, как GetObject
выполняет свою магию. Когда первый параметр опущен, он пытается вернуть существующий экземпляр объекта, обращаясь к таблице запущенных объектов (ROT), таблице поиска на уровне компьютера, которая содержит запущенные объекты COM. Проблема заключается в том, что объекты должны быть явно зарегистрированы в таблице запущенных объектов процессом, который их создает, чтобы быть доступными для других процессов - среда выполнения VB6 не регистрирует классы ActiveX EXE в ROT, поэтому GetObject
не имеет способ получить ссылку на уже работающий экземпляр.