Возникли проблемы с регистрацией и использованием 64-битной динамической библиотеки ATL, написанной на C++.

У меня проблемы с регистрацией и использованием динамической библиотеки под Windows 7 x64, 64-битная версия dll компилируется, но журнал компилятора выводит:

Error MSB3073: The command "RegSvr32 /S "...\x64\Debug\xxxxx.dll" exited with code 3.

Но когда я создаю 32-разрядную версию dll, журнал компилятора выводит команду RegSvr32, выполненную успешно.

Я уже установил Linker >> General >> Register Output на No в конфигурациях сборки x86 и x64.

Я пробовал запускать 64-битную и 32-битную версию RegSvr32 (без тихого режима) с 64-битной dll, но она выдает следующую ошибку:

The module "xxxxx.dll" failed to load. Make sure the binary is stored at the specified path or debug it to check for problems with the binary or dependent .DLL files. The specified module could not be found.

Я проверил это с помощью обходчика зависимостей, и он сообщил, что отсутствует более 100 dll, поэтому я не могу их здесь показать. Некоторые из них:

API-MS-WIN-CORE-COM-L1-1-1.DLL
API-MS-WIN-CORE-DATETIME-L1-1-1.DLL
API-MS-WIN-CORE-DEBUG-L1-1-1.DLL
API-MS-WIN-CORE-ERRORHANDLING-L1-1-1.DLL
API-MS-WIN-CORE-FILE-L1-2-1.DLL
...
WLANUTIL.DLL
WLDAP32.DLL
WTSAPI32.DLL
XMLLITE.DLL

Зависимость Walker с открытой dll:

Dependency Walker с открытой dll

Мне интересно, по какой причине только 64-битная версия dll не может зарегистрироваться с помощью RegSvr32.

Любая помощь очень ценится для решения этой проблемы.

ОБНОВЛЕНИЕ 1

Попытка запустить приложение с этой динамической библиотекой приводит к следующей ошибке (как в 32-разрядной, так и в 64-разрядной версиях):

The program can't start because api-ms-win-core-errorhandling-l1-1-1.dll is missing from your computer. Try reinstalling the program to fix this problem.

Все распространяемые пакеты, которые я установил на данный момент:

Распространяемые файлы, которые уже установлены

Есть ли какие-либо распространяемые визуальные С++, которые я должен установить, чтобы решить эту проблему?

ОБНОВЛЕНИЕ 2

Я нашел дополнительную информацию о api-ms-win-core-errorhandling-l1-1-1.dll здесь и попытался связать WindowsApp.lib с этой динамической библиотекой, но это даже не решило проблему.

ОБНОВЛЕНИЕ 3

Я запустил средство проверки системных файлов, и оно дало мне следующий вывод, как я и думал:

Windows Resource Protection did not find any integrity violations.


person GTAVLover    schedule 16.08.2017    source источник


Ответы (2)


  1. Перейдите в свойства проекта DLL, которую вы пытаетесь зарегистрировать.
  2. Перейдите в Свойства конфигурации >> Отладка
  3. В разделе «Команда» нажмите маленькую стрелку вниз и выберите «regsvr32.exe».
  4. В разделе "Аргументы команды" введите "$(TargetName)"
  5. Поставьте точку останова где-нибудь в вашей DLLMain
  6. Теперь отладьте DLL (щелкните правой кнопкой мыши проект dll в обозревателе решений и выберите «Отладка»)

Если вы доберетесь до своей основной DLL, вы можете отлаживать оттуда, пока она не выйдет из строя. Если вы этого не сделаете, вам следует взглянуть на окно вывода, чтобы увидеть любые соответствующие сообщения. Возможно, вам также придется изменить фильтры окна вывода. Щелкните правой кнопкой мыши окно вывода и проверьте все категории сообщений, чтобы убедиться, что он дает вам все, а затем снова выполните отладку.

Это должно по крайней мере сказать вам, где вы терпите неудачу. Ищите сбои загрузки модуля и тому подобное

Отредактировано для добавления - вы можете попробовать просто изменить шаг сборки, удалив «/ S». Это режим «Без звука», и в этом случае вы хотите видеть сообщения.

person Joe    schedule 16.08.2017
comment
Я попробовал то, что вы сказали, но я не решил проблему. Думаю, в DLLMain нет ничего плохого. - person GTAVLover; 17.08.2017

Наконец, я решил проблему, удалив mincore.lib из связанных .lib файлов в версиях проекта x86 и x64, которые я недавно связал для использования функции GetFileVersionInfoSize API.

person GTAVLover    schedule 17.08.2017