Python 链接到VS2010 c+中特定位置的dll+;

Python 链接到VS2010 c+中特定位置的dll+;,python,c++,visual-studio-2010,dll,Python,C++,Visual Studio 2010,Dll,如何获得自己的dll以在特定位置使用dll 我已经建立了一个32位Excel dll(a.xll)。我正在dll中使用Python C-Api。问题是,通常只有64位Python安装。64 python26.dll位于\System32。 如果我将32位python26.dll放在Excel exe文件夹或\SysWOW64中,一切正常,但通常我无法访问这些文件夹。将32位python dll放在xll文件夹中没有帮助,似乎\System32是第一位的 我知道有没有不使用“LoadLibrary

如何获得自己的dll以在特定位置使用dll

我已经建立了一个32位Excel dll(a.xll)。我正在dll中使用Python C-Api。问题是,通常只有64位Python安装。64 python26.dll位于\System32。 如果我将32位python26.dll放在Excel exe文件夹或\SysWOW64中,一切正常,但通常我无法访问这些文件夹。将32位python dll放在xll文件夹中没有帮助,似乎\System32是第一位的

我知道有没有不使用“LoadLibrary”和多次使用“GetProcAddress”显式链接的解决方案。? VS2010中有任何选项吗


非常感谢您的帮助。

您说得对,搜索顺序首先是系统目录(和)。这是插件的传统情况。应用程序本身可以将它们的依赖库存储在它们自己的程序文件夹中,这样就可以了,因为它具有最高的优先级。插件通常没有那种奢侈

解决方案可能是对DLL使用延迟加载。如果您有这样一个程序:

int main()
{
  Py_Initialize();
}
…如果将其链接到
python26.lib
,它将在导入表中创建一个静态条目,指向
python26.dll!Py_初始化
。因为导入表是在代码运行之前处理的,所以不能说要使用哪个
python26.dll
,在哪里找到它等等

但是,如果设置链接器标志并将MSVC的
delayimp.lib
添加到构建中,它将推迟加载Python DLL,直到调用其中的某个函数。因此,现在您可以确保加载了正确的库:导入表只有依赖项的基本名称(
python26.dll
),如果已经加载了具有相同名称的库,它将重新使用它。因此,您可以从您选择的任何位置预加载所需的加载程序,然后让延迟加载程序执行其工作,如下所示:

int main()
{
  LoadLibrary(TEXT("C:\\Program Files (x86)\\...\\...\\python26.dll"));
  Py_Initialize();
}

但即使这样,你也可能面临另一个问题。默认情况下,第一个加载的模块使用了正确的基本名称,这意味着即使您成功地完成了其他所有操作,也可能会加载其他Excel插件或愚蠢的Shell扩展(例如,当用户转到“打开文件”对话框时),这将加载他们自己的
python26.dll
,其中可能包含不兼容的API,由另一个编译器或其他任何东西构建,这可能会毁了你的一天


因此,我还建议您将自己的自定义版本重新命名为类似于
productname-python26.dll的东西,并链接到它。当然,任何其他产品都不会有类似名称的DLL,所以您是安全的。为了从重命名的DLL创建.lib文件,请尝试将DLL的路径添加到您的搜索目录中,或执行
#pragma注释(lib,“path to DLL”)
我不确定pragma是否有效,但希望它可以。硬编码路径通常不是一个好主意。相对路径更好。谢谢您的建议,但是pragma不起作用,\System32\以前被搜索过。谢谢Yirkha。然后我还必须删除链接器选项中对
python26.lib
的附加依赖项,因为在th
.lib
文件中说明了
python27.dll
。如果我这样做,我将有未解析的导入,我必须为每个使用的函数执行
GetProcAddress
,并相应地修改
python.h
。我说得对吗?但是,
DELAYLOAD
的优点是什么呢?不,您仍然会将
.lib
留在那里(但标记为延迟加载),然后在从其他地方调用第一个Python函数之前显式加载DLL。为了更详细地描述这一点,我重写了答案。现在我明白了。关键是自定义库。非常感谢。