На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Регистрация dll
    Доброе время суток
    Помогите пожалуйста :rolleyes: :rolleyes:
    Написал свой компонент. Пытаюсь его регистрировать - модуль загружен , но точка входа DLLRegisterServer не найдена.
    Перепробовал:
    c:\Windows\SysWOW64\regsvr32.exe *.dll
    c:\Windows\System32\regsvr32.exe *.dll
    отключил UAC
    :wall:
    Компонент писал по книге InsideCOM
    Взял пример из книги
    Скрытый текст

    ExpandedWrap disabled
      LIBRARY         Cmpnt.dll
      DESCRIPTION     'Chapter 7 Example COM Component (c)1996-1997 Dale E. Rogerson'
       
      EXPORTS
                      DllGetClassObject   @2  PRIVATE
                      DllCanUnloadNow     @3  PRIVATE
                      DllRegisterServer   @4  PRIVATE
                      DllUnregisterServer @5  PRIVATE


    В результате та же хрень ток боком!!!! >:(
    Написал свой регистратор для этого примера - увидел, что я не могу загрузить DllRegisterServer :unsure:
    С чем это связано? Подскажите пожалуйста
      Есть такой спецификатор __declspec(dllexport). Вероятно MS-компилятору нужен этот спецификатор, либо правильно указывать def-файл при сборке.
        Цитата agapUP @
        С чем это связано? Подскажите пожалуйста

        Проверял таблицу экспорта?
          Доброе время суток
          ... снес я vs2017 и установил 19-ю... код примера тот же!
          Но теперь, используя *.def я вижу "STDAPI DllRegisterServer()" и "STDAPI DllUnregisterServer()"
          DllGetClassObject и STDAPI DllCanUnloadNow() - некорректная аннотация и они игнорируются :unsure:

          Цитата B.V. @
          Проверял таблицу экспорта?

          Это выявил с помощью
          ExpandedWrap disabled
            HMODULE lib = LoadLibraryEx("prCh7incom/Debug/prCh7incom.dll ", NULL, DONT_RESOLVE_DLL_REFERENCES);
                assert(((PIMAGE_DOS_HEADER)lib)->e_magic == IMAGE_DOS_SIGNATURE);
             
                PIMAGE_NT_HEADERS header = (PIMAGE_NT_HEADERS)((BYTE*)lib + ((PIMAGE_DOS_HEADER)lib)->e_lfanew);
                assert(header->Signature == IMAGE_NT_SIGNATURE);
                assert(header->OptionalHeader.NumberOfRvaAndSizes > 0);
             
                PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE*)lib +
                    header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
                assert(exports->AddressOfNames != 0);
             
                BYTE** names = (BYTE**)((int)lib + exports->AddressOfNames);
             
                for (int i = 0; i < exports->NumberOfNames; ++i)
                    printf_s("Export: %s\n", (BYTE*)lib + (int)names[i]);


          Цитата grgdvo @
          Есть такой спецификатор __declspec(dllexport)...

          Попробовал и это:
          Скрытый текст

          __declspec(dllexport) STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv):

          '__declspec(dllexport)': storage-class or type specifier(s) unexpected here; ignored
          prCh7incom\prsrver.cpp(256,23): warning C4502: 'linkage specification' requires use of keyword 'extern' and must precede all other specifiers

          EXTERN_C HRESULT __declspec(dllexport) __stdcall DllGetClassObject():
          Error C2375 'DllGetClassObject': redefinition; different linkage prCh7incom


          Подскажите,пожалуйста, что я делаю не так :unsure:
            А почему в .def
            LIBRARY Cmpnt.dll
            а не
            LIBRARY prCh7incom.dll

            В принципе можно вообще убрать эту строчку. И не обязательно нумеровать функции если нет такой жесткой необходимости

            ExpandedWrap disabled
              ; exports definition
              EXPORTS
                  DllCanUnloadNow     PRIVATE
                  DllGetClassObject   PRIVATE
                  DllRegisterServer   PRIVATE
                  DllUnregisterServer PRIVATE


            Ну еще на всякий случай проверить что линкеру скармливается правильный .def
            Сообщение отредактировано: sharky72 -
              Доброе время суток
              sharky72, благодарю за совет :thanks:
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0240 ]   [ 15 queries used ]   [ Generated: 1.08.21, 02:38 GMT ]