DLL в подпапке, а не в папке приложения

создали динамический файл Python (pyd) с использованием VC++. Используя cx_freeze, я создал exe. Для того, чтобы эта программа работала на других компьютерах, мне нужно иметь файл msvcr100.dll в папке приложений. И я получаю желаемый результат.

Однако в лицензии на распространение для Microsoft четко указано, что файлы dll должны находиться в подпапке внутри папки приложения. Подпапка должна называться «Microsoft.VC100.CRT». Я попытался поиграть с настройками в MS VC++, изменив свойства проекта. Это оказалось очень сложно, поскольку единственное, что я использовал MSVC++, заключалось в том, что моя программа на Python использовала некоторую опцию c и возвращала некоторый вывод, который я могу снова использовать в своей программе на Python. Я поиграл с файлами манифеста (с встраиванием и без встраивания), а также установил каталог дополнительных библиотек в VC++.

У кого-нибудь есть идеи относительно того, что я могу сделать, чтобы мой файл pyd заглянул в Microsoft.VC100.CRT.


person Ammar    schedule 29.09.2011    source источник
comment
Запись «Дополнительные библиотеки» предназначена для статической компоновки, а не для указания путей поиска во время выполнения.   -  person WaffleSouffle    schedule 29.09.2011


Ответы (2)


Я не уверен, когда в вашем скрипте загружается DLL, но если предположить, что он задерживается до такой степени, что вы можете что-то с этим сделать, тогда вы можете попробовать загрузить библиотеку самостоятельно:

import os
import ctypes
try:
    here = os.path.dirname(__file__)
except NameError:
    here = os.getcwd()
dll = ctypes.CDLL(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll'))
del here

или с помощью pywin32

import os
import win32api
try:
    dll = win32api.LoadLibrary('msvcr100.dll') #Never hurts to try
except win32api.error:
    try:
        here = os.path.dirname(__file__)
    except NameError:
        here = os.getcwd()
    #Just to prove messing with PATH does something.
    os.environ['PATH'] = os.environ['PATH'] + os.pathsep + os.path.join(here, 'Microsoft.VC100.CRT')
    dll = win32api.LoadLibrary('msvcr100.dll') #Give it another crank of the handle.
    #Or alternatively without messing with PATH
    dll = win32api.LoadLibrary(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll')) #Give it another alternative crank of the handle.
    del here
person WaffleSouffle    schedule 29.09.2011
comment
исправлено после комментариев eryksun - person WaffleSouffle; 29.09.2011
comment
Спасибо, вафельное суфле. Я понял, в чем дело. Пожалуйста, смотрите комментарий ниже для решения. Ваше решение может быть правильным. Но тот, что ниже, работает для меня - person Ammar; 29.09.2011

Созданный мной динамический файл Python был скомпилирован с использованием Visual C++ 2010. Следовательно, для его работы необходимы файлы MSVCR100.dll. Однако, поскольку я также создал приложение (.exe) моей финальной программы, оно зависело от MSVCR90.dll. Поскольку Microsoft настаивает на том, чтобы эти dll находились в папке с определенным именем, я не мог просто поместить эти файлы в папку приложения. Следовательно, я скомпилировал файл pyd с помощью Visual C++ 2008. Затем добавил файл MSVCR90.dll вместе с соответствующими манифестами и файлами MSVCP90.dll и MSVCM90.dll. Это решило проблему.

Я предполагаю, что до того, как моя программа для работы потребовала два поколения файлов времени выполнения C. Скомпилировав файл pyd с помощью VC++2008, я фактически сократил эту зависимость до одного поколения.

person Ammar    schedule 10.10.2011