无法在C ++中使用shellExecute函数打开.exe

时间:2016-09-23 16:34:11

标签: c++ windows codeblocks sfml shellexecute

我想在执行另一个c ++程序时打开一个.exe(让我们称之为A)(让我们称之为B),所以我同时执行A和B。

为此,我在B代码中使用此功能:

HINSTANCE result;

result=ShellExecute(NULL,NULL,"d:\\Users\\bci\\Desktop\\Animation\\bin\\Release\\Animation2.exe",NULL ,NULL,SW_SHOWDEFAULT);

cout << "Result is " <<(int)result <<endl;

结果值为42,A无法打开。 我得到的错误是:

Failed to open file "player.png": Unable to open file
Failed to load player spritesheet!

这对应于A代码的这一部分:

// load texture (spritesheet)
    sf::Texture texture;
    if (!texture.loadFromFile("player.png"))
    {
        std::cout << "Failed to load player spritesheet!" << std::endl;
        return 1;
    }

A和B都是使用code :: blocks作为IDE构建的,使用GCC / G ++编译器和GDB调试器来自TDM-GCC(版本4.9.2,32位,SJLJ)。

我在Windows 7 64位(企业和专业,同样的错误)中这样做。

另外,我不知道是否值得讲述,但我在A中使用SFML库,正如您在

中看到的那样
 sf::Texture texture;

我认为这与从您正在调用的程序打开文件的权限有关,但我不知道如何解决这个问题。

实际上A和B完全靠自己工作,但B无法通过这种含义打开A.

我很确定我使用右键单击&gt;属性 - >安全选项使我的图像不受限制,但看起来不够。

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:3)

ShellExecute有一个lpDirectory参数,可以将shell的当前工作目录设置为调用期间所需的任何内容。

您已将其设置为NULL,因此当前工作目录不会更改(可能是B可执行文件的位置,或者您创建的任何其他内容)。程序A正在使用相对路径,因此期望player.png位于当前工作目录中;据推测,分发使得文件实际A的可执行文件的位置找到,并假设两者是相同的。在这种情况下,他们不是。

只有您可以知道{{1>}当前工作目录所谓的,但基于上述假设,您应该将A设置为lpDirectory }。

答案 1 :(得分:0)

正在正确执行程序A.问题是当你从程序B shell执行它时,它运行程序B的当前工作目录。因此它找不到player.png。您需要编辑程序A以提供player.png的完整路径,或者需要将player.png复制到与程序B相同的文件夹中。