2012-10-23 136 views
10

我在Visual Studio 2010(在Windows 7 64位下)創建了一個64位C++項目;64位vC++程序似乎在32位模式下運行

我還以爲是運行64位應用程序,而下面的代碼返回真正

bool is64bit = (sizeof(void*)==8); 

,但如果我調用的函數IsWow64Process,它返回FALSE ...

更多奇怪的事情:

  • 調用LoadLibrary()加載dll在c:\windows\system32\some.dll效果很好
  • 加載一個dll c:\windows\sysWow64\some.dll下將失敗(錯誤代碼193:some.dll不是有效的Win32應用程序)

所有這些失敗表明應用程序在32位模式, 運行,但是這是反對真相的指針類型是8字節長度

我很困惑,任何幫助將不勝感激!

回答

11

調用LoadLibrary()來加載一個dll在c:\ windows \ system32 \ some.dll下運行良好;在c:\ windows \ sysWow64 \ some.dll下加載dll會失敗

你說的一切都表明你正在運行64位。

在Windows的64位中,System32文件夾包含64位版本的DLL,並且SysWow64文件夾包含32位版本。當IsWow64Process返回TRUE時,這意味着您是64位操作系統上的32位應用程序。

這與文件夾中的名稱暗示的內容相反,這可能是爲什麼這看起來很混亂。基本上,SysWow64文件夾是用於在WoW64下使用的32位版本,即「Windows 64位上的Windows 32位」 - 基本上,當您運行32位時使用WoW64 DLL ,並且在運行時運行正常的DLL 64位。

+0

+1 OP描述的所有內容都與64位操作系統上的64位應用程序100%一致。 –

+0

@DavidSchwartz是的 - 人們感到困惑,因爲使用WoW64意味着你正在運行32位,這是你想的名字的反面); –

+0

好的答案。意識到WoW64和system32之間的區別讓我前段時間頭痛不已。 – nothrow

3

Ctrl-Shitf-Esc運行任務管理器應用程序。在「進程」選項卡中,您將看到每個32位進程的名稱都包含*32標籤。 這是檢查進程位的最簡單方法之一。

相關問題