python - 将 ctypes 与 DLL 一起使用 - 接收不正确的返回值
问题描述
将 ctypes 用于返回的函数时,我注意到一个问题c_void_p
。
如果我有一个非常简单的 C++ 程序:
#include <windows.h>
#include <iostream>
int main(int argc, char* argv[])
{
HLOCAL h = LocalAlloc(0, 10);
std::cout << h;
return 0;
}
我得到的值为00607498
6321304。但是,尝试用 ctypes 做同样的事情:
import ctypes
import ctypes.wintypes
win32 = ctypes.WinDLL('kernel32.dll', use_last_error=True)
win32.LocalAlloc.argtypes = [ctypes.c_ulong, ctypes.c_size_t]
win32.LocalAlloc.restype = ctypes.wintypes.HLOCAL
win32.LocalAlloc(0, 10)
我得到一个2392687574096
不正确的值。
c_void_p
处理返回类型时我做错了什么吗?
解决方案
请注意,LocalFree 在成功时返回 NULL(0)。我的价值观是相似的。也许你有一个 32 位编译器,但有 64 位 Python,所以指针看起来大不相同。你设置.argtypes/.restype
了LocalAlloc吗?
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> import ctypes.wintypes
>>>
>>> win32 = ctypes.WinDLL('kernel32.dll', use_last_error=True)
>>> win32.LocalAlloc.argtypes = [ctypes.c_ulong, ctypes.c_size_t]
>>> win32.LocalAlloc.restype = ctypes.wintypes.HLOCAL
>>> h=win32.LocalAlloc(0, 10)
>>> h
2348093371568
>>> win32.LocalFree.argtypes = ctypes.wintypes.HLOCAL,
>>> win32.LocalFree.restype = ctypes.wintypes.HLOCAL
>>> win32.LocalFree(h) # None is returned for a NULL pointer
>>>
推荐阅读
- azure-active-directory - 带有 OpenIdConnect 的 IIS 反向代理转到错误的身份提供程序
- python-3.x - 标准缩放器 v 最小最大。Standardscaler 不适用于 ANN,但 MInMax 可以
- java - 如何在 LWJGL 3 中使用 glfwSetWindowUserPointer?
- javascript - 为什么 append() 添加标记多次而不是一次?
- postgresql - 除了删除数据库集群之外,还保留一个静态的大型 Postgres 数据库吗?
- svg - SVG | 擦除另一条路径的一部分
- c# - Linq to Entities:其中包含 1 个值和许多列
- javascript - MiniCssExtractPlugin 没有创建 css 文件
- http - 控制台上的响应与网络上的预览不同
- google-cloud-platform - 在 BigQuery 中使用 MAX 值展平结果