Техника сохранения файлов из ActiveX (защищенный режим IE) - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть ActiveX.

ActiveX означает:

  • Internet Explorer
  • собственный двоичный код
  • , запущенный из DLL(.ocx)
  • в защищенном режиме

Пользователь хочет сохранить некоторый контент.я хотел бы показать диалоговое окно Сохранить как , а затем сохранить в указанном месте.

Поскольку процесс, на котором размещен мой ActiveX, работает на уровне целостности Низкий ,код не может быть сохранен в запрошенном месте пользователя.

Поскольку процесс, на котором размещен мой ActiveX, работает в защищенном режиме Internet Explorer, код не может быть сохранен в запрошенном месте пользователя.

Вместо этого файлымолча сохраняется в месте, которое пользователь не запрашивал.

Вместо этого файлы молча сохраняются в месте, где конечный пользователь не может их найти.

Есть ли предложениякак с этим справиться?

Bonus Chatter

Что пользователь пытается сохранить на свой жесткий диск?Это не имеет значения для вопроса.Но притворитесь:

  • это 3D-сетка размером в несколько сотен мегабайт
  • это дамп изображений ГИС
  • это 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.

При этом посредник пользователя в защищенном режиме копирует файл из временного расположения в местоположение, выбранное пользователем.

1 Ответ

1 голос
/ 12 февраля 2012

API защищенного режима Internet Explorer означает , как 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);
    

Так что я был прав, что API защищенного режима IE был API для использования. Мне просто нужно было перевести все заголовки API, выяснить импорт, написать код, отладить его, протестировать, прежде чем я смог понять, что является правильным API для использования.

Примечание : Вы можете сэкономить некоторую работу, проверив, сначала ли IE работает в защищенном режиме, вызвав IEIsProtectedModeProcess:

Boolean isProtectedMode = IEIsProtectedModeProcess();

Бонусная болтовня

API защищенного режима IE не работают вне Internet Explorer.

Примечание : любой код публикуется в открытом доступе. Указание авторства не требуется.

...