在命令提示符中,这有效:whatever\folder> bezier.exe
但这不是:whatever> folder\bezier.exe
我的bezier程序从本地文件加载一些设置,所以我认为问题是当程序实际为whatever\
时,程序认为其目录为whatever\folder\
。我是在使用CreateProcess()
的C程序中调用它的。如果我猜测问题是正确的,有没有办法确保程序有适合自己的目录?
bezier.exe的主要方法:
int main(int argc, char* argv[]) {
char buf[200];
FILE* f = fopen("out.txt","w");
GetCurrentDirectory(200,buf);
fprintf(f,buf);
fclose(f);
SDL_Surface* screen;
SDL_Event e;
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_FULLSCREEN|SDL_HWSURFACE);
if (screen == NULL)
exit(-1);
SDL_ShowCursor(SDL_DISABLE);
srand(time(NULL));
loadColors(COLOR_FILE);
fill(screen, backColor);
initialiseVars();
while (e.type != SDL_KEYDOWN)
{
//do stuff
}
SDL_Quit();
return 0;
}
这是疯狂的部分。使用“..> folder \ bezier.exe”它不会写入其路径,但它会启动一个新窗口。这对我没有任何意义,因为SDL_SetVideoMode是在写完路径之后。
答案 0 :(得分:1)
您可以使用GetModuleHandle
和GetModuleFileName
找出可执行文件的位置,然后使用该信息为本地设置文件创建文件规范。
GetModuleHandle
将为您提供当前可执行文件的句柄。然后,将其传递给GetModuleFileName
将为您提供该可执行文件的完全限定名称。只需从末尾剥离可执行文件名并添加配置文件名。
然而,对于 long 时间而言,这是一个坏主意,因为Windows为这类内容提供了每个应用程序和每个用户的设置区域 - 通常可以使用{{{{{ 3}}
仅当这是针对个人项目时才使用第一种方法。如果您计划自行发布软件,则应根据Microsoft指南分离可执行文件和配置信息。
无论如何,您现在看到的问题是您认为该文件未被写入。你需要检查一下。当您打开该文件out.txt
进行写入时,它会在当前目录中执行此操作。如果您在父目录(使用folder\bezier.exe
)中运行,它将在父目录中创建它,并在folder
目录中查找它是浪费时间。
如果 正在查看您正在运行该程序的目录,并且仍未创建该程序,则可能存在这种情况。首先,您应该检查(即捕获并输出)所有那些f*
函数,fopen
,fprintf
和{{1}的返回代码}。