vb6: доступ к значениям реестра - PullRequest
0 голосов
/ 26 октября 2010

Я пишу простую кнопку vb6, которая проверяет доступ к значениям реестра.

У меня есть следующее:

Private Function registry_read(key_path, key_name) as variant

Dim registry as object
set registry = CreateObject("WScript.shell")
registry_read = registry.regread(key_path & key_name)
End function 

Private Sub Command1_Click()
MsgBox registry_read("HKEY_LOCAL_MACHINE\SOFTWARE\PROCESS\frmMain_Values\", "Version")
end Sub

У меня есть Project Menu -> References и выберите выбранную библиотеку Microsoft WMI Scripting V1.1 ссылка на объектную модель хоста сценария Windows

однако мой msgbox все еще пуст. Я проверил путь в реестре, и он правильный. есть идеи?

спасибо заранее.

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Вы должны закомментировать строку «возобновить сообщение об ошибке далее» во время разработки.Если произошла ошибка, вы не сможете увидеть детали.Это может быть not found или access denied и т. Д.

Также есть два способа ссылки на объект.Раннее связывание, т.е. Dim rs as new adobdb.recordset и позднее связывание set rs = CreateObject("Adodb.recordset").Первый метод (раннее связывание) заставляет вас объявлять ссылку, а второй (поздний) - нет.У обоих есть свои преимущества и недостатки (т.е. раннее связывание происходит быстрее, дает смысл, упрощает отладку и т. Д.) http://word.mvps.org/faqs/interdev/earlyvslatebinding.htm

0 голосов
/ 29 октября 2010

@ bugtussle Хотя ваши утверждения верны, утверждения wqw также. Используете ли вы ключевое слово New или CreateObject, на самом деле не имеет ничего общего с ранним или поздним связыванием объекта. Важно то, объявляете ли вы переменную объекта с зарегистрированным типом или нет. Я полагаю, что вы действительно правильно объясняете это в своей статье.

Я хотел бы также упомянуть, что ваша статья написана хорошо и содержит хорошую информацию, но ИМХО содержит также несколько незначительных неточностей. То, что вы называете «двойным интерфейсом» в своей статье (и хорошо объясняете), обычно называется «vTable» или «очень ранним». VB6 поддерживает привязку vTable, где это возможно.

Теперь, как вы сказали, единственное требование к COM-классу - это то, что класс должен реализовывать iUnknown. «Двойной интерфейс» просто означает COM-класс, который реализует как iUnknown, так и iDispatch: COM-класс, который поддерживает позднюю привязку, должен реализовывать последний. VB напрямую не поддерживает COM-объекты, которые не реализуют iDispatch (имея некоторые COM-классы, которые не поддерживают позднюю привязку, а некоторые, которые делают, было бы довольно проблематично в VB); другими словами, VB поддерживает только COM-классы, которые реализуют двойной интерфейс. (Тем не менее, есть приемы, использующие сообщение SendMessage GETOLEINTERFACE, которые обходят требование.)

Кроме того, не совсем то, что iUnknown вообще обойдено, это то, что iUnknown.QueryInterface () обходят, вместо этого переходя непосредственно к виртуальной таблице. Конечно, iUnknown.AddRef () по-прежнему вызывается.

Относительно New против CreateObject: VB имеет стратегию оптимизации для классов, определенных в проекте, которые создаются в этом проекте с использованием ключевого слова New. Однако между ними есть и важные различия, если вы используете класс вне контекста проекта; эта страница http://msdn.microsoft.com/en-us/library/Aa241758 хорошо их обобщает.

Мне также любопытно узнать, какую ошибку получил ОП. :)

...