首页 > 解决方案 > 将 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;
}

我得到的值为006074986321304。但是,尝试用 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处理返回类型时我做错了什么吗?

标签: pythondllctypes

解决方案


请注意,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
>>>

推荐阅读