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

Link to a dll in specific location in VS2010 c++

本文关键字:定位 位置 dll VS2010 c++ 链接      更新时间:2023-10-16

如何让我自己的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_Initialize。因为导入表是在你的代码运行之前处理的,你不能说你想使用哪个python26.dll,在哪里找到它等。

但是如果您设置链接器标志/DELAYLOAD: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文件,请尝试如下方法: