在 MFC 项目中使用资源文件的正确方法是啥?
Posted
技术标签:
【中文标题】在 MFC 项目中使用资源文件的正确方法是啥?【英文标题】:what is the proper method of using resource files in MFC project?在 MFC 项目中使用资源文件的正确方法是什么? 【发布时间】:2014-10-08 14:27:10 【问题描述】:我制作了一个基于 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.还指导我在创建独立SETUP期间处理这些资源文件(我正在使用高级安装程序)
【问题讨论】:
不要使用绝对路径,始终使用相对路径;相对于您的 EXE 文件是一种解决方案。 是的,我是这么想的,但是怎么做呢?这些函数需要文件路径作为参数.. 【参考方案1】:(作为实际答案)。
不要使用绝对路径,总是使用相对路径;相对于您的 EXE 文件是一种解决方案。
可以使用 GetModuleFileName 找到 EXE 路径。
char appPath[MAXFILENAMELEN];
GetModuleFileName(NULL, appPath, MAXFILENAMELEN);
(addendum) appPath 名称具有误导性,它包含应用程序的全名;您需要从完整的应用程序名称中提取路径。
我们这样做:
(编辑使其可在 unicode 中编译)
TCHAR applicationPath[MAX_PATH];
GetModuleFileName(NULL, applicationPath, MAX_PATH);
CString sSoundFile(applicationPath);
PathRemoveFileSpec(sSoundFile.GetBuffer());
sSoundFile.ReleaseBuffer();
从那里,您可以执行类似(伪代码)的操作:
img.Load( appPath + "//Images//db.png" );
【讨论】:
appPath 的目的是什么?存储路径或文件名? ps路径存储在变量类型“wchar_t”中,这些函数接受这个作为参数,而不是char const。 我们仍在 MBCS 工作;还不是 unicode,所以 char 对我们来说没问题。 GetModuleFileName() 显示错误,“char* 的参数类型与参数类型 LPWSTR 不兼容” 非常感谢兄弟,我做到了 ^_^,现在我必须进行研究以了解 TCHAR、WCHAR、LPWSTR 的东西....'剥离路径的讨厌的事情是聪明的!再次感谢!【参考方案2】:你可以有一个变量来保存他们想要安装你的程序的目录。在他们选择了他们想要安装它的目录之后,离开那个。或者你也可以使用系统文件夹,比如appdata文件夹
【讨论】:
你能详细说明如何做到这一点吗? CString appdata = getenv(_T("APPDATA")); // 获取 appdata 文件夹 CString appDataDir = appdata + _T("\\MyProgram\\"); // 将 appDataDir 设置为 appdata\MyProgram 你应该让用户决定在哪里安装你的程序。如果您希望相对于该资源保存资源,让他们选择一个目录并将该目录保存为变量【参考方案3】:第一个解决方案是配置您的安装项目以在DesktopFolder\block mania\block mania\res 下安装安装文件。然后,您可以在您的应用程序中访问当前用户Desktop 位置并将剩余的修复位置附加到它上面(block mania\block mania\res)。
另一种解决方案是将安装项目配置为在安装时创建注册表,该注册表将存储安装文件的路径。然后,您的应用程序可以从注册表中读取安装路径。
最后,您还可以在安装时创建包含安装文件路径的环境变量,然后在您的应用程序中使用环境变量来访问已安装文件的位置。
【讨论】:
以上是关于在 MFC 项目中使用资源文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
vs2010 mfc项目配置属性的字符集为Unicode和多字节时,两者转换后使用的控件外观不一样