在 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和多字节时,两者转换后使用的控件外观不一样

描述嵌套 CloudFormation 堆栈资源的正确方法是啥?

分离资源服务器和授权服务器的正确方法是啥?

VS2015 MFC - 如何将静态库资源链接到项目

url指的是啥?

在创建mfc项目期间我的对话节点丢失了