Python调用windows api VkKeyScan返回随机值 我在C++中编写了一个小的DLL,称为Windows API VKKEY SCAN。 但每次我调用它时,它都会向我返回一个随机值 #include "Windows.h" extern "C" __declspec(dllexport) auto func()//return random values, unless change auto to int { return VkKeyScan('a'); };

Python调用windows api VkKeyScan返回随机值 我在C++中编写了一个小的DLL,称为Windows API VKKEY SCAN。 但每次我调用它时,它都会向我返回一个随机值 #include "Windows.h" extern "C" __declspec(dllexport) auto func()//return random values, unless change auto to int { return VkKeyScan('a'); };,python,windows,api,debugging,dll,Python,Windows,Api,Debugging,Dll,如果我简单地将函数的返回类型从auto改为int,它总是返回正确的值,即65 或者如果我使用VkKeyScan'a'而不是VkKeyScan'a',它也会始终返回正确的值。VkKeyScan和VkKeyScan都返回短整数 我想知道是什么导致了这个错误 使用ctypes调用VkKeyScanW也会返回随机值 from ctypes import * print(windll.user32.VkKeyScanW(c_wchar('a')))//return random values VkKe

如果我简单地将函数的返回类型从auto改为int,它总是返回正确的值,即65

或者如果我使用VkKeyScan'a'而不是VkKeyScan'a',它也会始终返回正确的值。VkKeyScan和VkKeyScan都返回短整数

我想知道是什么导致了这个错误

使用ctypes调用VkKeyScanW也会返回随机值

from ctypes import *

print(windll.user32.VkKeyScanW(c_wchar('a')))//return random values
VkKeyScan实际上返回一个短的16位整数类型,并且返回寄存器中剩余的高位未定义

我猜auto会将类型保持为短类型,而调用func的代码就是问题所在,它将其视为32位值,即使其中只有16位定义的数据。强制返回类型为int将符号从16位扩展到32位


ctypes可能也有同样的问题,当用作打印参数时,ctypes要么没有声明为返回c_int16,要么没有正确地进行符号扩展。

我不这么认为,如果我编写auto func{return short65;},在python中调用func,它将始终返回65,未定义还意味着高位可能为零。returnshort65可以编译为mov eax,65;ret;这将使所有32位都有效。谢谢,这解释了很多。