Python调用windows api VkKeyScan返回随机值

时间:2017-07-07 09:27:22

标签: python windows api debugging dll

我在C ++中写了一个小dll,它叫做windows api VkKeyScan 。 但是每当我调用它时,它都会向我返回一个随机值。

#include "Windows.h"
extern "C" __declspec(dllexport) auto func()//return random values, unless change auto to int
{
    return VkKeyScan('a');
};

如果我只是将函数的返回类型从 auto 更改为 int ,它总是返回正确的值(即65)。

或者如果我使用VkKeyScanA(' a')代替VkKeyScan(' a'),它也会一直返回正确的值。(VkKeyScanA和VkKeyScan都返回短整数)

我想知道导致这个错误的原因是什么?

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

from ctypes import *

print(windll.user32.VkKeyScanW(c_wchar('a')))//return random values

1 个答案:

答案 0 :(得分:1)

VkKeyScan实际上返回SHORT(16位int类型),并且返回寄存器中的其余高位未定义。

我猜测auto会将类型保持为short并且调用func的代码是问题,即使只定义了16位,它也会将其视为32位值数据那里。强制返回类型为int将从16位扩展到32位。

ctypes可能存在同样的问题,并且在用作c_int16的参数时,未声明为返回print或未正确签名扩展。