我有一个ActiveX。
ActiveX意味着:
- Internet Explorer
- 原生二进制代码
- 从dll(.ocx)
运行- 处于保护模式
用户想要保存一些内容。我想显示另存为对话框,然后保存到他们说的位置。
由于托管我的ActiveX的进程是以低完整性级别运行,因此代码无法保存到用户请求的位置。
由于托管我的ActiveX的进程在Internet Explorer的保护模式下运行,因此代码无法保存到用户请求的位置。
而是将文件静默保存到用户未请求的位置。
而是将文件静默保存到最终用户无法找到的位置。
有没有关于如何处理这个问题的建议?
用户试图保存到硬盘上的是什么?这个问题无关紧要。但假装:
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
。执行此操作时,受保护模式的用户代理会将文件从临时位置复制到用户选择的位置。
答案 0 :(得分:1)
Internet Explorer Protected Mode API 是 ActiveX如何将文件保存在低privelage区域之外:
将文件保存到FOLDERID_LocalAppDataLow
文件夹;允许在IE中以低完整性级别运行的进程写入:
String sourceFile = SHGetKnownFolderPath(FOLDERID_LocalAppDataLow)+"\tempcopy.dat";
SaveToFile(sourceFile);
使用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);
指示IE将我们的临时文件移动到用户使用IESaveFile
选择的位置:
IESaveFile(stateCookie, sourceFile);
所以 是正确的,IE保护模式API是要使用的API。我只需要翻译所有的API标题,找出导入,编写代码,调试它,测试它,然后我才能发现 正确使用的API。
注意:首先通过调用IEIsProtectedModeProcess
检查IE是否在保护模式下运行,可以节省一些工作:
Boolean isProtectedMode = IEIsProtectedModeProcess();
IE保护模式API 功能无法在Internet Explorer外部使用。
注意:任何代码都会发布到公共域中。无需归属。