2014-10-08 2 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.Can кто-нибудь сказать мне какой-либо способ избежать жесткого кодирования фактического пути ресурса, поскольку эти файлы ресурсы не будут присутствовать на этом такой же точный путь на других компьютерах?

2.Also наставит меня, чтобы обрабатывать эти файлы ресурсы при создании автономного SETUP (я использую авансовые установки)

+1

Не используйте абсолютный путь, всегда используйте относительный путь; по сравнению с вашим EXE-файлом - одно из решений. – Max

+0

Да, я так думал, но как это сделать? для этих функций требуется путь к файлу в качестве аргумента. –

ответ

0

(в качестве фактического ответа).

Не используйте абсолютный путь, всегда используйте относительный путь; по сравнению с вашим EXE-файлом - одно из решений.

Путь EXE можно найти с помощью метода GetModuleFileName.

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

(addendum) appPath name вводит в заблуждение, содержит полное имя приложения; вам нужно извлечь путь из полного имени приложения.

Мы делаем что-то вроде этого:

(редактировать, чтобы сделать его компилируется в Unicode)

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

От там, вы можете сделать что-то вроде (псевдокода-иш):

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

в порядке, m пытается сейчас. –

+0

Какова цель appPath? для сохранения пути или имени файла? p.s путь хранится в переменной типа «wchar_t», и эти функции принимают это как аргументы, а не char const. –

+0

вы можете увидеть «L» до пути ... –

0

Вы можете иметь переменный, которая сохраняет папку, которую они хотят, чтобы установить программу. После того, они выберите каталог, в который они хотят установить его, прекратите это. Или вы также можете использовать системные папки, такие как папка appdata

+0

Можете ли вы подробно описать, как это сделать? –

+0

CString appdata = getenv (_T ("APPDATA")); // Получает папку appdata CString appDataDir = appdata + _T ("\\ MyProgram \\"); // Устанавливает appDataDir в appdata \ MyProgram И вы должны позволить пользователю решить, где установить вашу программу.Если вы хотите, чтобы ресурсы были сохранены относительно этого, пусть они выбирают каталог и сохраняют этот каталог как переменную –

0

Первым решением было бы сконфигурировать ваш проект установки, чтобы установить установочные файлы в разделе DesktopFolder \ block mania \ block mania \ res. Затем вы можете получить в своем приложении текущее местоположение пользователя Desktop и добавить к нему оставшееся место установки (block mania \ block mania \ res).

Другим решением было бы сконфигурировать проект установки для создания реестров во время установки, в котором будут храниться пути файлов установки. Затем ваше приложение может прочитать пути установки из реестра.

Наконец, вы также можете создавать переменные среды времени установки, содержащие пути установочного файла, а затем использовать в своем приложении переменные среды для доступа к местам установленных файлов.