从ActiveX保存文件的技术(保护模式IE)

时间:2012-02-09 15:30:56

标签: internet-explorer protected-mode

我有一个ActiveX。

  

ActiveX意味着:

     
      
  • Internet Explorer
  •   
  • 原生二进制代码
  •   
  • 从dll(.ocx)
  • 运行   
  • 处于保护模式
  •   

用户想要保存一些内容。我想显示另存为对话框,然后保存到他们说的位置。

由于托管我的ActiveX的进程是以完整性级别运行,因此代码无法保存到用户请求的位置。

由于托管我的ActiveX的进程在Internet Explorer的保护模式下运行,因此代码无法保存到用户请求的位置。

而是将文件静默保存到用户未请求的位置。

而是将文件静默保存到最终用户无法找到的位置。

有没有关于如何处理这个问题的建议?

Bonus Chatter

用户试图保存到硬盘上的是什么?这个问题无关紧要。但假装:

  • 这是一个几百兆的3D cad网格
  • 这是一个GIS图像转储
  • 这是一个PDF
  • 这是一个PNG
  • 这是一个文本文件

补充阅读

Internet Explorer的保护模式api 允许插件显示已保存的内容:

IEShowSaveFileDialog(this.Handle, "Eden.3ds", 
      GetUserDocumentsFolder(), null, 
      "3D Studio File|*.3ds|GIS Imagery|*.kvm|Adobe Acrobat File|*.pdf|All Files|*.*|"
      null, 0, 
      OFN_ENABLESIZING | OFN_PATHMUSTEXIST,
      ref destinationPath, ref stateCookie);

然后使用提供的 cookie 保存文件:

IESaveFile(stateCookie, sourcefilename);

sourcefilename将成为我设法保存的文件(这是另一个问题)。

奖金阅读

  

Understanding and Working in Protected Mode Internet Explorer

     

Saving Files to the User Profile

     

某些扩展需要将文件保存到特定位置,以便用户或应用程序以后可以找到这些文件。以下步骤说明如何将文件保存在低完整性位置之外:

     

在%userprofile%\ AppData \ LocalLow中创建该文件的临时版本。请记住在文件成功保存后删除临时文件。

     

使用用户个人资料文件夹的位置调用IEShowSaveFileDialog,提示用户将文件保存在其他位置。如果用户接受另存为对话框, IEShowSaveFileDialog 将返回所选目标文件夹。

     

使用步骤1中保存的临时文件的位置调用IESaveFile

     

执行此操作时,受保护模式的用户代理会将文件从临时位置复制到用户选择的位置。

1 个答案:

答案 0 :(得分:1)

Internet Explorer Protected Mode API ActiveX如何将文件保存在低privelage区域之外:

  1. 将文件保存到FOLDERID_LocalAppDataLow文件夹;允许在IE中以完整性级别运行的进程写入:

    String sourceFile = SHGetKnownFolderPath(FOLDERID_LocalAppDataLow)+"\tempcopy.dat";
    SaveToFile(sourceFile);
    
  2. 使用IEShowSaveFileDialog向用户显示保存对话框:

    int stateCookie = 0;
    
    IEShowSaveFileDialog(this.Handle, //hwnd
          "FemaleMesh.3ds", //suggested filename
          SHGetKnownFolder(FOLDERID_Desktop), //suggested save location
          "3D Studio Mesh|*.3ds|All Files|*.*", //save filer
          "3ds", //default extension
          1, //default one-based filter index
          ref destinationFile, 
          ref stateCookie);
    
  3. 指示IE将我们的临时文件移动到用户使用IESaveFile选择的位置:

    IESaveFile(stateCookie, sourceFile);
    
  4. 所以 是正确的,IE保护模式API是要使用的API。我只需要翻译所有的API标题,找出导入,编写代码,调试它,测试它,然后我才能发现 正确使用的API。

    注意:首先通过调用IEIsProtectedModeProcess检查IE是否在保护模式下运行,可以节省一些工作:

    Boolean isProtectedMode = IEIsProtectedModeProcess();
    

    Bonus Chatter

    IE保护模式API 功能无法在Internet Explorer外部使用。

      

    注意:任何代码都会发布到公共域中。无需归属。