Изменение "отладочной/рабочей директории" глобально (не для каждого пользователя) в VS2008

У меня есть решение на С++ в VS2008 с несколькими проектами. Это решение содержит файлы, которые необходимы во время выполнения, которые загружаются по пути относительно каталога решений (например, "Testing/data/" + "dataN.bin").

Чтобы это решение работало, я должен установить рабочий каталог в проекте (-ах), чтобы он указывал на каталог решения (например, Configuration Properties >> Debugging >> Working Directory = $(SolutionDir)). Это отлично работает, когда я отлаживаю свой компьютер. Однако, когда другой пользователь загружает мое решение, его проекты не имеют этого свойства правильно.

Я проследил этот параметр, который должен храниться не в файле проекта (PROJECT.vcproj), а в созданном для него файле пользователя (PROJECT.vcproj.DOMAIN.USER.user).

Я хотел бы, чтобы этот параметр сохранялся для ВСЕХ пользователей, без необходимости его вручную и снова.

Мои мысли были:

  • Найдите способ сохранить его в файле .vcproj (а не в пользовательском) или файле решения.
  • Найдите способ создания файла по умолчанию для пользователя по умолчанию ", из которого начнутся все пользовательские настройки (и позже можно будет изменить их позже).

Однако я не нашел способ сделать это.

Еще несколько заметок/ограничений:

  • Мне нужно работать со многими большими файлами в качестве этих ресурсов, поэтому я хотел бы избежать выполнения копий в разные каталоги.
  • Решения должны поддерживать несколько конфигураций сборки (отладка, выпуск и т.д.).
  • Я хотел бы избегать сценариев pre/post build, если это возможно, чтобы держать вещи простыми (низкий приоритет).

Любая помощь будет оценена... спасибо заранее.

Ответ 1

Нет такого свойства. Есть большие проблемы, это также должно работать после развертывания вашего решения. Рабочий каталог тогда не будет каталогом "решения", на целевой машине не будет.

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

Другим стандартным решением является копирование любых ресурсов, необходимых EXE, в папку, относящуюся к выходной папке сборки. Вы делаете это с событием Pre-Build, заставляя командную строку выглядеть так:

if not exist "$(OutDir)\Testing" md "$(OutDir)\Testing"
xcopy /d /s "$(SolutionDir)\Testing\*.*" "$(OutDir)\Testing

Обратите внимание, что параметр /d гарантирует, что копирование будет выполнено только при изменении содержимого папки тестирования.

Ответ 2

  • Настройте параметры отладки как обычно (установите рабочий каталог, задайте параметры и т.д.), но используйте только относительные пути, переменные. НЕ используйте абсолютные пути, такие как D:\MyProject\libs
  • Сохраните решение, а затем закройте Visual Studio.
  • Перейдите в каталог проекта и найдите PROJECT.vcproj.COMPUTERNAME.USER.user
  • Переименуйте его в PROJECT.vcproj.user (этот файл будет общей конфигурацией отладки, вы можете передать его исходному элементу управления)
  • Откройте Visual Studio, внесите дополнительные дополнения в настройки отладки, если это необходимо. (Дополнительная информация будет храниться в файле PROJECT.vcproj.COMPUTERNAME.USER.user, который вам определен. Обратите внимание: PROJECT.vcproj.COMPUTERNAME.USER.user переопределит унаследованную конфигурацию)

Пример файла PROJECT.vcproj.user приведен ниже

<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
    ProjectType="Visual C++"
    Version="9,00"
    ShowAllFiles="false"
    >
    <Configurations>
        <Configuration
            Name="Release|Win32"
            >
            <DebugSettings
                Command="$(ProjectDir)..\Deploy\$(ConfigurationName)\$(TargetFileName)"
                WorkingDirectory="$(ProjectDir)..\Deploy\$(ConfigurationName)\"
                CommandArguments=""
                Attach="false"
                DebuggerType="3"
                Remote="1"
                RemoteMachine="LOCALHOST"
                RemoteCommand=""
                HttpUrl=""
                PDBPath=""
                SQLDebugging=""
                Environment=""
                EnvironmentMerge="true"
                DebuggerFlavor="0"
                MPIRunCommand=""
                MPIRunArguments=""
                MPIRunWorkingDirectory=""
                ApplicationCommand=""
                ApplicationArguments=""
                ShimCommand=""
                MPIAcceptMode=""
                MPIAcceptFilter=""
            />
        </Configuration>
        <Configuration
            Name="Debug|Win32"
            >
            <DebugSettings
                Command="$(ProjectDir)..\Deploy\$(ConfigurationName)\$(TargetFileName)"
                WorkingDirectory="$(ProjectDir)..\Deploy\$(ConfigurationName)\"
                CommandArguments=""
                Attach="false"
                DebuggerType="3"
                Remote="1"
                RemoteMachine="LOCALHOST"
                RemoteCommand=""
                HttpUrl=""
                PDBPath=""
                SQLDebugging=""
                Environment=""
                EnvironmentMerge="true"
                DebuggerFlavor="0"
                MPIRunCommand=""
                MPIRunArguments=""
                MPIRunWorkingDirectory=""
                ApplicationCommand=""
                ApplicationArguments=""
                ShimCommand=""
                MPIAcceptMode=""
                MPIAcceptFilter=""
            />
        </Configuration>
    </Configurations>
</VisualStudioUserFile>

Ответ 3

Вместо настройки "Отладчик/рабочий каталог" вы можете использовать "Свойства конфигурации/Общие/Вывод каталога" или "Свойства конфигурации/Файл компоновщика/вывода". Эти настройки предназначены для каждого проекта, а не для каждого пользователя, и если вы оставите рабочий каталог неповрежденным, это значение по умолчанию для рабочего каталога приложения.

Ответ 4

Интересно, будет ли это возможным, поскольку у пользователя может быть недостаточно прав для доступа и чтения/записи в каталог, я полагаю, что VS проверяет, имеет ли пользователь доступ к каталогу, когда вы его выбираете, что, вероятно, только на основе учетной записи.