2014-10-27 3 views
1

Мое приложение, написанное на VS2005, представляет собой 32-битное программное обеспечение. Он отлично работает на Windows Server 2008, Windows 7 (64-разрядный), но не запускается на сервере Windows 2012. Я попытался выяснить, какая DLL отсутствует, потому что я получаю сообщение об ошибке из LoadLibrary. Ошибка инициализации подпрограммы динамической библиотеки ссылок (DLL) ». Дает код ошибка как приDLL не загружается на сервер Windows 2012

m_plugin = LoadLibrary(pluginPath.c_str()); 
if (!m_plugin) 
{ 
    const string error("Failed to load Library \"" + pluginPath + "\" " + GetLastErrorStdStr()); 
    CBLogger::log(error, HIGH_IMPORTANCE); 
    return false; 
} 

Чтобы решить эту проблему, я попытался установить C++ распространяемых версий 8.0.61001, но это не помогло.

Я даже посмотрел на ходу зависимости (я действительно новичок в этом) и нашел несколько DLL-окон (например, msvcr80.dll), которые были показаны желтым цветом. Я скопировал их в папку приложения, но это тоже не сработало.

Может кто-нибудь, пожалуйста, дайте какие-либо идеи относительно того, как мне это разрешить? Какую версию распространяемого я должен установить или какие-то советы о том, как использовать ходул зависимостей. Пожалуйста, помогите

+3

Эта ошибка делает * не * намекает на недостающую DLL в качестве причины. Одна из DLL, используемых вашей программой, имеет точку доступа DllMain(), которая возвращает FALSE. В вашем вопросе нет сухарь, который подсказывает, почему это может быть так, вам нужен отладчик. –

+0

Я редактировал свой вопрос с кодом. Ошибка указана в LoadLibrary, и я возвращаю false. У dll определенно существует - я проверил это. – user2837961

+0

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

ответ

1

Попробуйте проверить журнал событий Windows. Это где-то рядом с панелью управления -> «Администрирование» -> «Просмотр событий» -> «Журналы Windows» -> «Приложение». Обычно вы увидите там точную DLL, которая не была найдена с ожидаемой версией, которая также должна совпадать.

0

Возможно, DLL не может быть загружена, поскольку ошибка: «Была сделана попытка загрузить программу с неправильным форматом». DLL-сборка с тегом платформы «x86» отлично работает в Win 7 x86 или x64, но не работает на сервере Win64 Server x64. Компиляция библиотеки DLL с целевой платформы "Any CPU"

0

Да Каким-то LoadLibrary терпит неудачу, если DLL не имеет функции DllMain, в Windows Server 2012. Для того, чтобы решить эту проблему вы можете использовать:

LoadLibraryEx(libraryname, NULL, DONT_RESOLVE_DLL_REFERENCES). 
0

Я читал, что ходок зависимостей уже не является надежным с Windows 7 (он дает ложные отрицания). Когда LoadLibrary терпит неудачу, DLL, которую вы пытаетесь загрузить, не может быть загружена или илон зависимости.

Когда вы открываете свой проект в визуальной студии, вы можете приостановить отладчик в LoadLibraryW (Filename); Вызовите GetLastError(), чтобы узнать точную проблему как предложение здесь LoadLibraryW() failing to load DLL in System32, если вы можете изменить исходный код и перекомпилировать.

Теперь, чтобы узнать, какая DLL отсутствует, вы должны использовать инструмент отладки Windows GFLAGS https://msdn.microsoft.com/en-ca/library/windows/hardware/ff549557(v=vs.85).aspx. GFlags включен в Инструменты отладки для Windows (я не знаю, откуда взять инструменты отладки Windows. Возможно, попробуйте https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk). Снова, к сожалению, никто не записывает хорошее руководство, как его использовать. Таким образом, это следующие этапы:

  1. Предполагается, что установлены средства для отладки Windows 10 (64-бит) и Windows.
  2. После установки SDK, перезапустите
  3. Затем нажмите на иконку окна и типа 'GFLAGS'
  4. Open "Global Flags (X64) - Desktop App"
  5. Enable Показать Загрузчик щелкает в "Global Flags" диалогового в «Системном реестре» -tab (вторая запись, topleft)
  6. перезапуск (да, вы должны перезапустить!)
  7. Открыть визуальную студию с файлом решения.
  8. запустить его в режиме отладки (Win64)
  9. Пусть приложение работать через ошибки
  10. Остановите приложение и закройте отладчик
  11. Теперь в Visual Studio, Перейти к области вывода. И выберите: Показать вывод с: «Отладка»
  12. Осмотрите последнюю строку вывода. Где-то там будет запись с ОШИБКОЙ. Шахта чтения:

    14b0: 15ec @ 00131328 - LdrpSearchPath - RETURN: Статус: 0xc0000135 14b0: 15ec @ 00131328 - LdrpProcessWork - ОШИБКА: Невозможно загрузить DLL: "clAmdFft.Runtime.dll", родительский модуль: «C: \ Users \ steven \ Documents \ Unreal Projects \ Revaro 4.11 \ Binaries \ Win64 \ UE4Editor-Revaro.dll ", Статус: 0xc0000135 14b0: 15ec @ 00131328 - LdrpLoadDllInternal - RETURN: Статус: 0xc0000135 14b0: 15ec @ 00131328 - LdrLoadDll - RETURN: Статус: 0xc0000135 'UE4Editor.exe' (Win32): выгружен 'C: \ Windows \ System32 \ mfreadwrite.dll'

"clAmdFft.Runtime.dll" Это DLL что создает проблемы. Либо установите его, путь к файлу действителен и настроен в проекте, убедитесь, что он не поврежден, а правильный вариант x86/x64.

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

Теперь отключите GFLAGS еще раз, потому что это замедлит работу вашего компьютера и перезапустит его.

Смежные вопросы