我在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
答案 0 :(得分:1)
VkKeyScan
实际上返回SHORT
(16位int类型),并且返回寄存器中的其余高位未定义。
我猜测auto会将类型保持为short并且调用func
的代码是问题,即使只定义了16位,它也会将其视为32位值数据那里。强制返回类型为int
将从16位扩展到32位。
ctypes可能存在同样的问题,并且在用作c_int16
的参数时,未声明为返回print
或未正确签名扩展。