使用gcc编译Windows程序并使用资源文件

原文链接:http://blog.163.com/lixiangqiu_9202/blog/static/53575037201272211216317/

一直灰常灰常喜欢使用vim+gcc组合,但是VS开发环境却又是那么的"先进"那么的人性化,VS让很多东西都变得简单起来,因为它集成了一整套的工具,但是就编辑功能而言与之vim相差甚远,舍不得vim于是进行相关配置后vim也可以变得很强大,于是果断放弃了VS继续vim+gcc,虽然在windows下编程使用这样的组合有点"对不住"微软,但习惯难以更改,说起来我这个人真是一身的臭毛病,于是可以想像我肯定喜欢手写Makefile文件,什么,Makefile文件是什么?你不明白,我想你对此篇文章也不会感兴趣.好了废话不多说了
使用gcc编译windows程序时(这里指Windows API编程)需要加上-mwindows选项,不然编译不通过哦
还有要说的一点就是使用资源文件,这个似乎使用VS很容易搞定,只需要选择创建资源文件,然后在程序中包含头文件就可以使用了,但使用gcc的话应该怎样连接资源文件呢?其实这个也比较简单了,我们只需要自己手动写一个资源文件然后连接下就可以了(看,这个家伙又自己动手写了),我们就以一个简单的hello world程序来说明如何使用gcc编译windows API程序并加上图标,光标资源
首先我们先创建一个图标文件和一个光标文件,然后给它们随便取一个名字,比如music.ico,mouse.cur
然后我们写一个资源文件,内容如下
IDI_ICON ICON music.ico
IDC_CURSOR CURSOR mouse.cur
IDI_ICON和IDC_CURSOR这两个是我们自己取的任意名称,它们的作用主要是在程序中皀它们作为字符串来"标识"它们,也可以用一个整数来替换它们,我比较喜欢用字符串,依个人爱好吧,ICON和CURSOR是两个关键字,它们分别表示图标资源和光标资源,后面的music.ico和mouse.cur是我们创建的两个文件,这里由于我把这两个文件放在当前路径所以可以直接写它们的名字,如果放在其它目录下的话一定要写上绝对路径,比如music.ico文件在C盘根目录下你就应该写成"C:\\music.ico"这样
下面是我们hello的程序,它使用Windows API
/*hello.c*/
#include <windows.h>
LRESULT CALLBACK wndproc(HWND,UINT,WPARAM,LPARAM);
void init_wndclass(HINSTANCE,TCHAR*,WNDCLASS*);
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR line,int cmd)
{
    TCHAR app_name[]=TEXT("Hello World!");
    WNDCLASS wndclass;
    MSG msg;
    HWND hwnd;
    init_wndclass(hinstance,app_name,&wndclass);
    RegisterClass(&wndclass);
    hwnd=CreateWindow(app_name,app_name,WS_OVERLAPPEDWINDOW,\
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
            CW_USEDEFAULT,NULL,NULL,hinstance,NULL);
    ShowWindow(hwnd,cmd);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
void init_wndclass(HINSTANCE hinstance,TCHAR *app_name,WNDCLASS *wndclass)
{
    wndclass->cbClsExtra=0;
    wndclass->cbWndExtra=0;
    wndclass->hCursor=LoadCursor(hinstance,"IDC_CURSOR"); //在这里我们加载光标资源
    wndclass->hIcon=LoadIcon(hinstance,"IDI_ICON");      //加载图标资源
    wndclass->hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass->lpfnWndProc=wndproc;
    wndclass->lpszClassName=app_name;
    wndclass->lpszMenuName=NULL;
    wndclass->style=CS_VREDRAW|CS_HREDRAW;
    wndclass->hInstance=hinstance;
}
LRESULT CALLBACK wndproc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
    static int client_x,client_y,char_x,char_y,str_len;
    TEXTMETRIC tm;
    PAINTSTRUCT ps;
    HDC hdc;
    HINSTANCE hinstance;
    switch(message)
    {
        case WM_CREATE:
            hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
            hdc=GetDC(hwnd);
            GetTextMetrics(hdc,&tm);
            char_x=tm.tmAveCharWidth;
            char_y=tm.tmHeight;
            ReleaseDC(hwnd,hdc);
            SetClassLong(hwnd,GCL_HICON,(LONG)LoadIcon(hinstance,"IDI_ICON")); //有时候会发现程序的图标是有了,但是在左上角却还是没有加载上,这样做保险点
            SetClassLong(hwnd,GCL_HCURSOR,(LONG)LoadCursor(hinstance,"IDC_CURSOR"));  //与上类似
            str_len=lstrlen("Hello World!");
            return 0;
        case WM_SIZE:
            client_x=LOWORD(lparam);
            client_y=HIWORD(lparam);
            return 0;
        case WM_PAINT:
            hdc=BeginPaint(hwnd,&ps);
            SetTextColor(hdc,RGB(0,0,255));
            TextOut(hdc,client_x/2-str_len*char_x/2,client_y/2-char_y/2,TEXT("Hello World!"),str_len);
            EndPaint(hwnd,&ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd,message,wparam,lparam);
}
好了最后就是我们的Makefile文件了
hello:hello.o my.o
    gcc -o hello hello.o my.o -mwindows
hello.o:hello.c
    gcc -c hello.c
my.o:hello.rc
    windres hello.rc my.o
clean:
    rm hello.exe my.o hello.o
现在执行make命令
然后我们可以看到程序的图标已经出来了
使用gcc编译Windows程序并使用资源文件 - 枯龙吟 - 枯龙吟
我们双击下运行
使用gcc编译Windows程序并使用资源文件 - 枯龙吟 - 枯龙吟
可以看到左上角的图标,光标本来不是这个样子的,这是我linux下的光标,我们设置的光标这样截图截不下来,但我以人格保证它正确加载了.
这里我们从Makefile中可以看到我们使用了-mwindows选项编译Windows程序,我们连接了my.o,这个my.o是使用windres hello.rc my.o生成的,所以我们也可以这样来编译这个程序并连接资源文件
gcc -c hello.c
windres hello.rc my.o
gcc -o hello hello.o my.o -mwindows
显然一个一个命令去敲的话太过于麻烦,于是我们使用Makefile文件,你看这多科学

前 言 1999年3月,Philip Greenspun在Oracle公司总部举行了一次讲座,正是这次讲座给了作者写作本书的灵感。他的讲座涵盖了Internet、XML以及怎样生成以数据库为后端的Web站点。为什么Oracle数据库的使用在业界如此流行,以及为什么他认为Oracle开发组成员应该多为Oracle出版社写一些书等。作者由图书提纲开始,该提纲是关于他们在Oracle公司所做的XML方面的工作;然后编写各个章节。他们尽可能地听从了Philip的建议,把本书按问题域组织起来,而不是按技术或部门体系。时间很快过去了一年,到了2000年中旬,他们最终完成了本书。在此期间,他们在对Oracle的工作投入大量时间的同时尽可能保持着本书的进度,经历了一段真正的紧张生活。真的,任何一位作者,他们的家庭,以及Oracle出版社的编辑们,都不会忘记这段经历的。XML万岁!注意 本书的一部分销售收入将资助ArsDigita基金会和America誷 Promise两组织,以支持他们尝试推动教育进步的可敬事业。他们的Web站点分别是http://arsdigita.org和http://www.americaspromise.org。应用中的XML 你之所以阅读本书,目的可能是计划在现实的应用中使用XML。这种想法很好,因为XML不是应用,它只是一种使能性的技术。为帮助你建立具有XML功能的应用,我们在合适之处介绍了大量不同的应用背景、特定的代码实例以及XML和XSL实例文件。你可以自由地使用这些代码,我们希望它可以引导你有效地使用XML来增强你的应用。注意 如果你对本书或CD要发表评论或在其中发现了错误,请不要犹豫,务请发e-mail到oraclexmlhandbook@yahoo.com。本书面向的读者本书是Oracle XML组件的用户指南。它不是完全参考手册,因为所有的组件API文档都可以通过电子版得到,而且,如果把这些文档加进来,会使本书的规模加倍。参考文档可以在Oracle技术网络(Oracle Technology Network)上得到。本书的读者对象主要有两类:一类是使用Oracle进行应用开发且需要开始使用XML的程序员;另一类是有兴趣学习怎样在Oracle产品中使用XML的读者。书中许多例子使用了Java,通过使用组件的命令行接口和简单的可以编辑XML、XSL、XSQL文件的文本编辑器,就可以试验XML的大量功能。怎样使用本书不必按顺序阅读本书。本书的第1、2章是XML和Oracle的XML技术的介绍性材料,如果你熟悉这些,可以跳过这两章。那些对建立具有XML功能的Oracle8i数据库应用感兴趣的读者,可以阅读第3、7章,以及第8章中对OTN应用的深入解释。如果你打算使用Oracle应用服务器、Internet文件系统(Internet File System)、以及interMedia Text(一种文本搜索引擎),那么请阅读第4章、第5、第6章。第9章展望了XML的未来。附录A给出了一些基本的W3C定义。各章的概要如下:第1章介绍了Oracle在XML工业技术方面做出的努力,解释了XML的基本概念与术语、XML存在的原因以及Oracle在业界的XML战略。同时本章也给出了Oracle技术网络及其XML链接、Oracle的具有XML功能的产品和XML组件的一览表,最后是一个具有XML功能的关于书籍出售的应用实例。第2章介绍了Oracle的XML开发包(XML Developer's Kit,XDK)组件,回顾了Java/C/C++/ PLSQL等语言的XML解析器及XSLT处理程序、Java/C++语言的类生成器、以及Java TransViewer组件。用于访问及处理XML/XSL文件的可工作代码也包括在本章中。第3章涵盖了Oracle8i内建的Java虚拟机和Oracle的Java XML组件。同时也介绍了怎样利用XDK的XSQL Servlet存储XML数据到数据库中或从数据库中获取XML数据。最后,介绍了具有XML功能的售书应用的设计与实现。第4章涵盖了Oracle应用服务器的体系结构及其与XML和XDK组件的联系。介绍了把书店应用作为QAS Servlet进行生成的实现。第5章介绍了Oracle的下一代文件系统—iFS。这一章涵盖了iFS的体系结构,它作为XML文件系统的行为特性,以及它怎样在内部使用XML来把文件数据映射到关系模式。本章中还包括了关于通用文件操作的几个代码实例。第6章涵盖了Oracle8i的文本搜索引擎—interMedai Text,回顾了其体系结构及搜索已存储的XML文档的能力。本章中的实例代码用于扩展书店应用,如产生索引进行基于XML的搜索。第7章涉及到怎样把XML组件组装到端到端解决方案中。本章介绍了一个具有XML功能的数据库应用的设计,其中包括用XML增强的Web站点和由商家到客户(business-to-client,B2C)的消息传递系统。上述XML和XSL实例文件以及实例代码都包含在本章中。第8章介绍了Oracle技术网络(OTN)的关于XML的Web站点及其提供的XML示范。本章涉及怎样安装和运行这些示例,其中包括每个例子所示范的特定XML特性和能力方面的细节。第9章回顾了W3C和OASIS在XML标准上所做的努力,基于这些组织已有的工作推测了XML未来的发展方向。同时本章注意到了业界的几家主要公司使用XML及其相关技术的方式。附录涵盖了主要的XML规范。它对W3C关于XML文档接口的两个主要标准—OM和SAX进行了讨论,同时也涉及到其他相关的XML技术标准如名字空间、XPath以及XSL变换等。随书光盘与Web站点你可以在随书光盘上找到Oracle XDK的产品版,它是相应于Java组件的,其中包括XML解析器、XSL处理程序、TransView Java beans以及XSQL Servlet等,还有许多富于说明性的示范。你还可以找到另外一些产品的试用版,如Oracle8i Release 2、JDeveloper 3.1以及Oracle的具有XML功能的Java开发环境的最早版本等。最后,我们把相应于Java和Web-to-Go Web服务器的业务组件也加入在内,来协助你开发端到端的商务应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值