2013-03-20 2 views
9

Я читал бесчисленные сообщения по этой теме, но не могу обернуть мозг вокруг всего. У меня есть старое приложение VB6, которое использовалось для установки в папке в корневом каталоге. В этой папке были подпапки:
\ данные подпапок для доступа к базам данных
\ цитирует вложенной папки, где будут храниться генерироваться пользовательские текстовые документы и \ подпорка где моя программа периодически резервной копии ПДБА-хУстановка приложения VB6 на Windows XP, Windows 7, Windows 8

Он отлично работал, и жизнь была простой. Теперь, когда мы пытаемся установить Windows 7 и Windows 8, программа устанавливается в папку программ (x86). Программы работают нормально, но все обновления баз и текстовые файлы хранятся в виртуальном хранилище в папке пользователей, чего мы не хотим.

Я знаю, почему это происходит, и я знаю, что мне нужно изменить мою программу для размещения Windows 7/8. Может кто-то, пожалуйста, дайте мне ясное объяснение/рекомендацию по следующим вопросам:

Я знаю, что папка appdata под «пользователями» является рекомендуемым местом для хранения баз данных/файлов слов/резервных копий. Тем не менее, в моей системе, которая скрыта, и я хотел бы, чтобы она была легко доступна пользователю (не скрыта), поэтому я думал о папке MyDocuments?

Я читал эту тему: Where should I store application specific settings?, которая дает мне некоторое представление о том, как найти файлы/местоположения в коде, хотя неясно, как найти MyDocuments. Может ли кто-нибудь помочь?

Здесь я еще больше запутался. Если я хотел использовать что-то вроде MyDocuments \ CompanyName или даже папки Appdata, упомянутой в приведенной выше ссылке, , как мне сообщить мастеру пакета/развертывания, чтобы установить файлы mdb и папки, упомянутые выше, в эту конкретную папку? Есть ли макрос для папок Appdata или MyDocuments в PDW, которые я могу использовать? Я нахожусь на компьютере с XP, и поэтому мой путь будет отличаться от того, как для Windows 7/8.

Любая помощь/понимание были бы оценены.

+1

Сбрасывая приложения в забавные места, такие как каталог под корнем системного диска и позволяя всем пользователям быть администраторами или обладателями мощности, а также тонкой прокладки для приложений, позволили многим людям притвориться, что WinXP является машиной Win9x. Мир намного сложнее, и поскольку такие методы оставляют открывающиеся дыры в безопасности, PDW полезен только для простых приложений. – Bob77

+0

, так вы говорите, что с помощью PDW нет простого способа установить файлы/папки mdb в папку «Мои документы» или папку AppData? Будет ли Инно сделать это проще? –

+0

Лично я бы избежал Inno, как чумы. Он может быть мощным, но вы также можете легко создавать flaky настройки, которые «ломают» другие приложения на одном ПК. Ни один инсталлятор не может установить в папку пользователя, так как он не знает, что пользователь или пользователи будут входить в систему и ожидать использования вашего приложения. – Bob77

ответ

4

Я знаю, что папка appdata под «пользователями» является рекомендуемым местом для хранения баз данных/файлов слов/резервных копий. Тем не менее, в моей системе, которая скрыта, и я хотел бы, чтобы она была легко доступна пользователю (не скрыта), поэтому я думал о папке MyDocuments?

Оба эти местоположения для данных для каждого пользователя. Таким образом, ваш установщик ничего не может поместить, потому что при нормальных обстоятельствах он даже не будет запущен под целевым пользователем времени выполнения и не будет знать, какой из них предназначался для этих данных.

Вместо этого вы захотите решить, какие файлы предназначены для каждого компьютера и которые предназначены для каждого пользователя. Любые файлы для каждого пользователя должны быть созданы или скопированы вашим приложением в «первом запуске», которые он обычно обнаруживает, проверяя наличие файла INI для каждого пользователя в папке приложения для каждого пользователя (которую также необходимо создать) под LocalAppData.

Файлы в машине попадают в папку, созданную установщиком, в ProgramData (CommonAppData). В большинстве случаев вашему установщику необходимо не только создать эту подпапку «компания/приложение», но и установить защиту в папке, чтобы пользователи имели необходимые права доступа к размещенным там предметам. Затем установщик может поместить в эту папку любые развернутые данные для каждого компьютера, такие как файлы настроек, MDB и т. Д.

Исключением могут быть файлы шаблонов для каждого компьютера, которые копируют ваши действия с первым запуском в профили пользователей или другие данные, предназначенные только для чтения в течение всего срока службы приложения. Их все еще можно сбросить в подпапку Program Files рядом с EXE (или в подпапке и т. Д.).

