【问题标题】:Perl and LVN_COLUMNCLICK; works fine under WinXP x86, but not under Win7 x64. Why?Perl 和 LVN_COLUMNCLICK;在 WinXP x86 下工作正常,但在 Win7 x64 下不行。为什么?
【发布时间】:2011-01-28 21:56:01
【问题描述】:

我有这个在 WinXP x86 下运行良好的 perl 子例程,除其他外,对 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 );
}
}

【问题讨论】:

  • 你能比“根本不工作”更具体吗?会发生什么,您会遇到什么错误?
  • 是的,扔给我们一块骨头,告诉我们FindWindowLikeAllocateVirtualBuffer来自哪些模块。
  • 1) 我忘了说 $keysList 和 $lvitem 被声明为全局(不必要,但我忘记在发布之前更正问题)。 2)在win7 x64下,脚本的所有其他部分都可以正常工作,除了这个。这部分应该点击特定窗口的标题子项(例如,按大小对窗口的项目进行排序)。
  • 3)AllocateVirtualBuffer piotrkaluski.com/files/winguitest/docs/… FindWindowLike piotrkaluski.com/files/winguitest/docs/ch09s05.html 都是 Win32::GuiTest 子程序。
  • LE: 2*) 在 Win7 x64 下,脚本运行这个子程序,没有错误或任何东西,但是项目没有排序,因为,可能是父窗口没有收到通知消息,或不执行。与 WinXP x86 相比,Win7 x64 下有些不同。我不知道那是什么东西。

标签: perl winapi


【解决方案1】:

这些结构在 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

【讨论】:

  • 它在 WinXP x64 上运行良好。我认为这是与 UIPI 相关的问题。不过我还没有解决。
  • 这些系统上的 perl.exe 是 64 位还是 32 位?如果您怀疑 UIPI - 您是否尝试从提升的 cmd.exe(“以管理员身份运行”)启动您的脚本
  • 是的,我以管理员身份运行脚本。它不起作用。我已经安装了两个 64/32 位的 Perl 版本。我什至编写了一个具有相同行为的 C++ 程序,它在 WinXP x86/x64 上运行良好,但在 Win7 x86/x64 上运行良好。
猜你喜欢
  • 2013-05-10
  • 2011-09-18
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多