如何把字符串放进资源文件中

如何把字符串放进资源文件中
[13 byte] By [Liusp-夜深千帐灯] at [2008-6-5]
# 1
#Define ID_CAPTION 100

STRINGTABLE
BEGIN
ID_CAPTION,’这是一个常量定义的字符串,很好记忆的’
102,’这是一个整数定义的字符串,看看你记不记得住?’

END
# 2
resourcestring
用法如 const
assassinator-刺客 at 2007-10-15 > top of Msdn China Tech,Delphi,GAME,图形处理/多媒体...
# 3
我想把图片、字湖串都放到资源文件中,然后编译到DLL中,通过DLL库函数来调用资源,

Kingron(单身走我路……) ,你能不能说的再详细点 ,我可用的是DELPHI,你好象用的是VC++
Liusp-夜深千帐灯 at 2007-10-15 > top of Msdn China Tech,Delphi,GAME,图形处理/多媒体...
# 4
第十八章 资源的使用
一. 什么是资源(Resource)
广义的资源,是指在编程当中可以使用的任何的图片、文字、声音、文件等等。狭义的资源,是指经过特殊方法编译的包含在可执行文件(EXE、DLL等等)中的供程序使用的图片、声音、文字和文件等等。我们在这里所说的资源指狭义的资源。资源的使用,就好象烧菜,作一道菜要求色香味俱全,做程序也是这样,利用这个资源可以使程序色香味俱全。
不管那本书,还有互联网络上面,关于资源的文章都是非常少的,下面是作者使用资源的一些心得和技巧,而且关于资源的论述和说明都是比较详细和齐全的。
二. 资源脚本
在Delphi中,要使用资源(在VC中也一样),需要先编写一个资源文件脚本,不是能够拿来就用的,就和吃饭一样,都先要煮一次一样。资源脚本编写好之后,然后用资源编译器进行编译,得到一个临时的资源文件(.RES),最后,程序编译的时候,包含这个RES文件,这样就可以在程序中使用资源了。
1) 资源类型
资源类型分为两种:预定义和用户自定义类型
A) 常见的预定义资源类型
BITMAP 位图资源 LANGUAGE 定义语言资源
CURSOR 光标资源 MENU 菜单资源
STRINGTABLE 字符串资源表 DIALOG 对话框资源
VERSION 版本资源 FONT 字体资源
ACCELERATORS 快捷键资源 MESSAGETABLE 消息表资源
其中红色的是大家应该掌握的,蓝色的大家也要用到,但是可以使用Delphi提供的手段来完成,不需要大家用资源脚本来编写。版本资源将在后面的内容中单独讲解。其它的不需要大家掌握,这些在VC中使用的比较多,因为Delphi有自己的处理方式,没有必要用到他们,否则就丧失了Delphi进行RAD开发的优势。
B) 用户自定义格式资源
有一个预定义的表明是用户自定义资源的关键字:RCDATA。除了系统预定义的这些关键字之外,凡是其它的名字如EXEFile,AVIFile,Test等等,都视为用户自定义资源类型。一般用户自定义资源是有的程序需要带一些附加资源,或者需要包含其它的文件,但是作者在发布程序的时候出于某些原因,不希望很多文件或者保密等等,就把这些附加的文件包含到EXE里面,那么EXE运行的时候,再临时释放出来,使用之后又删除。
2) 常用资源脚本命令格式
说明:
i) BEGIN,END:用于表示资源块的开始、结束,字符串用双引号括起来;
D) 资源定义的顺序没有关系;
E) 命令大小写无所谓,注释采用//格式,每一个资源定义中间不要用其它分隔符;
F) 每一个资源都有一个名字或者整数标志用于区分资源。因为整数标记比较难于记忆,容易混淆,随意可以采取常量定义帮助记忆,常量定义采用#Define格式,例如#Define ID_FORMCAPTION 100;
G) 可以包含其它文件,用#include包含即可,例如:#include “consts.pas”,这个功能主要用来配合Delphi来使用常量定义。
C) 定义位图资源
格式:ResourceName BITMAP “BitmapFileName.BMP”
这个命令用于把BitmapFileName指定的位图文件,变成一个名字为ResourceName的资源。BitmapFileName可以带路径,也可以不带,不带路径的话,则默认为当前目录下的文件。BitmapFileName这个文件必须存在,否则编译资源的时候出错。
D) 定义光标资源
CursorResourceName CURSOR “CursorFileName.CUR”
说明同Bitmap。
E) 定义图标资源
IconResourceName ICON “IconFileName.ICO”
同上。
F) 定义字符串资源
字符串的定义如下:
STRINGTABLE
BEGIN
ID_CAPTION,’这是一个常量定义的字符串,很好记忆的’
102,’这是一个整数定义的字符串,看看你记不记得住?’

END
G) 用户自定义资源
这是一个很重要的,其实也和前面差不多。
MyFileRes DemoTest “FileName”
用户自定义资源很不同的操作之处在于后面Load资源的代码上面。
3) 资源脚本范例
为了让大家熟悉资源脚本的编写,下面给出一个比较全面的资源脚本范例,在实际的编程当中,大家可以根据需要删除或者修改、添加一些内容就可以了,这个文件可以作为资源脚本文件的模板。
///下面的文件内容是脚本文件和Delphi共享的文件内容
///FileName:MyConsts.Pas
///*******Cut From Here*********///
unit images;

interface

const
IDB_WARNNING = 1;
IDS_MESSAGE=2;
///…
implementation

