C/C++ 获取Windows系统的位数32位或64位的实现代码
C/C++获取Windows系统的位数32位或64位的实现代码
场景
1.在Windows64bit系统开发程序时,某些情况需要判断ProgramFiles路径,但是64bit系统有两个ProgramFiles或ProgramFiles(x86),这时候就需要根据当前系统的位数来获取路径了.
说明
1.通过判断程序是32bit或64bit并没有什么用,因为64bit系统可以运行32bit和64bit程序.
2.64bit系统的kernel32.dll里有一个函数接口IsWow64Process,只需要判断这个dll是否有这个导出函数即可.
例子
//test-OSBit.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" #include#include"Shlobj.h" #include typedefBOOL(WINAPI*LPFN_ISWOW64PROCESS)(HANDLE,PBOOL); staticLPFN_ISWOW64PROCESSfnIsWow64Process=NULL; // //FUNCTION:SafeIsWow64Process(HANDLE,PBOOL) // //PURPOSE:ThisisawrapperoftheIsWow64ProcessAPI.Itdetermines //whetherthespecifiedprocessisrunningunderWOW64.IsWow64Process //doesnotexistpriortoWindowsXPwithSP2andWindowServer2003with //SP1.Forcompatibilitywithoperatingsystemsthatdonotsupport //IsWow64Process,callGetProcAddresstodetectwhetherIsWow64Processis ///implementedinKernel32.dll.IfGetProcAddresssucceeds,itissafeto //callIsWow64Processdynamically.Otherwise,WOW64isnotpresent. // //PARAMETERS: //*hProcess-Ahandletotheprocess. //*Wow64Process-ApointertoavaluethatissettoTRUEiftheprocess //isrunningunderWOW64.Iftheprocessisrunningunder32-bitWindows, //thevalueissettoFALSE.Iftheprocessisa64-bitapplication //runningunder64-bitWindows,thevalueisalsosettoFALSE. // //RETURNVALUE:Ifthefunctionsucceeds,thereturnvalueisTRUE.If //IsWow64Processdoesnotexistinkernel32.dll,orthefunctionfails, //thereturnvalueisFALSE. // staticBOOLWINAPISafeIsWow64Process(HANDLEhProcess,PBOOLWow64Process) { if(fnIsWow64Process==NULL) { //IsWow64Processisnotavailableonallsupportedversionsof //Windows.UseGetModuleHandletogetahandletotheDLLthat //containsthefunction,andGetProcAddresstogetapointertothe //functionifavailable. HMODULEhModule=GetModuleHandle(L"kernel32.dll"); if(hModule==NULL) { returnFALSE; } fnIsWow64Process=reinterpret_cast ( GetProcAddress(hModule,"IsWow64Process")); if(fnIsWow64Process==NULL) { returnFALSE; } } returnfnIsWow64Process(hProcess,Wow64Process); } // //FUNCTION:Is64BitOS() // //PURPOSE:Thefunctiondetermineswhetherthecurrentoperatingsystemis //a64-bitoperatingsystem. // //RETURNVALUE:ThefunctionreturnsTRUEiftheoperatingsystemis //64-bit;otherwise,itreturnsFALSE. // staticBOOLIs64BitOS() { #ifdefined(_WIN64) returnTRUE;//64-bitprogramsrunonlyonWin64 #elifdefined(_WIN32) //32-bitprogramsrunonboth32-bitand64-bitWindows BOOLf64bitOS=FALSE; return(SafeIsWow64Process(GetCurrentProcess(),&f64bitOS)&&f64bitOS); #else returnFALSE;//64-bitWindowsdoesnotsupportWin16 #endif } int_tmain(intargc,_TCHAR*argv[]) { TCHARfolder[MAX_PATH]={0}; if(Is64BitOS()) ::SHGetSpecialFolderPath(NULL,folder,CSIDL_PROGRAM_FILESX86,FALSE); else ::SHGetSpecialFolderPath(NULL,folder,CSIDL_PROGRAM_FILES,FALSE); std::wcout<<"32bitProgramFiles:"< 输出:
32bitProgramFiles:C:\ProgramFiles(x86)参考
SHGetSpecialFolderPathfunction
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!