DLL在子文件夹而不是在应用程序文件夹中

时间:2011-09-29 10:05:53

标签: python visual-c++ manifest cx-freeze pyd

使用VC ++创建了一个动态python文件(pyd)。使用cx_freeze,我创建了一个exe。为了使该程序在其他计算机上运行,​​我需要在applications文件夹中有一个文件msvcr100.dll。我确实得到了所需的输出。

但是,Microsoft的分发许可证明确指出dll文件应位于应用程序文件夹中的子文件夹中。子文件夹应命名为“Microsoft.VC100.CRT”。我试过通过更改项目属性来尝试MS VC ++中的设置。它证明是非常棘手的,因为我使用MSVC ++的唯一的事情是我的python程序使用一些c选项并返回一些我可以在我的python程序中再次使用的输出。我玩过清单文件(嵌入和不嵌入),还在VC ++中设置了附加库目录

任何人都知道如何让我的pyd文件进入Microsoft.VC100.CRT。

2 个答案:

答案 0 :(得分:1)

我不确定在你的脚本中是什么时候加载了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

答案 1 :(得分:0)

我创建的动态python文件是使用Visual C ++ 2010编译的。因此,为了使其工作,需要MSVCR100.dll文件。 但是,由于我还创建了我的最终程序的应用程序(.exe),它依赖于MSVCR90.dll。 由于Microsoft坚持认为这些dll应该位于具有特定名称的文件夹中,因此我不能将这些文件放在应用程序文件夹中。因此,我所做的是使用Visual C ++ 2008编译pyd文件。然后添加了MSVCR90.dll文件以及相应的清单和MSVCP90.dll和MSVCM90.dll文件。这解决了这个问题。

我的猜测是,在我的程序之前为了工作需要两代C运行时文件。通过使用VC ++ 2008编译pyd文件,我有效地将依赖性降低到了一代。