Как узнать, какие библиотеки DLL являются частью C++?

Я открыл свою программу в Dependency Walker. Он показывает следующие библиотеки DLL:

  • GDI32.DLL
  • OLEAUT32.DLL
  • IMM32.DLL
  • WINMM.DLL
  • ЯДРО32.DLL
  • USER32.DLL
  • SHELL32.DLL
  • OLE32.DLL
  • ADVAPI32.DLL
  • WS2_32.DLL
  • MSVCP100.DLL
  • MSVCR100.DLL

Итак, я предполагаю, что половина из них является частью Windows, а другая половина — частью C++, верно? Каков наилучший способ узнать, какие из них являются частью ОС, а какие нет?


person user87504    schedule 06.04.2013    source источник
comment
Я сомневаюсь, что здесь действительно есть ответ — DLL — это просто набор функций. Постфактум полностью зависит от нас, классифицировать некоторые из них как часть X или часть Y.   -  person Jerry Coffin    schedule 06.04.2013
comment
Значит, мне не повезло? Я пытаюсь упаковать необходимые библиотеки DLL в одну папку. Я не могу использовать установщик, потому что целевая машина требует, чтобы установщики не использовались. Я не могу использовать флаг -MT, потому что он использует библиотеки Qt.   -  person user87504    schedule 06.04.2013
comment
Это то, что я использую для получения списка DLL. Это Зависимость Уокер.   -  person user87504    schedule 06.04.2013
comment
Microsoft включает список распространяемых компонентов. Это руководство к тому, что вы можете/не можете включить в свое приложение. В большинстве случаев vc_redist.exe — это главное, что нужно включить.   -  person Jerry Coffin    schedule 06.04.2013
comment
Если вы настаиваете на том, чтобы не было установщиков, у обновлений Windows DLL есть неплохие шансы нарушить вашу установку. Базы данных установщика помогают отслеживать, какое приложение использует какую DLL, а без информации о вашем приложении все может легко сломаться. Изучите концепцию параллельных DLL...   -  person JimR    schedule 07.04.2013
comment
Я не понимаю, что вы имеете в виду, когда говорите, что DLL-библиотеки Windows имеют неплохие шансы сломать вашу установку. Если я не использую установщик, то с самого начала не будет установки, верно?   -  person user87504    schedule 07.04.2013
comment
@ user87504: Вам не нужен автоматический установщик для установки. В вашем случае ваша установка представляет собой просто исполняемый файл, устанавливаемый вручную. Установщик — это пользователь (или .zip операция извлечения).   -  person Lightness Races in Orbit    schedule 07.04.2013
comment
Посмотрите, в каком каталоге находится DLL.   -  person brian beuning    schedule 07.04.2013


Ответы (4)


MSVCP100.dll и MSVCR100.dll содержат библиотеки времени выполнения для C и C++. Все остальное в списке принадлежит окнам. Один из способов определить, принадлежит ли DLL Windows, — посмотреть на ее путь (c:\windows...), а затем проверить наличие цифровой подписи от MS. Это не надежно, но немного приблизит вас к определению того, принадлежит ли DLL окнам или нет.

Изменить: см. этот ответ Lightness Races In Orbit относительно распространения Windows DLL.

person Captain Obvlious    schedule 06.04.2013
comment
Великолепно! В итоге я использовал «Поиск по всему» (google it) для поиска каждой DLL на моем жестком диске. Если DLL находится только в папках SysWOW64/System32/WinSxS, то она поставляется с Windows. - person user87504; 06.04.2013
comment
@user87504: user87504: Совершенно неверно, что вы должны отправлять любую DLL, не найденную в этих папках. Пожалуйста, не делайте этого. Когда я случайно устанавливаю что-либо, написанное вами, возможно, вы искажаете зависимости на моем компьютере (причем чисто по незнанию). - person Lightness Races in Orbit; 07.04.2013
comment
Легкость правильная. Я не знал, что вы намеревались упаковать Windows DLL для распространения. - person Captain Obvlious; 07.04.2013

Не упаковывайте какие-либо библиотеки DLL, которые вы не добавили в проект явным образом самостоятельно.

Прочтите документацию по вашей цепочке инструментов (Visual Studio или любой другой), чтобы узнать, есть ли какие-либо распространяемые файлы, которые вам нужно включить в свой пакет. Они могут включать некоторые библиотеки DLL.

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

person Lightness Races in Orbit    schedule 06.04.2013
comment
Как вы собираетесь установить распространяемый без установщика: я не могу использовать установщик, потому что целевая машина требует, чтобы установщики не использовались. - person Lol4t0; 07.04.2013
comment
@ Lol4t0: Пожалуйста, укажите мне место, где я сказал, что мы не будем использовать установщики. - person Lightness Races in Orbit; 07.04.2013
comment
См. мою цитату из комментария @ user87504 к вопросу. - person Lol4t0; 07.04.2013
comment
@Lol4t0: А, понятно. Что ж, я отвергаю эту предпосылку. Если установщик не разрешен, то также не разрешен случайный сброс системных библиотек DLL. Вместо этого ОП должен стремиться либо: (а) получить разрешение на использование установщиков, (б) просто отметить в примечаниях к выпуску своего приложения, что распространяемые файлы для VS 2008 [или что-то еще] являются обязательным условием и должны быть доступны в системе. Работа выполнена. - person Lightness Races in Orbit; 07.04.2013
comment
Хм, я обратился к документации VS2010: msdn. microsoft.com/en-ca/library/dd831853%28v=vs.100%29.aspx, но я ничего не могу найти в распространяемых компонентах. Согласно: msdn.microsoft .com/en-us/library/windows/desktop/, распространяемый пакет — это пакет обновления программного обеспечения. Что вы имеете в виду, если мне нужно включить какие-либо распространяемые компоненты? - person user87504; 07.04.2013
comment
@ user87504: Именно так. - person Lightness Races in Orbit; 07.04.2013
comment
@Lightness Races in Orbit: не разрешен ли случайный сброс системных DLL, даже если они остаются в том же каталоге, что и мой двоичный файл (каталог будет называться foo на рабочем столе)? - person user87504; 07.04.2013
comment
@ user87504: Это грязно и ужасно. Конечно, вы можете избежать причинения непоправимого вреда. Однако вы не получите от меня денег за лицензию на вашу следующую версию программы! - person Lightness Races in Orbit; 07.04.2013
comment
@LightnessRacesinOrbit: Что, если я удалю библиотеки DLL при запуске программы и удалю их, когда программа завершится? - person user87504; 07.04.2013
comment
@user87504: Это еще хуже! Подлый - person Lightness Races in Orbit; 07.04.2013

Кроме поиска их с помощью Google, вероятно, нет простого способа сказать. Однако в этом случае я могу сказать вам, что MSVCP100.DLL — это код стандартной библиотеки C++, а MSVCR100.DLL — это библиотека времени выполнения C.

person Collin    schedule 06.04.2013

У самого Dependency Walker есть список «известных системных библиотек DLL». Вы можете найти его в меню «Параметры» -> «Настроить порядок поиска модулей».

person Lol4t0    schedule 06.04.2013