2024-10-02 12:27:11 发布
网友
我发现在pywin32中有两个GetLogicalDrives api,一个在win32api模块中,另一个在win32file中。两者的描述似乎是一样的。他们之间有什么区别吗?我读了一些代码,似乎大多数人都用win32文件.GetLogicalDrive而不是另一个。谁能告诉我原因吗?在
它们基本上是一样的。它们都调用kernel32!GetLogicalDrives。win32api版本比较简单,因为它直接通过调用PyLong_FromLong(python3)来构建结果,而win32file版本调用Py_BuildValue。它们都只返回整数位掩码,因此没有内在的理由选择其中一个。用比较方便的那个。例如,如果您使用的是win32api,不要导入win32file只是为了调用win32file.GetLogicalDrives。在
kernel32!GetLogicalDrives
PyLong_FromLong
Py_BuildValue
win32file.GetLogicalDrives
cdb调试会话:
win32api
>>> win32api.GetLogicalDrives() Breakpoint 0 hit kernel32!GetLogicalDrives: 00000000`772bae00 4883ec68 sub rsp,68h 0:000> k5 Child-SP RetAddr Call Site 00000000`0030f2d8 00000000`670a2735 kernel32!GetLogicalDrives 00000000`0030f2e0 00000000`5ffaf8bd win32api+0x2735 00000000`0030f310 00000000`6002385b python34!PyCFunction_Call+0x12d 00000000`0030f340 00000000`60025c89 python34!call_function+0x2ab 00000000`0030f3a0 00000000`6002770c python34!PyEval_EvalFrameEx+0x2279 0:000> bl 0 e 00000000`772bae00 0001 (0001) 0:**** kernel32!GetLogicalDrives 1 d 00000000`5ffa1450 0001 (0001) 0:**** python34!PyLong_FromLong 0:000> be1; g; bd1; k5 Breakpoint 1 hit Child-SP RetAddr Call Site 00000000`0030f308 00000000`5ffaf8bd python34!PyLong_FromLong 00000000`0030f310 00000000`6002385b python34!PyCFunction_Call+0x12d 00000000`0030f340 00000000`60025c89 python34!call_function+0x2ab 00000000`0030f3a0 00000000`6002770c python34!PyEval_EvalFrameEx+0x2279 00000000`0030f4a0 00000000`60027aae python34!PyEval_EvalCodeEx+0x65c
win32file
关于win32api+0x2735和win32file+0xc855的事很抱歉。我没有PyWin32的调试符号。我从pypiwin32安装了轮子。在
win32api+0x2735
win32file+0xc855
它们基本上是一样的。它们都调用
kernel32!GetLogicalDrives
。win32api版本比较简单,因为它直接通过调用PyLong_FromLong
(python3)来构建结果,而win32file版本调用Py_BuildValue
。它们都只返回整数位掩码,因此没有内在的理由选择其中一个。用比较方便的那个。例如,如果您使用的是win32api,不要导入win32file只是为了调用win32file.GetLogicalDrives
。在cdb调试会话:
win32api
win32file
^{pr2}$关于
win32api+0x2735
和win32file+0xc855
的事很抱歉。我没有PyWin32的调试符号。我从pypiwin32安装了轮子。在相关问题 更多 >
编程相关推荐