链接到VS2010 c++中特定位置的dll
Link to a dll in specific location in VS2010 c++
如何让我自己的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文件,请尝试如下方法:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 是与初始类同一内存位置的重新定位类
- 如何在使用网格布局时重叠qwidgets,并将重叠的widget定位在距离窗口边界特定距离的位置
- 我不知道如何定位最高随机数的位置
- 如何在MFC上设置窗口位置以将其定位到屏幕顶部
- 将QGraphicsSvgItem的中心定位在一个位置上。
- 如何定位WinRT异步方法调用中出现错误的位置
- 重定位表项在平面二进制文件中的存储位置