0

私は ActiveX を持っています。

ActiveX の意味:

  • インターネットエクスプローラ
  • ネイティブ バイナリ コード
  • 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 Protected Mode API が使用する API であるというのは正しかったです。すべての API ヘッダーを変換し、インポートを把握し、コードを記述し、デバッグし、テストしてから、それ使用する正しい API であることを確認する必要がありました。

: 最初に IE がプロテクト モードで実行されているかどうかを確認することで、次のように呼び出して作業を省くことができますIEIsProtectedModeProcess

Boolean isProtectedMode = IEIsProtectedModeProcess();

ボーナスおしゃべり

IE プロテクト モード API関数は、Internet Explorer の外部からは機能しません。

: すべてのコードはパブリック ドメインにリリースされます。帰属は必要ありません。

于 2012-02-12T03:53:29.283 に答える