Это похоже на простой вопрос, но я после нескольких часов работы над форумами думаю, что это может быть невозможно.конвертировать раннее связывание к позднему связыванию без изменения типа объекта
Я часто хочу преобразовать программу из раннего связывания в позднюю привязку. Обычно это 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»).
Возможно, попробуйте [** this **] (http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22489757.html) (* ive никогда не использовал его, чтобы я мог " t рекомендовать *) –
Да, это хорошая ссылка для методов использования Shell.Application в качестве альтернативы shDocVw.ShellWindows. И я успешно использовал эти методы в прошлом. Сегодняшний вопрос был сосредоточен на способах избежать этой альтернативы, но это оказалось невозможным с поздним связыванием. – user3107264
это правильно. Мы попробовали ... –