PDW является слишком старым и примитивным для выполнения всех необходимых действий по установке. Это не означает, что вы не можете взломать setup1.vbp (предоставляемый установкой VB6 и PDW), чтобы создать пользовательскую настройку1. Но обычно это не стоит того, так как вы не можете расширить «мастер» PDW, чтобы иметь новые экраны и принимать новую информацию.

Когда в 1998 году появился установщик Windows, Microsoft выпустила бесплатный инструмент обновления под названием Visual Studio 6.0 Installer 1.0 (а через год или около того 1.1) для дополнения/замены PDW.

В Microsoft не размещаются два файла загрузки, содержащие VSI 1.1, хотя вы все равно можете найти копии, размещенные сторонними лицами (например, проверка на вирусы).

Вы также можете использовать тип проекта установщика в более новой версии Visual Studio (хотя я считаю, что они потянули его, начиная с VS 2012). Есть также такие вещи, как набор инструментов WiX и сторонние инструменты, основанные на установщике.

Но даже с VSI 1.1 вы обнаружите, что многие вещи, которые вам нужны для вашего пакета, не могут быть указаны в VSI 1.1, и это означает, что вам нужно внести некоторые улучшения после сборки в базу данных MSI. Вы можете сделать это, используя Orca из SDK установщика или с помощью сценариев WSH, которые используют интерфейс автоматизации установщика Windows, чтобы сделать эти изменения после сборки.

Я прочитал (а) эту тему: Где я могу сохранить настройки приложения? что дает мне некоторое представление о том, как найти файлы/местоположения в коде, хотя неясно, как найти MyDocuments. Может ли кто-нибудь помочь?

Использование операций Shell осуществляется через интерфейс автоматизации или вызовы API. Это местоположение запрашивается через константы ssfPERSONAL, CSIDL_PERSONAL или FOLDERID_Documents, в зависимости от того, какой звонок вы решите сделать для его получения.

+0

Благодарим вас за отличный ответ. Не уверен, как снять то, что вы предлагаете, но он указывает мне направление. Из раздела «Я этого не делаю, но я просто должен спросить», что произойдет в Windows 7 и 8, если я просто установил программы в c: \ myprogram с подпапками для mdbs, текстовыми документами и т. Д., Как я это сделал обратно в тот же день? О, как я долго для более простых времен :) –

+1

Как только любой пользователь открывает их с помощью R/W-доступа, Windows сделает частную копию в VirtualStore. В некоторых случаях это работает как альтернатива «хромать», но имеет последствия, которые могут привести к разным путаницам. Он не предназначен как стратегия развития, а способ хромать вместе со старой программой, к которой у вас нет исходного кода. – Bob77

7

Я знаю, почему это происходит, и я знаю, что мне нужно изменить мою программу для размещения Windows 7/8.

Хорошо, тогда я постараюсь не бить мертвой лошади (хотя это я, я регулярно люблю давать хорошую порку, потому что так много людей неправильно понимают это). Я только укажу, что тот факт, что ваша программа когда-либо работала правильно, даже в старых версиях Windows, была удачным следствием скрытой ошибки. Папка «Program Files» никогда не предназначалась для записи. Вы не просто работаете над какой-то глупой «проблемой» новых версий Windows. Это то, что должно было быть сделано с самого начала.

Я знаю, что папка appdata под «пользователями» является рекомендуемым местом для хранения баз данных/файлов слов/резервных копий. Тем не менее, в моей системе, которая скрыта, и я хотел бы, чтобы она была легко доступна пользователю (не скрыта), поэтому я думал о папке MyDocuments?

Я знаю, что это сложно, поэтому позвольте мне посмотреть, могу ли я попытаться сделать его максимально простым и hellip;

«App Data» папки для данных, предназначенных для внутреннего использования приложением и не намеревался увидеть или манипулировать непосредственно пользователем.

«Мои документы» папка предназначена для всего, что пользователь должен видеть и непосредственно манипулировать; другими словами, пользователь данные вместо приложение данные.

А также есть и пользовательские и глобальные варианты каждого из этих двух типов папок. В случае «данных приложения» вариант для каждого пользователя далее подразделяется на локальный (который находится только на локальной машине) и роуминг (который следует за учетной записью пользователя на любой машине в сети, к которой она входит в систему).

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

Причина, по которой все эти сложные правила существуют, состоит в том, что недобросовестные приложения таких популярных поставщиков, как Microsoft и Adobe, имели (имели?) Тенденцию сбрасывать мусор в папку «Мои документы» пользователя, что никогда не было пользователем предназначенный для непосредственного взаимодействия. Затем пользователи откроют папку с документами и видят кучу вещей, которые они никогда не кладут туда. «Что это за вещи? Это не мои. Где мои документы?» Моя мать попросила меня на прошлой неделе, когда я обновил ее компьютер.

Непонятно, как найти MyDocuments. Может ли кто-нибудь помочь?

