我正在使用Windows 7,我必须在该Windows中运行一个程序,但该程序在Windows XP中运行。这是一个Visual C ++程序,我正在使用Visual Studio 2008。当我运行我的应用程序时,它不会抛出任何错误,但它不会在“c:\ program files \”中创建一个目录。那么有人可以帮我创建目录和exe文件吗?
这是我正在使用的代码:
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);
}
}
答案 0 :(得分:8)
这是一个文件权限问题,简单明了。程序不能只围绕Windows 7中的系统目录。这就是为什么它在Windows XP中“正常”工作,而不是在新版本中
我无法确定,但看起来你正在尝试编写安装程序。如果是这样,你为什么要重新发明轮子?有许多可用的设置实用程序 - Visual Studio提供了一个可以根据您的需求进行自定义的安装项目,或者查看我个人最喜欢的Inno Setup。谷歌搜索将提供许多已经为您解决此问题的其他选项,以及无数其他选项。
如果不是安装程序,并且您只是想在Program Files文件夹中存储应用程序和/或用户数据,我强烈建议您查看其他地方。您不应该将数据推送到早期版本的Windows下的应用程序文件夹中,如果您这样做,Windows 7只会让您瘫痪。您最好的选择是遵循从一开始就存在的建议:仔细调查用户和常见的应用程序数据文件夹。使用SHGetKnownFolderPath function使用KNOWNFOLDERID检索已知文件夹的完整路径。几点建议:
FOLDERID_ProgramData
(所有用户的共享程序数据目录)FOLDERID_LocalAppData
(每个用户程序数据目录,非漫游)FOLDERID_RoamingAppData
(每个用户程序数据目录,漫游)或者,您可以尝试以管理员身份运行该应用程序。您可能希望查看creating a manifest,表明应用程序需要管理员级权限才能执行。
答案 1 :(得分:2)
windows7的? 好的,问题不在于你的程序。它具有Windows 7中的文件系统权限。用户程序无法在那里创建文件。
答案 2 :(得分:2)
[edit] 为了便于阅读,我编辑了问题中的代码并删除了注释掉的代码(查看树木的木材)。现在显而易见的是, nothing 在调用strcat()之前初始化szAppPath,并且使用NULL调用ExpandEnvironmentStrings
作为第一个参数是 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, here上会提供完整的代码目录,我会猜测 ERROR_ACCESS_DENIED
(5)
是最有可能的。更详细的错误代码显示示例为here。
答案 3 :(得分:1)
我认为问题是缺乏特权。您可以调试项目以查看CreateDirectory
函数是否将错误设置为ERROR_ACCESS_DENIED
,如果是,则应使您的程序以管理员权限运行。在项目中添加清单即可。
答案 4 :(得分:0)
旨在保护您的计算机免受攻击。也许。或者微软决定告诉你你是什么而不允许在自己的电脑上做。
在任何情况下,如果您真的必须以这种方式在那里写字,您可以更改您的UAC设置,尽管这显然会让您面临风险。
否则,使用适当的安装程序,以微软的方式玩好并做事。