DLL в подпапке, а не в папке приложения - PullRequest
0 голосов
/ 29 сентября 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Я не уверен, когда в вашем скрипте загружена 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
0 голосов
/ 10 октября 2011

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

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

...