От VB 6? Легкий способ - это тот, который был предложен Bob и Mark в вопросе, на который вы посмотрели. Это включает в себя создание объекта Shell и запрос на его местоположение.

Недостающая часть - это константа, которая соответствует папке «Мои документы». Вы найдете полный список констант here. Тот, который вам нужен, называется ssfPERSONAL (потому что в старые времена, когда этот API был создан, Windows была не такой дружелюбной, и имя «Мои документы» еще не было изобретено), которое имеет значение &H05. Таким образом, код выглядит следующим образом:

Const ssfPERSONAL = &H05 

Dim strMyDocsPath As String 
strMyDocsPath = CreateObject("Shell.Application").NameSpace(ssfPERSONAL).Self.Path 

Если бы я хотел использовать что-то вроде MyDocuments \ НазваниеКомпании или даже папку AppData, указанной в приведенной выше ссылке, как я могу сказать, мастер пакета/развертывания для установки файлов MDB и папки, упомянутые выше, в эту конкретную папку? Есть ли макрос для папок Appdata или MyDocuments в PDW, которые я могу использовать?

Там не так много, что я могу добавить к этому, что Боб уже не покрывает в his answer, кроме рекомендовать, пока вы модернизацию этого VB приложение, вы также рассмотреть вопрос о вынужденном отжившем PDW в пользу системы лучший установщик.

Лично я огромного поклонник Inno Setup, который является бесплатным инсталлятором утилитой для приложений Windows, который предлагает больше возможностей, чем вы можете встряхнуть палку. Он отлично работает с приложениями VB 6. Я использовал его много раз для этого сам. Я думаю, что он довольно прост в использовании, по крайней мере, для основ. Он поддерживает всевозможные расширенные настройки, и некоторые из них могут быть сложными, если вы не учитесь хорошо, читая документацию, но все это очень удобно. Я даже наткнулся на то, чтобы написать код Delphi, чтобы настроить проекты Inno Setup!

В Inno Setup вы получаете доступ к путям к системным папкам, используя один из pre-defined constants. Например, {userdocs} и {commondocs}. Они работают так же, как (если не так, как было, давно) макросы в PDW.

Конечно, это все еще не устраняет проблему. Боб справедливо указывает: концепция папки «Мои документы» пользователя на самом деле не имеет особого смысла для установщика. Конечно, вы можете получить доступ к глобальному (общедоступным) папкам «Мои документы», потому что они доступны всем пользователям, но это, вероятно, не тот, который вам нужен. Установщик должен иметь возможность запускаться любым пользователем с достаточными привилегиями, и на самом деле это часто является учетной записью администратора, которая отличается от обычной учетной записи пользователя, используемой для запуска вашего приложения. Вы не можете принять определенную учетную запись пользователя во время установки, и ваш дизайн должен учитывать это.

Мне кажется, что «шаблонный» подход был бы хорошим для вас. Полный набор файлов, используемых для настройки новой учетной записи пользователя, можно сохранить в папке «Program Files». Это на самом деле хорошее место для него, потому что оно хорошо защищено от ошибочных изменений, и поскольку вы будете только , читаете, вы можете получить необходимые разрешения. Когда приложение запускается впервые под новой учетной записью пользователя, оно может обнаружить этот факт и предложить настроить новую учетную запись пользователя для использования с приложением. На этом этапе вы знаете, что работаете под правильной учетной записью пользователя, поэтому вы можете использовать приведенный выше код для запроса местоположения папки «Мои документы» этого пользователя. Если желаемая структура папок настроена в подкаталоге папки вашего приложения в «Program Files», настройка новой учетной записи пользователя может быть такой же простой, как копирование по этой папке. Если вам нужно собирать информацию у пользователя или предлагать параметры настройки, вы можете написать небольшой «First Run Wizard».

+2

wow. благодарю вас за очень всесторонний ответ. Я полностью перегружен, но я потрачу некоторое время на его переваривание. Я очень ценю время и усилия, которые вы вкладываете в объяснение подхода. –

+0

Can @ Bob77 или кто-либо еще дает представление о том, как наилучшим образом определить, является ли это первым запуском приложения? Я могу только подумать о добавлении фиктивного текстового файла во время установки, а затем проверить его там. Если это так, скопируйте файлы в MyDocuments и удалите текстовый файл, чтобы в следующий раз его пропустить. Нужно ли мне беспокоиться о том, чтобы пропустить или перенести на администратора? Как это сделать в коде? thx заранее. –

+1

Наиболее очевидным выбором является либо определение базы данных при наличии ключа реестра для каждого пользователя (добавленного во время первого запуска, когда не обнаружено), либо еще что-то вроде файла INI для каждого пользователя, хранящегося в специальной папке LocalAppData. – Bob77

Смежные вопросы