Python:WindowsError:异常:访问冲突读取 0x00000000

mat*_*365 2 python ctypes windowserror access-violation

这个简短的函数只是获取存储设备的可用空间,但是在运行代码时出现上述错误。

其功能是:

def disk_space1(drive):
    freespace = ctypes.c_ulonglong()
    calcspace = ctypes.windll.kernel32.GetDiskFreeSpaceExA
    calcspace(drive, ctypes.byref(freespace))
    disk_size = freespace.value
    return disk_size
Run Code Online (Sandbox Code Playgroud)

这个功能一直运行得很好,直到今天它无缘无故停止工作,我没有改变任何东西。最让我困惑的是,该函数工作正常,如果我运行它后打印出“freespace”的值,它已经找到了正确的值,但仍然给出错误。

是什么原因导致了这个问题?

czi*_*mba 5

您没有调用完整的函数签名,我认为这会导致访问冲突(由于随机内存写入)和错误。完整的函数签名是(完整记录在此处):

BOOL WINAPI GetDiskFreeSpaceEx(
  _In_opt_   LPCTSTR lpDirectoryName,
  _Out_opt_  PULARGE_INTEGER lpFreeBytesAvailable,
  _Out_opt_  PULARGE_INTEGER lpTotalNumberOfBytes,
  _Out_opt_  PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
Run Code Online (Sandbox Code Playgroud)

通过将函数更改为:

def disk_space(drive):
    freespace = ctypes.c_ulonglong()
    calcspace = ctypes.windll.kernel32.GetDiskFreeSpaceExA
    err = calcspace(drive,
                    ctypes.byref(freespace),
                    None,
                    None)
    assert err != 0, 'calcspace failed'
    disk_size = freespace.value
    return disk_size
Run Code Online (Sandbox Code Playgroud)

我能够运行它而不会出现间歇性错误。

  • 好吧,只需传递“NULL”(即“None”)值即可确保堆栈为最后两个“可选”参数分配零:“calcspace(drive, ctypes.byref(freespace), None, None)”。然后堆栈不会被 `GetDiskFreeSpaceExA` 中的清理代码损坏(即 x86 stdcall 被调用者清理)。 (2认同)