0

我有一个 ActiveX。

ActiveX 意味着:

  • IE浏览器
  • 本机二进制代码
  • 从 dll (.ocx) 运行
  • 在保护模式

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

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

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

相反,文件被静默保存到用户未请求的位置。

相反,文件被静默保存到最终用户无法找到它们的位置。

关于如何处理这个问题有什么建议吗?

奖金喋喋不休

用户试图将什么保存到他们的硬盘上?这个问题没关系。但假装:

  • 这是几百兆字节的 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我设法保存在某个地方的文件将在哪里(这是另一个问题)。

奖金阅读

了解和在保护模式下工作 Internet Explorer

将文件保存到用户配置文件

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

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

使用用户配置文件文件夹的位置调用IEShowSaveFileDialog以提示用户将文件保存在不同的位置。如果用户接受“另存为”对话框,则 IEShowSaveFileDialog返回所选的目标文件夹。

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

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

4

1 回答 1

2

Internet Explorer 保护模式 API ActiveX 如何在低权限区域之外保存文件的方式:

  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);
    

所以我说 IE 保护模式 API 是要使用的 API 是对的我只需要翻译所有的 API 头文件,找出导入,编写代码,调试它,测试它,然后我才能确定它正确的 API 使用。

注意:您可以先检查 IE 是否在保护模式下运行,这样可以节省一些工作,方法是调用IEIsProtectedModeProcess

Boolean isProtectedMode = IEIsProtectedModeProcess();

奖金喋喋不休

IE 保护模式 API函数在Internet Explorer 外部不起作用。

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

于 2012-02-12T03:53:29.283 回答