同一个程序,32位正常,64位有问题,请帮忙看看什么原因?
同一个程序,32位正常,64位有问题,请帮忙看看什么原因?
用鼠标点击窗口中的一个按钮时,用spy获得的消息:
64位和32位的相同消息:
*<00016> 00090202 S WM_MOUSEACTIVATE hwndTopLevel:00090202 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN [wParam:00090202 lParam:02010001]
*<00017> 00090202 S WM_WINDOWPOSCHANGING lpwp:0013F160 [wParam:00000000 lParam:0013F160]
*<00018> 00090202 R WM_WINDOWPOSCHANGING lResult:00000000
*<00019> 00090202 S WM_WINDOWPOSCHANGING lpwp:0013F160 [wParam:00000000 lParam:0013F160]
*<00020> 00090202 R WM_WINDOWPOSCHANGING lResult:00000000
*<00021> 00090202 S WM_ACTIVATEAPP fActive:True dwThreadID:00000000 [wParam:00000001 lParam:00000000]
*<00022> 00090202 R WM_ACTIVATEAPP lResult:00000000
*<00023> 00090202 S WM_NCACTIVATE fActive:True [wParam:00000001 lParam:00000000]
*<00024> 00090202 S WM_GETTEXT cchTextMax:510 lpszText:0013E2E0 [wParam:000001FE lParam:0013E2E0]
*<00025> 00090202 R WM_GETTEXT cchCopied:8 lpszText:0013E2E0 ("Toolbars") [lResult:00000008]
*<00026> 00090202 R WM_NCACTIVATE lResult:00000001
*<00027> 00090202 S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null) [wParam:00000001 lParam:00000000]
*<00028> 00090202 S WM_SETFOCUS hwndLoseFocus:(null) [wParam:00000000 lParam:00000000]
*<00029> 00090202 R WM_SETFOCUS lResult:00000000
*<00030> 00090202 R WM_ACTIVATE lResult:00000000
*<00031> 00090202 S WM_NCPAINT hrgn:79040ACB [wParam:79040ACB lParam:00000000]
*<00032> 00090202 S WM_GETTEXT cchTextMax:510 lpszText:0013E2E0 [wParam:000001FE lParam:0013E2E0]
*<00033> 00090202 R WM_GETTEXT cchCopied:8 lpszText:0013E2E0 ("Toolbars") [lResult:00000008]
*<00034> 00090202 R WM_NCPAINT lResult:00000000
*<00035> 00090202 S WM_ERASEBKGND hdc:00010C9A [wParam:00010C9A lParam:00000000]
*<00036> 00090202 R WM_ERASEBKGND fErased:True [lResult:00000001]
*<00037> 00090202 S WM_WINDOWPOSCHANGED lpwp:0013F160 [wParam:00000000 lParam:0013F160]
*<00038> 00090202 R WM_WINDOWPOSCHANGED lResult:00000000
*<00039> 00090202 R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE [lResult:00000001]
后面64位和32位的消息有些不同:
32位消息:
*<00037> 0006029A S WM_SETCURSOR hwnd:0006029A nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN [wParam:0006029A lParam:02010001]
*<00038> 0006029A R WM_SETCURSOR fHaltProcessing:False [lResult:00000000]
*<00039> 0006029A P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:228 yPos:24 [wParam:00000001 lParam:001800E4 time:0:04:27.728]
<00040> 0006029A S WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000]
<00041> 0006029A R WM_PAINT lResult:00000000
<00042> 0006029A P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:228 yPos:24 [wParam:00000001 lParam:001800E4 time:0:04:27.822]
<00043> 0006029A P WM_LBUTTONUP fwKeys:0000 xPos:228 yPos:24 [wParam:00000000 lParam:001800E4 time:0:04:27.884]
<00044> 0006029A S WM_CAPTURECHANGED hwndNewCapture:00000000 [wParam:00000000 lParam:00000000]
<00045> 0006029A R WM_CAPTURECHANGED lResult:00000000
...
32位代码能正常工作。
64位消息:
*<00040> 00090202 S WM_SETCURSOR hwnd:00090202 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN [wParam:00090202 lParam:02010001]
*<00041> 00090202 R WM_SETCURSOR fHaltProcessing:False [lResult:00000000]
*<00042> 00090202 P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:210 yPos:24 [wParam:00000001 lParam:001800D2 time:2:05:45.409]
<00043> 00090202 S WM_SETCURSOR hwnd:00090202 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE [wParam:00090202 lParam:02000001]
<00044> 00090202 R WM_SETCURSOR fHaltProcessing:False [lResult:00000000]
<00045> 00090202 P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:210 yPos:24 [wParam:00000001 lParam:001800D2 time:2:05:45.471]
<00046> 00090202 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000 time:2:05:45.471]
<00047> 00090202 S WM_SETCURSOR hwnd:00090202 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONUP [wParam:00090202 lParam:02020001]
<00048> 00090202 R WM_SETCURSOR fHaltProcessing:False [lResult:00000000]
<00049> 00090202 P WM_LBUTTONUP fwKeys:0000 xPos:210 yPos:24 [wParam:00000000 lParam:001800D2 time:2:05:45.596]
...
64位代码不能正常工作,会发出Beep声音,窗口好像没有Activate(从标题行颜色看)?
[解决办法]
要不先参考一下MSDN里面的“64 位应用程序”
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vs64/html/fd4026bc-2c3d-4b27-86dc-ec5e96018181.htm
从 Visual Studio 2005 开始,您可以对应用程序进行编译,并将其指定为在 64 位操作系统上作为本机应用程序或在 WOW64 下运行。WOW64 是一个由操作系统提供的兼容性环境,它使得 32 位应用程序能够在 Windows 64 位操作系统上运行。
备注
在 64 位操作系统上,所有使用 .NET Framework 1.0 和 1.1 版生成的应用程序都被视为 32 位应用程序,并始终在 32 位公共语言运行库 (CLR) 上的 WOW64 下运行。此外,使用 .NET Framework 2.0 版生成的 32 位特定应用程序将可以在 64 位平台上的 WOW64 下运行。
在 x86 计算机上,Visual Studio 2005 将安装 32 位的 CLR 2.0 版,而在 64 位 Windows 计算机上,它将同时安装 32 位和合适的 64 位 CLR 2.0 版。(Visual Studio 2005 是一个 32 位应用程序,当安装到 64 位 Windows 操作系统上时,它将在 WOW64 下运行。)
注意
由 x86 模拟和 Itanium 处理器系列的 WOW64 子系统的设计所决定,应用程序只限于在一个处理器上执行。单处理器执行和 x86 模拟降低了 32 位 .NET Framework 应用程序在基于 Itanium 的系统上运行时的性能和伸缩性。建议将使用 .NET Framework 1.1 版的应用程序用作交互式客户端应用程序,而不要用作要求高性能或伸缩性的应用程序,如高负载 ASP.NET 应用程序。您应当考虑使用 .NET Framework 2.0 版,该版本包括对基于 Itanium 的系统的本机 64 位支持,并改进了性能和伸缩性。
就像 32 位 Windows 操作系统一样,在 64 位 Windows 操作系统上运行 64 位托管应用程序时,可以创建的对象的大小也有一个 2GB 的限制。
许多情况下,程序集在 32 位或 64 位 CLR 上可以同等地运行。在 64 位 CLR 上运行时,导致程序的行为发生改变的一些原因有:
结构中包含大小随平台而改变的成员,例如任何指针类型。
指针算法中包含固定大小。
不正确的平台调用或 COM 声明,对句柄使用 Int32,而不是 IntPtr。
将 IntPtr 强制转换为 Int32。
有关移植 32 位应用程序以便在 64 位 CLR 上运行的更多信息,请参见 http://msdn.microsoft.com/library/?url=/library/en-us/dndotnet/html/64migrate.asp。
一般 64 位编程信息
有关 64 位编程问题的一般信息,请参见
http://msdn.microsoft.com/netframework/programming/64bit/
Introducing 64-bit Windows(Platform SDK 文档,也可以在 MSDN 网站上找到)
有关下载公共语言运行库的 64 位版本的信息,请参见 http://www.microsoft.com/china/msdn/download/default.mspx。
有关 Visual Studio 开发环境中对创建 64 位应用程序的支持的信息,请参见 Visual Studio 开发环境 64 位支持。