Windows中的延迟加载

2024-07-08 11:25:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图了解一些代码(直接从PyCXX改编)。它是一个多平台C++ Python包装器。在

编辑:原始代码here。在

它似乎迎合了一些只存在于Windows中的特殊现象:

#ifdef PY_WIN32_DELAYLOAD_PYTHON_DLL
:
#else
:
#endif

我会给下面的完整文件清单,它是相当长的。在

这个PY_WIN32_DELAYLOAD_PYTHON_DLL令牌在CPython中不存在,它也没有在PyCXX中定义。因此,我只能想象PyCXX打算将它作为可选的编译器标志提供。在

我想知道的是:它的目的是什么?它解决了什么问题?为什么这种机制会存在?在

也许熟悉Windows编程的人可以从代码中找到答案?在

我想知道它正在解决的问题是否仍然存在于现代Windows中,因为该代码已经超过15年了。在

关键问题是:我可以把它取下来,还是换成更干净的?

我很想删掉它;但是它在现代Windows环境中是否仍有一些有用的用途呢?在

代码:

^{pr2}$

Tags: 代码py编辑herewindows平台elsedll
2条回答

在Win32上,延迟加载是一种允许PE文件引用另一个PE文件的机制,该PE文件不是加载程序在启动该文件时所期望的位置,或者在文件根本不在的情况下优雅地后退。在我看来,这似乎是为了迎合一个嵌入python本身的Windows程序,但不希望包含python的DLL位于PATH中。在

一些google搜索进一步表明,这与避免python和由python加载的模块之间的循环有关。在

宏可以用预处理器参数定义,这就是为什么在任何地方都看不到它们。对于Microsoft编译器,则使用/D参数。在

/D与源代码文件开头的#define指令具有相同的效果,只是/D在命令行上去掉引号,#define保留引号。在

http://msdn.microsoft.com/en-us/library/hhzbb5c8.aspx

如果gcc是-D,请检查此参考链接:

https://www.daniweb.com/software-development/c/threads/348802/passing-string-as-d-compiler-option

延迟加载是一种机制,它只在库被使用时加载,而不是在应用程序启动之前由操作系统执行。它可以节省宝贵的内存和加载时间,因为(取决于代码流)dll可能根本没有加载。在

如果宏被定义了,那么这段代码试图通过自身实现延迟加载。Microsoft linker可以自动为您完成工作(即您不需要编写任何程序)。请记住,这不是平台的一个特性,而是一个链接器特性。在

检查此参考: http://en.wikipedia.org/wiki/Dynamic-link_library#Delayed_loading

如果你想添加链接器的代码,你可以用它来指示微软。在

您可以使用/DELAYLOAD参数来执行此操作,如本文所述:

http://msdn.microsoft.com/en-us/library/yx9zd12s.aspx

如果找不到dll,只需确保捕捉到正确的异常和钩子。在

相关问题 更多 >

    热门问题