我正试图了解一些代码(直接从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}$
在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,只需确保捕捉到正确的异常和钩子。在
相关问题 更多 >
编程相关推荐