Как проверить зарегистрирована библиотека в системе или нет?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Как проверить зарегистрирована библиотека в системе или нет?

Сообщение Ruslan Demidow » 25.03.2004 (Чт) 13:48

Моя прожка для создания письма использует Бат или Оутлук по выбору. Для того, чтобы создать сообщение в Outlook я использую библиотеку msoutl.olb из поставки MS Office XP. Но чтобы программа не вылетала при обращении к несуществующей библиотеке - как мне определить - зарегистрирована она в системе или нет?
Ведь кидать библиотеку в каталог программы совсем не хочется.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Как проверить зарегистрирована библиотека в системе или

Сообщение codemaster » 25.03.2004 (Чт) 15:22

Ruslan Demidow писал(а): Но чтобы программа не вылетала при обращении к несуществующей библиотеке - как мне определить - зарегистрирована она в системе или нет?
Ведь кидать библиотеку в каталог программы совсем не хочется.


Обработай ошибку.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Re: Как проверить зарегистрирована библиотека в системе или

Сообщение Ruslan Demidow » 25.03.2004 (Чт) 15:32

codemaster писал(а):
Ruslan Demidow писал(а): Но чтобы программа не вылетала при обращении к несуществующей библиотеке - как мне определить - зарегистрирована она в системе или нет?
Ведь кидать библиотеку в каталог программы совсем не хочется.


Обработай ошибку.


Да обработать ошибку не проблема.
Вопрос немного в другом (я может быть не так сформулировал его):
Эта библиотека регистрируется офисом в реестре Root\typeLib\{00062FFF-0000-0000-C000-000000000046} и т.д.
Меня интересует вопрос - библиотека может зарегистрирована быть по другому пути? Если да, то найдёт ли её моя прога при обращении к ней из кода?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Как проверить зарегистрирована библиотека в системе или

Сообщение codemaster » 25.03.2004 (Чт) 16:39

Это COM Dll насколько я понимаю
Причем тут поиск где она расположена?

Ошибка создания объекта - ответ на твой вопрос можно работать с почтой или нет.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Re: Как проверить зарегистрирована библиотека в системе или

Сообщение Ruslan Demidow » 25.03.2004 (Чт) 17:58

codemaster писал(а):Это COM Dll насколько я понимаю
Причем тут поиск где она расположена?

Ошибка создания объекта - ответ на твой вопрос можно работать с почтой или нет.


Ок. Спасибо за ответ.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.03.2004 (Чт) 18:05

Человек не хочет тупо выполнять какое-то действие и проверять - удалось/не удалось. Он хочет вначале узнать, имеет ли смысл вообще делать это действие.

По теме. GUID всегда будет одинаковый, на любой машине. Но проверять в реестре не самый лучший способ.
Попробуй что-то вроде этого:
Код: Выделить всё
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
...
bSuccess = False
L = LoadLibrary("comdlg32")
If L <> 0 Then
  If GetProcAddress(L, "DllRegisterServer") <> 0 Then bSuccess = True
End If
FreeLibrary L
Debug.Print bSuccess


Смысл в том, что любой саморегистрирующийся COM-объект обязательно имеет процедуру DllRegisterServer. Если не удается найти адрес этой процедуры (или вообще, загрузить библиотеку), то скорее всего msoutl.olb не зарегистрирован в системе и не находится в Path.

Но вообще-то это коряво, наверняка есть более прямой способ.
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 26.03.2004 (Пт) 10:17

alibek писал(а):Человек не хочет тупо выполнять какое-то действие и проверять - удалось/не удалось. Он хочет вначале узнать, имеет ли смысл вообще делать это действие.

Вообще-то да, я это и хотел. Но хотел ещё убедиться, что независимо от того в какую папку пользователь не поставит офис - библиотека моей программой будет использоваться без проблем.

alibek писал(а):По теме. GUID всегда будет одинаковый, на любой машине.

Вот. Вот что мне нужно было узнать.

alibek писал(а):Но проверять в реестре не самый лучший способ.
Попробуй что-то вроде этого:
Код: Выделить всё
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
...
bSuccess = False
L = LoadLibrary("comdlg32")
If L <> 0 Then
  If GetProcAddress(L, "DllRegisterServer") <> 0 Then bSuccess = True
End If
FreeLibrary L
Debug.Print bSuccess


Смысл в том, что любой саморегистрирующийся COM-объект обязательно имеет процедуру DllRegisterServer. Если не удается найти адрес этой процедуры (или вообще, загрузить библиотеку), то скорее всего msoutl.olb не зарегистрирован в системе и не находится в Path.

Но вообще-то это коряво, наверняка есть более прямой способ.

Думаю что есть. Но то что ты предложил, для меня на данный момент (пока я начинающий) громоздко и немного непонятно. :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.03.2004 (Сб) 8:12

Думаю, что сей способ неверен :roll:
LoadLibrary не является COM-функцией и имеет внутренний порядок поиска указанной библиотеки:
  1. Стартовый каталог приложения
  2. Текущий каталог приложения
  3. windows\system
  4. windows
  5. пути из переменной PATH

Таким образом, если искомая библа физически есть по одному из указанных мест, то мы сделаем вывод, что она зарегистрирована, в то время как она может и не быть зарегистрирована.

Так что наверное всё же нужно использовать позднее связывание в этом случае :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 29.03.2004 (Пн) 8:51

GSerg писал(а):Думаю, что сей способ неверен :roll:
LoadLibrary не является COM-функцией и имеет внутренний порядок
=-=- skip =-=-=-=
Так что наверное всё же нужно использовать позднее связывание в этом случае :roll:

Я сделал по первому совету: при начале работы программы пробую создать объект - если ошибка - значит библиотека не зарегистрирована.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 63

    TopList  
cron