GetWindowPlacement 处的 Perl Win32::API 缓冲区溢出

标签 perl winapi

我的问题是在 Windows 10 计算机上从 GetWindowPlacement 获取 WINDOWPLACEMENT 结构。我获得了一个有效的窗口句柄,并且创建的结构看起来不错,但调用 GetWindowPlacement 失败。 这是我的代码:

#!/usr/bin/perl

use strict;
use warnings;
use Win32::API;

my $wpl; # WINDOWPLACEMENT structure 
my $hwnd;
my $rv;

Win32::API->Import("user32",   "FindWindow",         "PP",   "N");
Win32::API->Import("user32",   "GetWindowPlacement", "NP",   "I");

Win32::API::Struct->typedef( 'POINT', qw(
    LONG x; 
    LONG y; 
));
Win32::API::Struct->typedef( 'RECT', qw(
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
));
Win32::API::Struct->typedef( 'WINDOWPLACEMENT', qw(
    UINT  length;
    UINT  flags;
    UINT  showCmd;
    POINT ptMinPosition;
    POINT ptMaxPosition;
    RECT  rcNormalPosition;
    RECT  rcDevice;
));

$hwnd = FindWindow('SciCalc', 0);
print("window handle: $hwnd\n");

$wpl = Win32::API::Struct->new( 'WINDOWPLACEMENT' ); 
$wpl->{length} = Win32::API::Struct::sizeof($wpl);
print("pointer: $wpl\n");
print("length: $wpl->{length}\n");

$rv = GetWindowPlacement($hwnd, $wpl);
print("return value: $rv\n");

exit(0);

__END__

结果是:

window handle: 722532
pointer: Win32::API::Struct=HASH(0x2609b60)
length: 60
Win32::API::Call: parameter 2 had a buffer overflow at C:\Users\ma\MyFolder\test\winpos.pl line 41.

使用 AutoIt3 获取 WINDOWPLACement 结构给了我:
![AutoIt3 结果] AutoIt3

最佳答案

解决方案是改变:

Win32::API->Import("user32",   "GetWindowPlacement", "NP",   "I");

至:

Win32::API->Import("user32",   "GetWindowPlacement", "NT",   "I");

发现于 documentation .

关于GetWindowPlacement 处的 Perl Win32::API 缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72474055/

相关文章:

perl - 为什么我的用于打印行号前缀的行的 Perl 脚本不起作用?

python - 将 Perl 脚本转换为 Python : dedupe 2 files based on hash keys

c++ - Win32 键盘组合

windows - 确定 .exe 依赖项

c++ - CryptDecrypt() 无法解密某些 block C++

multithreading - 我可以在 perl 中重用加入的线程吗?

perl - 在 perl 中评估 Expect

c++ - 键鼠系统 Global Hook

c++ - 如何使用 Win32 API 右键拖动?

perl - 试图理解 Perl 对函数结果进行排序