.net — Проблемы с регистрацией и использованием 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

Зависимость Уокер с открытой DLL:

Зависимость Уокер с открытой 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.

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

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

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

ОБНОВЛЕНИЕ 2

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

ОБНОВЛЕНИЕ 3

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

Windows Resource Protection did not find any integrity violations.

2

Решение

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

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

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

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

1

Другие решения

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

0

По вопросам рекламы [email protected]