Почему моему коду не удается создать каталог в «C: \ Program Files» под Windows 7? - PullRequest
0 голосов
/ 03 января 2011

Я использую Windows 7, и мне нужно запустить одну программу в этих окнах, но эта программа работает в Windows XP.Это программа на Visual C ++, и я использую Visual Studio 2008 для этого.Когда я запускаю свое приложение, оно не выдает никаких ошибок, но не создает каталог в «c: \ program files \».Так может кто-нибудь помочь мне создать каталог и исполняемый файл?

Это код, который я использую:

char szAppPath[MAX_PATH];
char szFileName[MAX_PATH];
DWORD dwResult;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;

dwResult = ExpandEnvironmentStrings( NULL, szAppPath, MAX_PATH);  // "%ProgramFiles%"


// do same for NSim directory
strcat(szAppPath,"\\NSim");
hFind = FindFirstFile(szAppPath, &FindFileData);

if (hFind == INVALID_HANDLE_VALUE) 
{
    //Directory Does't Exists create New
    if(!CreateDirectory(szAppPath,NULL))  //Throw Error
    {
        MessageBox("Unable to Create N-SIM directory","NSim Installer");
        return ;
    }
} 
else  
{
    //check if is directory or not
    if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
    {
        MessageBox("Can't Create N-SIM directory\n Another file with same name exists","NSim Installer");
        return ;
    }

    FindClose(hFind);
}

//***************************************N-SIM Application****************************
strcpy(szFileName, szAppPath);
HRSRC hRes;

if( bRegister == FALSE)
{
    strcat(szFileName,"\\NSim.exe"); //make same name of the Client & Server in program file
    hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_LANSIMSERVER),RT_RCDATA);

    if(flagUpgrade ==0)
    {
        CString trial = installationDate();   //----- Detemine Expiry Date -----

        setRegistry(trial);
    }
}

Ответы [ 5 ]

8 голосов
/ 03 января 2011

Это проблема с правами доступа к файлам, простая и понятная. Программы не могут просто перемещаться по системным каталогам в Windows 7. Именно поэтому он работает "правильно" в Windows XP, но не в более новых версиях.

Не могу точно сказать, но похоже, что вы пытаетесь написать установщик. Если да, то почему ты изобретаешь колесо? Существует множество отличных утилит для установки - Visual Studio предоставляет проект установки, который вы можете настроить в соответствии со своими потребностями или посмотреть Inno Setup , мой любимый. Поиск в Google найдет множество других опций, которые уже решили эту проблему для вас, и бесчисленное множество других.

Если это не установщик, и вы просто пытаетесь сохранить данные приложения и / или пользователя в папке Program Files, я настоятельно рекомендую вам поискать в другом месте. Вы не должны были помещать данные в папку приложения в более ранних версиях Windows, и Windows 7 просто обрекает вас на колени, если вы делаете это. Лучше всего следовать рекомендациям, существовавшим с самого начала: тщательно исследовать пользователя и общие папки с данными приложения. Используйте функцию SHGetKnownFolderPath , чтобы получить полный путь к известной папке, используя ее KNOWNFOLDERID . Пара предложений:

  • FOLDERID_ProgramData (общий каталог данных программы для всех пользователей)
  • FOLDERID_LocalAppData (каталог данных программы для пользователя, без роуминга)
  • FOLDERID_RoamingAppData (каталог данных программы пользователя, роуминг)

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

2 голосов
/ 03 января 2011

[править] Я отредактировал код в вопросе для удобства чтения и удалил закомментированный код (чтобы увидеть дерево для деревьев).Теперь очевидно, что nothing инициализирует szAppPath перед вызовом strcat () и вызовом ExpandEnvironmentStrings с NULL в качестве первого аргумента undefined (и, конечно, бесполезным).Вызов strcat() для унитизированной строки вряд ли даст желаемый результат.Это может быть артефактом не публикации реального кода или даже правок других людей (включая мою).


CreateDirectory устанавливает код ошибки системы при ошибке;если вы хотите узнать, что пошло не так, проверьте это!Любой ответ, который вы получите здесь, будет обоснованным предположением.

if(!CreateDirectory(szAppPath,NULL))  //Throw Error
{
    DWORD errorcode = GetLastError(); 
    LPVOID lpMsgBuf;

    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                  NULL, errorcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );

    MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK); 
    return ;
}

Если вы просто хотите получить код ошибки и посмотреть его вручную, тогда полный каталог кодов доступен на MSDN здесь., я бы предположил , что ERROR_ACCESS_DENIED (5) наиболее вероятно.Более подробный пример отображения кода ошибки приведен здесь .

2 голосов
/ 03 января 2011

windows7?Хорошо, проблема не в вашей программе.Это с разрешениями файловой системы в Windows 7. Пользовательские программы не могут создавать файлы там.

1 голос
/ 03 января 2011

Я думаю, что проблема заключается в отсутствии привилегий. Вы можете отладить ваш проект, чтобы увидеть, устанавливает ли функция CreateDirectory ошибку как ERROR_ACCESS_DENIED, если это так, вы должны запустить программу с привилегиями администратора. Для этого добавьте манифест в свой проект.

0 голосов
/ 05 января 2011

Предназначен для защиты вашего компьютера от атак.Хорошо, может быть.Или Microsoft решила сообщить вам, что вы не имеете права делать на своем компьютере.

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

В противном случае, играйте хорошо и делайте вещи Microsoft, используя подходящий установщик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...