Q: Правильный способ доступа к данным в файле DLL только для данных - PullRequest
2 голосов
/ 18 февраля 2020

Мое приложение хранит некоторые данные в файлах только данных. Эти dll-файлы загружаются с помощью LoadLibrary () при необходимости во время выполнения, а затем отбрасываются с помощью FreeLibrary () после того, как их используют fini sh. Основное приложение обращается к данным, хранящимся в файлах DLL, используя GetProcAddress (). Программа написана на C ++ и использует вызовы WinAPI, без MF C или других библиотек. Имеет две версии x64 и x86. Он отлично работает на большинстве систем. Мои DLL-файлы не вызывают другие библиотеки или зависят от чего-либо еще. Каждый из них является отдельным файлом.

Недавно я обнаружил, что программа не работает на одном компьютере. этот спецификатор c один имеет Windows 10 x64 установлен на нем. После исследований я обнаружил следующее:

  1. Ошибка LoadLibrary () с сообщением об ошибке «Не удалось найти модуль». DLL находится в том же каталоге, что и основная программа.

  2. Я заменил вызов LoadLibrary () на LoadLibraryEx () и попробовал следующие ошибки:

    1. LOAD_IGNORE_CODE_AUTHZ_LEVEL не сработало. DLL не может быть загружен.
    2. DONT_RESOLVE_DLL_REFERENCES ... работает ?? Но Microsoft настоятельно рекомендует не использовать его.
    3. LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE ... загрузка DLL успешна ?? Но позже вызов GetProcessAddress не удался. Программа не может получить доступ к данным в файле DLL. Так что на самом деле это не работает.
  3. Я не смог найти ничего плохого в этой машине. Все остальные программы работают нормально.

  4. Я попробовал версию x86 на этом компьютере, и она работала нормально, используя оригинальный LoadLibrary ().

  5. My Установщик является двойной системой и автоматически устанавливает версию x64, когда находит x64 windows. Обычный пользователь не может просто переключиться на x86, когда он получает такую ​​ошибку.

  6. Мой вопрос: как я могу устранить эту ошибку и заставить мою программу работать на любой машине:

    1. Должен ли я вызывать LoadLibraryEx () с использованием флага DONT_RESOLVE_DLL_REFERENCES и игнорировать предупреждение Microsoft?
    2. Можно ли как-нибудь загрузить свою библиотеку простым вызовом LoadLibrary ()?
    3. Если я вызываю LoadLibraryEx () с флагом LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE, как рекомендовано Microsoft, как я могу получить доступ к данные без вызова GetProcessAddress ()?

Заранее спасибо.

...