0

在命令提示符中,这有效:whatever\folder> bezier.exe

但这不是:whatever> folder\bezier.exe

我的贝塞尔程序从本地文件加载一些设置,所以我认为问题在于程序认为它的目录whatever\实际上是whatever\folder\. 我在 C 程序中使用CreateProcess(). 如果我猜对了这个问题,有没有办法确保程序有正确的目录?


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 是在编写路径之后。

4

1 回答 1

1

您可以使用GetModuleHandleandGetModuleFileName找出可执行文件的位置,然后使用该信息为本地设置文件创建文件规范。

GetModuleHandle使用 NULL 参数将为您提供当前可执行文件的句柄。然后,将其传递GetModuleFileName给您将为您提供该可执行文件的完全限定名称。只需从末尾剥离可执行文件名并添加您的配置文件名。

但是,很长一段时间以来,这一直是个坏主意,因为 Windows 为此类东西提供了每个应用程序和每个用户的设置区域 - 您通常可以使用SHGetFolderLocation()和它的 brethren获得这些位置。

仅当这是针对个人项目时才使用第一种方法。如果您计划将您的软件发布到野外,您应该按照 Microsoft 指南将可执行信息和配置信息分开。


不管怎样,您现在似乎遇到了您认为文件没有被写入的问题。你需要检查一下。当您打开该文件out.txt进行写入时,它会在当前目录中执行此操作。如果您在父目录中运行(带有folder\bezier.exe),它将在父目录中创建它,并且在目录中查找它folder是浪费时间。

如果您正在查看运行该程序的目录,但仍未创建该目录,则可能有原因。首先,您应该检查(即捕获和输出)所有这些f*函数的返回码fopenfprintffclose

于 2012-09-11T03:30:26.880 回答