0

我的代码正在使用一个库,它是一个静态/隐式链接的 DLL(我们称之为 DLLB),但在运行时它找不到它。

尽管将 DLLB 定位在与调用它的代码相同的目录中。(调用代码本身就是一个DLL,DLLA是从python调用的,它是从arcpy调用的。我不太清楚为什么python能很好地找到DLLA,但DLLA却找不到DLLB,尽管它们在同一个目录中) .

如果我将库 DLL 放在系统路径上的某个位置,一切正常。

但是最好的部署方法是什么?在安装时向客户端计算机上的系统路径添加一个条目?在加载DLL之前在运行时从python修改系统路径?还有什么?

4

1 回答 1

3

Python 必须在LoadLibrary调用中指定 DLL 的完整路径。这是推荐的做法。如果仅指定模块名称,则存在加载错误 DLL 的风险,可能会引入二进制植入漏洞

请注意,虽然默认搜索路径包括加载可执行文件的目录,但它不包括加载其他 DLL 的目录。所以你看到的行为是预期的。

如果可以使用动态加载,则可以查找 DLLA 的路径并使用它来构造 DLLB 的路径。

要获取 DLLA 的模块句柄,请调用GetModuleHandleEx。要从模块句柄获取 DLLA 的完整路径,请调用GetModuleFileName。检查最后一个元素是否为 DLLA.dll 并将其替换为 DLLB.dll。然后,您可以调用 LoadLibrary。

于 2012-10-14T21:41:25.520 回答