2014-10-08 39 views
0

我做了一個基於MFC的遊戲,我的項目包含圖像和聲音。現在我想創建一個安裝程序設置爲了分發它。什麼是在MFC項目中使用資源文件的正確方法?

我已在如提供其確切的路徑中使用的資源

img->Load(L"C:\\Users\\Ad33l's\\Desktop\\block mania\\block mania\\res\\db.png"); 

MCIWndCreate(NULL, NULL,WS_POPUP|MCIWNDF_NOPLAYBAR|MCIWNDF_NOMENU,L"C:\\Users\\Ad33l's\\Desktop\\block mania\\block mania\\res\\tick.wav"); 

1.可有人告訴我什麼辦法避免硬編碼的實際資源的路徑,因爲這些資源文件將不會出現在這個其他電腦的確切路徑?

2.Also引導我創建獨立設置的(我用事先安裝)過程中處理這些資源文件

+1

不要使用絕對路徑,總是使用相對路徑;相對於您的EXE文件是一個解決方案。 – Max 2014-10-08 14:38:27

+0

是的,我在想,但怎麼做呢?這些功能需要文件路徑作爲參數.. – 2014-10-08 14:53:12

回答

0

(作爲實際答案)。

不要使用絕對路徑,總是使用相對路徑;相對於您的EXE文件是一個解決方案。

可以使用GetModuleFileName找到EXE路徑。

char appPath[MAXFILENAMELEN]; 
GetModuleFileName(NULL, appPath, MAXFILENAMELEN); 

(附錄)appPath名稱具有誤導性,它包含應用程序的全名;您需要從完整的應用程序名稱中提取路徑。

我們做這樣的事情:

(編輯使它以Unicode編譯)

TCHAR applicationPath[MAX_PATH]; 
GetModuleFileName(NULL, applicationPath, MAX_PATH); 
CString sSoundFile(applicationPath); 
PathRemoveFileSpec(sSoundFile.GetBuffer()); 
sSoundFile.ReleaseBuffer(); 

從那裏,你可以這樣做(僞-ISH):

img.Load(appPath + "//Images//db.png"); 
+0

好吧,現在就開始嘗試。 – 2014-10-08 15:00:40

+0

appPath的用途是什麼?存儲路徑或文件名? p.s路徑存儲在一個變量類型「wchar_t」中,並且這些函數接受它作爲參數,而不是char const。 – 2014-10-08 15:04:12

+0

您可以在路徑前看到「L」... – 2014-10-08 15:05:06

0

你可以有,節省了他們希望在安裝程序的目錄中的變量。之後,他們選擇他們想要安裝它的目錄,離開它。或者,您也可以使用系統文件夾,如appdata文件夾

+0

你能詳細說明如何做到這一切嗎? – 2014-10-08 14:49:26

+0

CString appdata = getenv(_T(「APPDATA」)); //獲取appdata文件夾 CString appDataDir = appdata + _T(「\\ MyProgram \\」); //將appDataDir設置爲appdata \ MyProgram 並且你應該讓用戶決定在哪裏安裝你的程序。如果你想要保存相對的資源,讓他們選擇一個目錄並將該目錄保存爲一個變量 – 2014-10-08 14:57:51

0

第一種解決方案是配置您的安裝項目以在DesktopFolder \ block mania \ block mania \ res下安裝安裝文件。然後,您可以在您的應用程序中訪問當前用戶的位置,並在其中添加剩餘的修復位置(塊mania \ block mania \ res)。

另一種解決方案是將安裝項目配置爲在安裝時創建註冊表,以存儲安裝文件的路徑。然後,您的應用程序可以從註冊表讀取安裝路徑。

最後,您還可以在安裝時創建包含安裝文件路徑的環境變量,然後在您的應用程序中使用環境變量來訪問已安裝的文件位置。

相關問題