Perl和LVN_列单击;在WinXP x86下可以正常工作,但在Win7 x64下不能正常工作。为什么?

Perl和LVN_列单击;在WinXP x86下可以正常工作,但在Win7 x64下不能正常工作。为什么?,perl,winapi,Perl,Winapi,我有一个perl子例程,它在WinXP x86下运行良好,为32位应用程序排序列,但在Win7 x64下,这个子例程根本不起作用。其他的工作正常(标签切换、按键等)。知道为什么吗 sub function { my @searchresultswindow_handle = FindWindowLike( @_[ 0 ], undef, undef, $searchresultswindow_id ); if( !@searchresultswindow_handle ) {

我有一个perl子例程,它在WinXP x86下运行良好,为32位应用程序排序列,但在Win7 x64下,这个子例程根本不起作用。其他的工作正常(标签切换、按键等)。知道为什么吗

sub function      
{
my @searchresultswindow_handle = FindWindowLike( @_[ 0 ], undef, undef, $searchresultswindow_id );
 if( !@searchresultswindow_handle  )
  {
   die "Cannot find window handle for searchresultswindow control\n";
  }
 else
  {
   printf( "searchresultswindow handle is %x\n", $searchresultswindow_handle[ 0 ] );

            $keysList=@searchresultswindow_handle[0] ;

        my $action = pack( "l l",
        0, #ptaction.x
        0 #ptaction.y
        );

        my $action_ptr = unpack( 'L!', pack( 'P',$action));

        my $str_buf = pack( "L L L l l L L L L l",
        $keysList, #nmh.hdr.hwndFrom hwnd
        0, #nmh.hdr.idFrom

        4294967188, #LVN_COLUMNCLICK ,#nmh.hdr.code Code
        -1, #item
  13, #sub item
        0, #uNewState
        0, #uOldState
        0, #uChanged
        $action_ptr, #action
        0 #lparam
        );

          $lvitem = AllocateVirtualBuffer( $keysList, 5000 );
        WriteToVirtualBuffer( $lvitem, $str_buf ); 


  my $value =PostMessage( $keysList, 0x004E, 0, $lvitem->{ 'ptr' });
FreeVirtualBuffer( $lvitem );
}
}

这些结构在32位和64位系统上的打包方式不同

在32位上:

0:000> dt tagNMHDR
notepad!tagNMHDR
   +0x000 hwndFrom         : Ptr32 HWND__
   +0x004 idFrom           : Uint4B
   +0x008 code             : Uint4B
在64位上:

0:000> dt tagNMHDR
kernel32!tagNMHDR
   +0x000 hwndFrom         : Ptr64 HWND__
   +0x008 idFrom           : Uint8B
   +0x010 code             : Uint4B

你能比“根本不起作用”更具体一点吗?发生了什么,你得到了什么错误?是的,告诉我们什么模块
FindWindowLike
AllocateVirtualBuffer
来自哪里。1)我忘了说$keysList和$lvitem被声明为全局的(没有必要,但我在发布之前忘记了纠正这个问题)。2) 在7 x64下,脚本的所有其他部分都可以正常工作,除了这个部分。支持此部件单击特定窗口的标题子项(例如,按大小对窗口项进行排序)。3)AllocateVirtualBuffer FindWindowLike两者都是Win32::GuiTest子例程。LE:2*)在Win7 x64下,脚本运行此子例程,没有错误或任何问题,但是这些项没有被排序,因为父窗口可能没有收到通知消息,或者没有执行通知消息。与WinXP x86相比,Win7 x64下有些不同。我不知道这是什么东西。它在WinXP x64上运行良好。我认为这是一个与UIPI有关的问题。不过我还没有解决这个问题。perl.exe在这些系统上是64位还是32位?如果您怀疑UIPI-您是否尝试从提升的cmd.exe(“以管理员身份运行”)启动脚本?是的,我以管理员身份运行脚本。它不起作用。我已经安装了两个Perl版本64/32位。我甚至写了一个C++程序,它的行为相同,在Wixxx86/x64上工作得很好,但是在Wi7x86/x64上没有。