Как сделать максимально быструю проверку на наличие COM DLL?

Тема в разделе "WASM.WIN32", создана пользователем jangle, 22 июл 2007.

  1. jangle

    jangle New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    56
    Адрес:
    Russia
    Господа, подскажите как сделать проверку на наличие DLL файла.
    Моя прога, использует определенную COM DLL из папки WINNT/System32, если этой DLL нет на компе пользователя, она распаковывает ее из своих ресурсов в System32 и регистрирует ее в реестре. Встал вопрос, как максимально быстро, проверить есть эта библа. Нашел такие методы:

    1. Поиск файла функцией SearchPathA
    2. Загрузка DLL функцией LoadLibrary, если вернет 0, ее нет на компе.
    3. Поиск ProgID DLL в реестре.

    Какой способ проверки будет максимально быстрым? Может есть еще и другие методы?
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    вероятнее всего - LoadLibrary
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Если это действительно СОМ-библиотека, то она не обязана быть в библиотечных путях. Так что единственно верным будет получение пути к библиотеке через реестр: "ProgID":CurVer -> "ProgID.1":CLSID -> CLSID:InProcServer32. Кстати, если библиотеки нет, то она и не будет зарегистрирована в реестре (если корерктно удаляли).
     
  4. jangle

    jangle New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    56
    Адрес:
    Russia
    Но если библиотеку стерли вручную, а ссылки в реестре остались, этот метод не даст правильного ответа. Значит надо все равно, проверять наличие DLL на диске, в таком случае, что лучше использовать SearchPathA или LoadLibrary?
    SearchPathA - кажется будет работать быстрее
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    jangle
    1. Зная ProgID узнай путь к dll
    2. есть ли по этому пути dll ?
    3. Проверка, вдруг dll имеет схожее название но COM-сервером не является?

    как отличить обычную Dll от COM`овской ? Очень просто, почти во всех есть АПИ по регистрации\анрегистрации это библы, т.е. DllGetClassObject, etc
     
  6. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    В идеале это должен делать инсталлятор программы.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    GetSystemDirectory()
    GetFileAttributes()