2013-12-16 11 views
2

Это похоже на простой вопрос, но я после нескольких часов работы над форумами думаю, что это может быть невозможно.конвертировать раннее связывание к позднему связыванию без изменения типа объекта

Я часто хочу преобразовать программу из раннего связывания в позднюю привязку. Обычно это vba, визуальный базовый для приложений, программа, работающая под Excel 2010 и Windows 7 pro.

Для обсуждения остановимся на следующем.

Sub EarlyBind() 
    ' use IDE > Tools > references > and select “Microsoft Internet Controls” 
    Dim shellWins1 as shdocvw.shellwindows 
Line1:  Set shellWins1 = New SHDocVw.ShellWindows 
     MsgBox TypeName(shellWins1) ' this will display “IShellWindows” 
     ' other code that expects to be working with an IshellWindows object ….. 
End Sub 

По моему опыту, преобразование такой программы в позднюю привязку иногда сложно.

Например, я нашел некоторые форумы, которые предлагают изменить его

Set shellwins1 = createobject("Shell.applicaton") 

Но что создает объект IShellDispatch5, а не объект IshellWindows. Это означает, что я должен изменить другой код для размещения нового типа объекта. И, конечно же, я должен проверить этот код для тонких различий.

Итак, моя цель - найти общее решение, которое позволит мне переписать «Line1», чтобы создать тип объекта CORRECT с поздним связыванием. Я хотел бы также, чтобы избежать необходимости установки ссылки на «Интернет управления Microsof Другими словами, я хочу код, чтобы выглядеть следующим образом:. Sub LateBind()

Dim shellWins1 as object 

Line1:  Set shellWins1 = createobject(“xxxxxx.yyyyyy”).zzzzzz 

MsgBox TypeName(shellWins1) ‘ this should display “IShellWindows” 

    ….. other code that expects to be working with an IshellWindows object ….. 

End Sub 

Я знаю, как использовать VBA IDE для найти DLL, связанную с объектом. В этом случае DLL является библиотекой SHDocVw C: \ Windows \ SysWOW64 \ ieframe.dll.

Я установил OleView и могу найти связанные с ним IshellWindows «магические числа» для clsId, TypeLib , и Inteface (например, интерфейс имеет значение 85CB6900-4D95-11CF-960C-0080C7F4EE85).

Но, я не знаю ow как преобразовать их в идентификатор программы, который можно использовать в строке 1 в приведенном выше примере кода.

Я надеюсь, что кто-то здесь может помочь. ------ С помощью Мехоу теперь у меня есть ответ! ------

Для переключения «набор myObj = новый xxxx.yyyyy» до конца связывания для любых типов объектов

Change set myObj = new xxxx.yyyyy 
into set myObj = CreateObject("xxxx.yyyyy") 

Очень часто это будет работать.

Но в некоторых случаях (например, «shDocVw.ShellWindows.») Он дает ошибку 429. Компонент ActiveX не может быть создан.

Когда это произойдет, я ПОЛНОСТЬЮ ИЗ УДАЧИ. Нельзя использовать позднюю привязку к этому классу объектов EXACT. Вместо этого я должен найти заменяющий класс, который делает примерно то же самое. (например, «Shell.Application»).

+0

Возможно, попробуйте [** this **] (http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22489757.html) (* ive никогда не использовал его, чтобы я мог " t рекомендовать *) –

+1

Да, это хорошая ссылка для методов использования Shell.Application в качестве альтернативы shDocVw.ShellWindows. И я успешно использовал эти методы в прошлом. Сегодняшний вопрос был сосредоточен на способах избежать этой альтернативы, но это оказалось невозможным с поздним связыванием. – user3107264

+0

это правильно. Мы попробовали ... –

ответ

1

Ваш короткий ответ

IShellWindows is an interface.

Это

Обеспечивает доступ к коллекции открытых окон Shell.

Поэтому

enter image description here


Посмотрите на CreateObject() method.

Примечание:

Создает и возвращает ссылку на объект СОМ. CreateObject не может использовать для создания экземпляров классов в Visual Basic, если только те классы явно не отображаются как COM-компоненты.

IShellWindows не подвергается как COM-компонент так, поэтому нет никакого способа сказать CreateObject("SHDocVw.IShellWindows")


При открытии реестра (regedit) и поиск ключа типа в IShellWindows. Если вы найдете что-то, что означает, что вы нашли свой идентификатор Prog, и если вы ничего не нашли, это означает, что ничего подобного IShellWindows зарегистрирован как прог Id, поэтому было бы разумно предположить, что вы не можете опоздать на связь IShellWindows

+0

+ 1 Вы в огне; p –

+0

Я уточнил свое первоначальное сообщение, чтобы сказать: «Я также хочу избежать необходимости установки ссылки на« Microsoft Internet Controls ». Имея это в виду, я уверен, что вы теперь я должен понять, почему мне нужно сглазить как Object. Это также делает ошибку, о которой вы упоминаете, уходит. – user3107264

+0

Я новичок на этом сайте. Является ли это подходящим для меня, чтобы отредактировать ваш ответ напрямую? – user3107264

0

Я натолкнулся на ваш вопрос, пытаясь найти что-то для себя. Но я не знаю, испробовали ли вы следующее:

Set shellwins1 = createobject("Shell.Application") 
MsgBox TypeName(shellWins1.Windows) 

Это отвечает на ваш вопрос по типу данных. Он печатает IShellWindows для меня. Я не уверен, хотя, если бы он действительно мог решить вашу цель для позднего смысла, если это будет объект, требуемый, хотя тип данных - это то, что вам нужно.

Итак, я бы посоветовал вам попробовать.

 Смежные вопросы

  • Нет связанных вопросов^_^