2016-09-23 163 views
-1

當我執行另一個C++程序(讓它稱爲B)時,我想打開一個.exe(讓它稱爲A),所以我有A和B在執行相同時間。無法在C++中使用shellExecute函數打開.exe

爲此,我使用此功能在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'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使用代碼::塊作爲IDE與GCC包括內置/ G ++編譯器和TDM-GCC的GDB調試器(版本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

ShellExecutelpDirectory參數設置shell的當前工作目錄到任何你想要的通話的持續時間。

您已將它設置爲NULL,因此當前工作目錄不變(可能是B的可執行文件的位置,或其他任何您所做的)。程序A正在使用相對路徑,因此預計player.png在當前工作目錄中;大概是這樣的分佈,使得該文件是實際上A的可執行文件的位置找到的,並且假定兩者是相同的。在這種情況下,他們不是。

只有你可以知道當前的工作目錄是什麼應該是爲A,但基於上述假設,你應該設置lpDirectory"d:\\Users\\bci\\Desktop\\Animation\\bin\\Release\\"

+0

非常感謝!這工作。 – Maiser

+1

@Maiser然後接受它。 –

0

程序A正在正確執行。問題是,當你從程序B執行shell時,它運行程序B的當前工作目錄。因此它找不到player.png。你要麼需要編輯程序的提供給player.png的完整路徑,或者你需要player.png複製到同一文件夾中的程序B.

+3

最好使'ShellExecute'出現在正確的工作目錄下,不是?而不是剽竊文件副本和硬編碼路徑。提示:有一個'lpDirectory'參數... –

+0

上面的問題是我爲什麼退出了我的upvote。 – drescherjm

+0

好點,我同意 - 假設問題提問者確實需要A的工作目錄(我懷疑是這種情況)。 –