最近为了使程序能运行在windows xp 和windows 7上,对原有代码进行了改造,
其中一个功能是若系统为windows xp,则操作的目录为 windows目录下的某个目录,若系统为windows 7,则操作目录为此目录重定向后的虚拟目录。为了得到虚拟目录,我们可以使用函数SHGetKnownFolderPath取得App Local目录(VirtualStore存在于此目录)。此函数存在于shell32.dll中,而xp下shell32.dll不存在此函数,所以我先判断当前操作系统版本,若为win7,则取得此函数地址,再调用此函数取得App Local目录,以下为代码示例
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
#define DEFINE_KNOWN_FOLDER(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID DECLSPEC_SELECTANY name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
// {F1B32785-6FBA-4FCF-9D55-7B8E7F157091}
DEFINE_KNOWN_FOLDER(FOLDERID_LocalAppData, 0xF1B32785, 0x6FBA, 0x4FCF, 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91);
//#include <ShlObj.h>
//请注意函数指针的声明,必须与SHGetKnownFolderPath一致,且调用方式为WINAPI
typedef HRESULT (WINAPI* pFunSHGetKnownFolderPath)(const GUID& rfid,
DWORD dwFlags,
HANDLE hToken,
PWSTR *ppszPath);
int _tmain(int argc, _TCHAR* argv[])
{
OSVERSIONINFOEX osVersionInfo;
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx((OSVERSIONINFO *)&osVersionInfo);
if (osVersionInfo.dwMajorVersion == 6 &&
osVersionInfo.dwMinorVersion == 1 &&
osVersionInfo.wProductType == VER_NT_WORKSTATION)
{
PWSTR pSzFolderPath = NULL;
std::wstring localPath;
HMODULE hModule = LoadLibrary(_T("shell32.dll"));
pFunSHGetKnownFolderPath SHGetKnownFolderPath = (pFunSHGetKnownFolderPath)GetProcAddress(hModule,"SHGetKnownFolderPath");
if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &pSzFolderPath)))
{
// use pSzFolderPath
localPath = pSzFolderPath;
CoTaskMemFree(pSzFolderPath);
}
}
//TCHAR buffer[256];
//for (int i=0;i<256;i++)
//{
// buffer[i]=0;
//}
//HRESULT hr = SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,SHGFP_TYPE_DEFAULT,buffer);
//
//wcout<<buffer<<endl;
return 0;
}