end.
///*******Cut End Here*****************///
从下面开始是资源脚本文件内容
///FileName:Demo.RC
///*******Demo.RC:Cut From Here ******///
#include "MyConsts.Pas"
#define ID_OK 100
#define ID_CANCEL 101
#define ID_PROMPT 200
#define ID_LABEL 500
#define ID_GROUPBOX 501
#define IDC_RADIO1 502
#define IDC_RADIO2 503
#define IDC_EDIT1 504
#define ID_FILE_OPEN 310
#define ID_FILE_EXIT 311
#define ID_EDIT_COPY 320
#define ID_EDIT_CUT 321
#define ID_EDIT_LINK 322

///----Define Bitmap Resource--------///
///下面用字符串来区分资源
Photo BITMAP "C:\Windows\Wallpaper.BMP" ///文件名可不用"",但建议使用""
///下面用整数来区分资源,其它类型资源定义类似
IDB_WARNNING BITMAP "Warning.BMP"

///----Define ICON Resource--------////
Girl ICON "Girl.ICO"

///----Define Cursor Resource------////
HandPoint CURSOR Hand.CUR

///----User Define Resource-------////
MyResource MyFile "MyFileName.Ext"

///----Define String Resource-----////
STRINGTABLE
BEGIN
ID_OK,"确定"
ID_CANCEL,"取消"
ID_PROMPT,"Delphi课程演示程序"
102,"这是一个直接用数值定义的字符串"
END

///----Define MainMenu Resource----///
////定义的菜单如下图
////┏━━━━━━━━━━━━━┓
////┃File Edit ┃
////┣━━━━┳━━┳━━━━━┫
////┃Open ┃ ┃Copy ┃
////┣━━━━┫ ┃Cut ┃
////┃Exit ┃ ┣━━━━━┫
////┗━━━━┛ ┃Link ┃
//// ┗━━━━━┛
DemoMenu MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&Open...", ID_FILE_OPEN
MENUITEM SEPARATOR
MENUITEM "E&xit", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "&Copy", ID_EDIT_COPY
MENUITEM "C&ut", ID_EDIT_CUT
MENUITEM SEPARATOR
MENUITEM "HyperLink...", ID_EDIT_LINK
END
END

///----Define A Dialog-------////
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 98
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "对话框"
FONT 10, "宋体"
BEGIN
DEFPUSHBUTTON "确定",IDOK,130,7,50,14
PUSHBUTTON "取消",IDCANCEL,130,24,50,14
LTEXT "Test Label",ID_LABEL,21,13,35,8
GROUPBOX " Group Box: ",ID_GROUPBOX,14,28,90,40
CONTROL "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,21,37,39,
10
CONTROL "Radio2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,21,53,39,
10
EDITTEXT IDC_EDIT1,14,71,89,12,ES_AUTOHSCROLL
END

///*******Demo.RC:Cut End Here******///
资源脚本的编写很麻烦,有没有简单的方法来编写呢?有!利用VC++即可。Borland的Brcc32.Exe可以编译VC写出来的RC文件!不过在编译VC写的RC文件之前,必须修改RC文件,把其中的Include “afxres.h”删除即可。则真的是一件很奇怪的事情,Brcc32可以编译VC写的资源脚本,而VC的资源脚本采用的却是BEGIN..END,而不是{},好象有Pascal的味道哦。:)
三. 资源的编译
如果用户使用自己的资源的话,Delphi不会自动编译资源,需要手动编译。在Delphi中能够自动编译的资源是窗体,大家打开一个窗体的pas文件就可以看到{$R *.DFM}这样的语句,这就是窗体资源。如果要编译资源,请采用下面的命令即可:
Brcc32 ResourceScriptFileName
上面是一个DOS命令,可以命令提示符下面运行,其中Brcc32就是编译资源的命令;ResourceScriptFileName是资源脚本文件的名字。运行之后,如果没有错误,那么会生成一个同名的.Res文件。
Brcc32命令有很多的附加参数,请使用Brcc32 /?获取详细的说明。
资源脚本经过编译之后,可以不依赖原来的文件,单独使用。注意,如果你的程序没有修改,而修改了资源的话,需要用Build All来强制编译所有的程序文件,这样才能保证你的程序是正确的。否则,根据Delphi的增量编译原则,没有修改的程序文件是不会编译的!
四. 资源的使用
编译指令:{$R FileName.RES}
{$R FileName.RES}这个编译指令用于指示编译器在编译生成EXE或者DLL的时候,把指定的资源文件也包括进来。这个编译指令应该包含在implementation部分,写在{$R *.DFM}附近。如果你的程序中使用了某个资源,而又没有使用$R指令包含到EXE(DLL)中的话,你的程序将不能正常运行。
ResourceString
ResourceString是一个关键字,用于定义资源字符串常量。我们知道普通的字符串常量用const就可以定义,但是const定义的字符串是内嵌在程序代码中间的,不是资源,而ResourceString定义的字符串使用的时候和const定义的是一样的,但是是作为资源保存在EXE(DLL)中间的,并且ResourceString也避免了写资源脚本和编译资源的麻烦。
装载资源
需要注意的是,在使用某些API函数Load资源的时候,一般都需要一个ResourceName或者ResourceID,而这些函数的参数类型都是Pchar,因此,如果使用ResourceID的话,直接使用100这样的数是不行的,必须用MAKEINTRESOURCE(100)来代替。具体的例子,请看下面的LoadCursor!
位图资源的装载
# 5

Kingron(单身走我路……) ,谢谢你的答复,你这是什么书给我EMAIL一份行吗?

liusp_sohu@sohu.com
Liusp-夜深千帐灯 at 2007-10-15 > top of Msdn China Tech,Delphi,GAME,图形处理/多媒体...