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

Can not open .exe with shellExecute function in C++

我想在执行另一个 c++ 程序(我们称之为 B)时打开一个 .exe(我们称之为 A),所以我同时执行 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++ 编译器和来自 TDM-GCC 的 GDB 调试器构建的(版本 4.9.2,32 位,SJLJ ).

我在 windows 7 64 位(企业版和专业版,同样的错误)中执行此操作。

此外,我不知道是否值得一提,但我在 A 中使用 SFML 库,如您在

中所见
 sf::Texture texture;

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

其实A和B各自完美的工作,但是B无法按这个意思打开A。

我很确定我已经通过右键单击->属性->安全选项使图像尽可能不受限制,但这似乎还不够。

有人可以帮我解决这个问题吗?

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

ShellExecute 有一个 lpDirectory 参数,可以在通话期间将 shell 的当前工作目录设置为您想要的任何目录。

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

只有你自己知道当前工作目录是什么假设A,但是根据上面的假设,你应该设置lpDirectory"d:\Users\bci\Desktop\Animation\bin\Release\".