是否可以“并行”加载子目录中的 DLL?

问题描述 投票:0回答:1

我有一个带有嵌入式 Python 的 C++ 应用程序。我已将所有 Python 文件放入 Libs 目录中,该目录是我的

application.exe
根目录的子目录。

为了加载 Python,我需要将

python310.dll
移动到与我的
application.exe
并排,而不是在
Libs
中。

python310.dll
与Python其余部分的分离导致了其他问题,所以我希望它在
Libs\python310.dll
中。

我创建了一个

application.exe.manifest

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        type="win32"
        name="Sampler"
        version="2.99.0.0"
        processorArchitecture="*"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="python310"
                version="3.10.11150.1013"
                processorArchitecture="x86"/>
        </dependentAssembly>
    </dependency>
    <file name=".\Libs\python310.dll"/>
</assembly>

但是,这行不通。运行

sxstrace
,我收到错误
ERROR: Cannot resolve reference python310,processorArchitecture="x86",type="win32",version="3.10.11150.1013".
应用程序无法启动,因为它找不到
python310.dll

是否可以使用清单从子目录加载 DLL?

c++ windows winapi mfc desktop-application
1个回答
0
投票

一些建议。

建议#1。当所有 DLL 和 EXE 都位于同一目录中时,这是最简单的。那么你“通常”不需要清单文件 - 至少对于本机代码不需要。问问自己 - 如果代码正常运行,最终用户是否关心所有 python、DLL 和 EXE 文件是否都在同一目录中?因此,请考虑将“lib”和“application”目录合并为一个目录。 建议#2。将您的 EXE 分成两个二进制文件:一个存根 exe 和一个 DLL,大部分代码都链接到其中。 Application.exe 只是一个存根可执行文件,其唯一工作是在运行时调用

SetDllDirectory("c:\path o pp\ \lib"

,后跟 LoadLibrary("application.dll") 链接到 lib 目录中的所有 Python 内容然后

GetProcAddress
获取从此 DLL 导出的特殊
main
函数。
现在,您的本机应用程序代码将默认根据需要搜索 DLL 的 lib 路径,因为您已经以编程方式调用了 SetDllDirectory。

© www.soinside.com 2019 - 2024. All rights reserved.