Windows Vista IE 7保护模式开发者生存指南
2008-08-22 17:24:11 来源:WEB开发网回到话题上来,当插件想要对文件系统进行写入时,应使用IEGetWriteableFolderPath() API而不是GetSpecialFolderPath()、GetFolderPath()、SHGetKnownFolderPath()。IEGetWriteableFolderPath()可探知保护模式,如果插件请求的目录不允许写入,IEGetWriteableFolderPath()会返回E_ACCESSDENIED,IEGetWriteableFolderPath()的原型如下:
HRESULT IEGetWriteableFolderPath(GUID clsidFolderID, LPWSTR* lppwstrPath);
GUID为定义在knownfolders.h头文件中的FOLDERID_InternetCache、FOLDERID_Cookies及FOLDERID_History,另外,似乎没有与Temp目录对应的GUID,所以当需要写临时文件时,推荐使用FOLDERID_InternetCache。以下为在缓存中创建临时文件的一段代码:
HRESULT hr;
LPWSTR pwszCacheDir = NULL;
TCHAR szTempFile[MAX_PATH] = {0};
hr = IEGetWriteableFolderPath(FOLDERID_InternetCache, &pwszCacheDir);
if ( SUCCEEDED(hr) )
{
GetTempFileName(CW2CT(pwszCacheDir), _T("bob"), 0, szTempFile);
CoTaskMemFree(pwszCacheDir);
// szTempFile中现在为临时文件的完整路径
}
如果IEGetWriteableFolderPath()成功,它会分配一块缓冲区并在pwszCacheDir中返回其地址,我们只须把这个目录传递给GetTempFileName(),接着用CoTaskMemFree()释放缓冲区就行了。
IEGetWriteableFolderPath()不仅是用于写临时文件,插件也可在保护模式的另存为对话框中用到它,这将在下面的“提示用户保存文件”一节中说到。
注册表的写入
因为注册表是系统的关键区域,所以,不应允许运行在浏览器中的代码修改其中的任何部分,以防止运行恶意代码。为此,只有一个键值对插件来说可写,与文件系统一样,这个键也是在当前用户配置文件下的低权限区域,可通过调用IEGetWriteableHKCU()来获取此键的句柄:
更多精彩
赞助商链接