2016-09-23 3 views
-1

Я хочу открыть .exe (позвонит ему), когда я запускаю другую программу на C++ (разрешает вызов B), поэтому у меня есть A и B в исполнении при том же время.Невозможно открыть .exe с помощью функции shellExecute в C++

Для этого я использую эту функцию в коде 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, и А не удается открыть. Ошибка я получаю это:

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

Это соответствует этой части A's кода:

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

A и B оба были построены с использованием кода :: Blocks как IDE с GCC/G ++ и отладчик GDB от TDM-GCC (версия 4.9.2, 32 бит, SJLJ).

Я делаю это в Windows 7 64 бит (предприятие и профессионал, обе ошибки).

Кроме того, я не знаю, стоит ли это говорить, но я использую библиотеку SFML в А, как вы можете видеть в

sf::Texture texture; 

Я думаю, что это связано с каким-то разрешения на открытие файла из программа, которую вы вызываете, но я не уверен, как это решить.

Фактически A и B работают отлично самостоятельно, но B не может открыть A этими значениями.

Я уверен, что я сделал это изображение неограниченным, как я могу, с помощью правой кнопки мыши - свойства -> параметры безопасности, но этого не достаточно.

Может кто-нибудь помочь мне с этим?

+1

Я ожидаю, что 'player.png' не находится в текущем каталоге. – drescherjm

+0

Что касается A и B, что вы подразумеваете под «в исполнении в одно и то же время»?Кроме того, будьте осторожны, что текущий рабочий каталог, переданный процессу с помощью ShellExec, будет отличаться от вашей родительской программы (чтобы убедиться, что это просто напишите файл на путь в программе arg [0] и посмотрите, где он заканчивается), поэтому загрузка относительного пути может быть виновником. Независимо от того, что вы пытаетесь сделать здесь, лучше выполнить с использованием статической библиотеки вместо исполняемого файла. –

ответ

3

ShellExecute имеет lpDirectory параметр, который устанавливает текущую рабочую директорию командного интерпретатора, чтобы все, что вы хотите для продолжительность вызова.

Вы установили его в NULL, так что текущий рабочий каталог не изменился (возможно, было выполнено B, или что бы вы еще не сделали). Программа A использует относительные пути и поэтому ожидает, что player.png будет в текущем рабочем каталоге; предположительно, распределение делает так, что файл фактически найден в месте, где находится A, и просто предполагает, что два одинаковы. В этом случае это не так.

Только вы можете знать, что текущий рабочий каталог должен быть для A, но на основе вышеуказанного предположения, вы должны установить lpDirectory в "d:\\Users\\bci\\Desktop\\Animation\\bin\\Release\\".

+0

Спасибо большое! Это сработало. – Maiser

+1

@Maiser Затем примите это. –

0

Программа A выполняется правильно. Проблема в том, что когда вы запускаете оболочку из программы B, она запускается с текущим рабочим каталогом программы B. Следовательно, он не может найти player.png. Вы либо должны изменить программу А, чтобы обеспечить полный путь к player.png, или вам необходимо скопировать player.png в ту же папку, как программа В.

+3

Было бы лучше сделать «ShellExecute» с надлежащим рабочим каталогом, нет? Вместо того, чтобы взломать копии файлов и жестко закодированные пути. Подсказка: есть параметр 'lpDirectory' ... –

+0

Вышеупомянутая проблема заключается в том, почему я снял свою надпись. – drescherjm

+0

Хорошая точка зрения, я согласен - предполагая, что вопрос-искатель действительно хочет, чтобы рабочий каталог для A (что, как я подозреваю, будет иметь место). –

Смежные вопросы