技术开发 频道

面对IE保护模式的开发者生存之道


   其中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 now has the full path to the temp file.
}
   如果IEGetWriteableFolderPath() 成功的话,它将分配一个缓冲器,并在pwszCacheDir中返回它的地址。我们把那个目录传输给GetTempFileName(),然后使用CoTaskMemFree()释放这个缓冲器。

   IEGetWriteableFolderPath() 不仅仅可以用来写临时文件。当一个插件使用保护模式版的文件保存对话框的时候,也会用到它,这一点我们将在下面的《提示用户保存文件》部分解释。在这个演示项目中,当你点击了Save Log按钮后,使用这个API。

3.写注册表

   因为注册表是系统的关键部分,所以有一点很重要,运行在浏览器中的代码不允许来修改注册表的任何可能导致运行恶意软件的部分。为了实现这个目的,只有一个键值是扩展插件可以写的。对于文件系统来说,这个键值在当前用户的文件下的一个专门的低权限区域中。要想得到这个键值的句柄,可以调用IEGetWriteableHKCU():

HRESULT IEGetWriteableHKCU(HKEY* phKey);
   如果它成功的话,你可以在其他的注册表API中使用返回的HKEY来写任何需要的数据。本演示项目没有使用这个注册表,但是这割API是非常简单的,在使用它的时候应该不会什么麻烦。

4.提示用户保存文件

   当IE运行在保护模式的时候,还有一个方式让插件来间接的写低权限区域之外的文件系统。插件可以通过调用IEShowSaveFileDialog()来显示一个常见的保存文件对话框。如果用户输入一个文件名,这个插件然后能够通过调用IESaveFile()来让IE写这个文件。注意这个操作总会让用户看到这个保存文件对话框;这样可以确保用户知道一个文件将被写到计算机上。

   保存一个文件的步骤如下:

  (1)调用IEShowSaveFileDialog() 来显示保存文件对话框。
  (2)调用IEGetWriteableFolderPath() 来得到IE缓存目录。
  (3)写数据到缓冲目录中的一个临时文件中。
  (4)调用IESaveFile()来拷贝数据到用户选择的文件名中。
  (5)清空temp文件。

   IEShowSaveFileDialog()是对普通的文件保存对话框的封装:

HRESULT IEShowSaveFileDialog( 
HWND hwnd,
LPCWSTR lpwstrInitialFileName,
LPCWSTR lpwstrInitialDir,
LPCWSTR lpwstrFilter,
LPCWSTR lpwstrDefExt,
DWORD dwFilterIndex,
DWORD dwFlags,
LPWSTR* lppwstrDestinationFilePath,
HANDLE* phState
);
   hwnd是一个插件拥有的窗口,IE将使用它作为对话框的父窗口。lppwstrDestinationFilePath是一个指向代表用户选择的文件路径的LPWSTR的指针。它仅仅是一个数据信息,因为这个扩展插件不能直接写到这个路径。

   如果用户选择了一个文件名,IEShowSaveFileDialog()返回S_OK,如果他取消了对话框则返回S_FALSE,或者如果这个API失败的话返回一个失败的HRESULT。

0
相关文章