Changjiang的专栏

孤帆远影碧空尽,唯见长江天际流。

赵世平ID:Changjiang
[修改头像]
17672次访问,排名5663(1)好友0人,关注者0
Changjiang的文章
原创 8 篇
翻译 2 篇
转载 0 篇
评论 6 篇
最近评论
wangqinghua1:很有收获,文风简洁
fantasyzzz:老师好,我是今天和您联系请教学习汇编方法的您的学生,我以前一直学习的是8086的汇编语言,不过也可以理解您上面的Win32ASM程序示例的大意,我已经对8086的汇编程序编写有一定的掌握,熟悉汇编的编写方法了,而且我现在还在看8086的教材巩固,我想问的是这个过程是否可以跳过,放下8086的学习,直接学习Win32的汇编。不知道这里请教合适么?谢谢老师。。
royelee:当年也是玩crack的啊?
还是原来用trw2k的时代爽啊。
Changjiang:呵呵,这个BLOG是去年开的,一直没有用,这几天正好有空,放上了一点文章。最近还好么,支持你。
flier:正是应了微软 3.0 那个说法,CLI 一直出到第三版,才算是基本上完成了预先的设想,把从一开始就规划进去的那些坑都填上,也腾出了精力去折腾相对来说更实际一些的 WinFX。等 Enterprise Library 那套东东再成熟一点,针对 Java 阵营的进攻号角才算真正吹向。
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    好友的BLOG
    孟岩的BLOG
    自己的其他BLOG
    Changjiang的另一个BLOG:TBsoft工作室的BLOG
    存档

    原创 Windows汇编语言简明教程——资源篇(2007新版)

    新一篇: 嵌入式GUI开发感言——写在自己艰难转型的日子里

    Windows汇编语言简明教程——资源篇

     

    2007新版)

     

    V0.01

     

    作者:TBsoft Software Studio2007

     

    1 概述

     

    使用Win32汇编语言开发Win32应用程序,使用的应用程序框架仍然是Win32 SDK编程的应用程序框架。显然,在Win32 SDK编程中十分重要的资源(Resource)在Win32汇编语言编程中同样重要。

     

    使用资源,基本的方法是使用文本编辑器编辑资源源文件(Resource ScriptRC文件),然后使用资源编译器(Resource Compiler)将资源源文件编译成资源文件(RES文件),最后将源程序汇编或者编译生成的目标文件(OBJ文件)和资源文件一起使用链接器链接,生成可执行文件。

     

    目前,基于C语言进行Win32 SDK编程,一般使用集成开发环境(IDE),例如Visual C++ 6.0。集成开发环境一般都提供可视化的资源编辑器,可以以可视化的方式编辑RC文件甚至RES文件,并在编译链接时自动完成资源的编译和链接。

     

    MASM32软件包中虽然提供了可以作为汇编语言集成开发环境的编辑器Quick EditorQuick Editor也可以自动完成资源的编译和链接,但是MASM32软件包没有提供很好的可视化资源编辑器,通常只能使用非可视化的方式,直接使用文本编辑器编辑资源源文件以完成资源编辑,不太方便。所以在Win32汇编语言编程中使用资源时,比较方便的方法是将MASM32软件包与Visual C++ 6.0之类的集成开发环境联合使用。

     

    2 Win32汇编语言程序中使用资源

     

    笔者使用C语言和Win32 SDK编程方式,开发了一个简单的使用资源的Win32应用程序,源程序如下(GENERIC.c):

     

    #include <windows.h>

    #include <tchar.h>

     

    #include "resource.h"

     

    static HINSTANCE hInst1;

     

    static TCHAR szWindowClass[]=_T("GENERIC");

     

    LRESULT CALLBACK WndProc(HWND hWnd,

                       UINT message,

                       WPARAM wParam,

                       LPARAM lParam);

     

    BOOL CALLBACK AboutDlgProc(HWND hDlg,

                         UINT message,

                         WPARAM wParam,

                         LPARAM lParam);

     

    int WINAPI WinMain(HINSTANCE hInstance,

                   HINSTANCE hPrevInstance,

                   LPSTR lpCmdLine,

                   int nShowCmd)

    {

       WNDCLASSEX wcex;

       HWND hWnd;

       MSG msg;

     

       if(!hPrevInstance)

       {

          wcex.cbSize=sizeof(WNDCLASSEX);

          wcex.style=CS_HREDRAW|CS_VREDRAW;

          wcex.lpfnWndProc=(WNDPROC)WndProc;

          wcex.cbClsExtra=0;

          wcex.cbWndExtra=0;

          wcex.hInstance=hInstance;

          wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);

          wcex.hCursor=LoadCursor(NULL,IDC_ARROW);

          wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);

          wcex.lpszMenuName=MAKEINTRESOURCE(IDR_MAINMENU);

          wcex.lpszClassName=szWindowClass;

          wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION);

     

          if(!RegisterClassEx(&wcex))

             return FALSE;

       }

     

       hWnd=CreateWindow(szWindowClass,

                     _T("Generic"),

                     WS_OVERLAPPEDWINDOW,

                     CW_USEDEFAULT,

                     CW_USEDEFAULT,

                     CW_USEDEFAULT,

                     CW_USEDEFAULT,

                     NULL,

                     NULL,

                     hInstance,

                     NULL);

     

       if(hWnd==NULL) return FALSE;

     

       hInst1=hInstance;

     

       ShowWindow(hWnd,nShowCmd);

       UpdateWindow(hWnd);

     

       while(GetMessage(&msg,NULL,0,0))

       {

          TranslateMessage(&msg);

          DispatchMessage(&msg);

       }

     

       return msg.wParam;

    }

     

    LRESULT CALLBACK WndProc(HWND hWnd,

                       UINT message,

                       WPARAM wParam,

                       LPARAM lParam)

    {

       HDC hDC;

       PAINTSTRUCT ps;

     

       switch(message)

       {

       case WM_COMMAND:

          switch(LOWORD(wParam))

          {

          case IDM_EXIT:

             ExitProcess(0);

     

             break;

     

          case IDM_ABOUT:

             DialogBoxParam(hInst1,MAKEINTRESOURCE(IDD_ABOUT),hWnd,(DLGPROC)AboutDlgProc,0);

     

             break;

     

          default:

             return DefWindowProc(hWnd,message,wParam,lParam);

          }

     

          break;

     

       case WM_PAINT:

          hDC=BeginPaint(hWnd,&ps);

          EndPaint(hWnd,&ps);

     

          break;

     

       case WM_DESTROY:

          PostQuitMessage(0);

     

          break;

     

       default:

          return DefWindowProc(hWnd,message,wParam,lParam);

       }

     

       return 0;

    }

     

    BOOL CALLBACK AboutDlgProc(HWND hDlg,

                         UINT message,

                         WPARAM wParam,

                         LPARAM lParam)

    {

       switch(message)

       {

       case WM_INITDIALOG:

          return TRUE;

     

       case WM_COMMAND:

          if((LOWORD(wParam)==IDOK)||(LOWORD(wParam)==IDCANCEL))

          {

             EndDialog(hDlg,LOWORD(wParam));

     

             return TRUE;

          }

     

          break;

       }

     

       return FALSE;

    }

     

    资源使用Visual C++ 6.0中的可视化资源编辑器编辑,Visual C++ 6.0中的可视化资源编辑器在生成资源源文件的同时,还会生成包含资源ID定义的资源头文件(resource.h文件)。资源源文件如下(GENERIC.rc):

     

    //Microsoft Developer Studio generated resource script.

    //

    #include "resource.h"

     

    #define APSTUDIO_READONLY_SYMBOLS

    /////////////////////////////////////////////////////////////////////////////

    //

    // Generated from the TEXTINCLUDE 2 resource.

    //

    #include "afxres.h"

     

    /////////////////////////////////////////////////////////////////////////////

    #undef APSTUDIO_READONLY_SYMBOLS

     

    /////////////////////////////////////////////////////////////////////////////

    // Chinese (P.R.C.) resources

     

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

    #ifdef _WIN32

    LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

    #pragma code_page(936)

    #endif //_WIN32

     

    #ifdef APSTUDIO_INVOKED

    /////////////////////////////////////////////////////////////////////////////

    //

    // TEXTINCLUDE

    //

     

    1 TEXTINCLUDE DISCARDABLE

    BEGIN

        "resource.h\0"

    END

     

    2 TEXTINCLUDE DISCARDABLE

    BEGIN

        "#include ""afxres.h""\r\n"

        "\0"

    END

     

    3 TEXTINCLUDE DISCARDABLE

    BEGIN

        "\r\n"

        "\0"

    END

     

    #endif    // APSTUDIO_INVOKED

     

     

    /////////////////////////////////////////////////////////////////////////////

    //

    // Dialog

    //

     

    IDD_ABOUT DIALOG DISCARDABLE  0, 0, 122, 65

    STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU

    CAPTION "About"

    FONT 9, "宋体"

    BEGIN

        LTEXT           "Generic V1.0",IDC_STATIC,20,10,80,10

        DEFPUSHBUTTON   "OK",IDOK,40,40,40,15

    END

     

     

    /////////////////////////////////////////////////////////////////////////////

    //

    // Menu

    //

     

    IDR_MAINMENU MENU DISCARDABLE

    BEGIN

        POPUP "&File"

        BEGIN

            MENUITEM "E&xit",                       IDM_EXIT

        END

        POPUP "&Help"

        BEGIN

            MENUITEM "&About...",                   IDM_ABOUT

        END

    END

     

     

    /////////////////////////////////////////////////////////////////////////////

    //

    // DESIGNINFO

    //

     

    #ifdef APSTUDIO_INVOKED

    GUIDELINES DESIGNINFO DISCARDABLE

    BEGIN

        IDD_ABOUT, DIALOG

        BEGIN

            LEFTMARGIN, 7

            RIGHTMARGIN, 115

            TOPMARGIN, 7

            BOTTOMMARGIN, 58

        END

    END

    #endif    // APSTUDIO_INVOKED

     

    #endif    // Chinese (P.R.C.) resources

    /////////////////////////////////////////////////////////////////////////////

     

     

     

    #ifndef APSTUDIO_INVOKED

    /////////////////////////////////////////////////////////////////////////////

    //

    // Generated from the TEXTINCLUDE 3 resource.

    //

     

     

    /////////////////////////////////////////////////////////////////////////////

    #endif    // not APSTUDIO_INVOKED

     

    资源头文件如下(resource.h):

     

    //{{NO_DEPENDENCIES}}

    // Microsoft Developer Studio generated include file.

    // Used by GENERIC.rc

    //

    #define IDR_MENU1                       101

    #define IDR_MAINMENU                    101

    #define IDD_ABOUT                       102

    #define IDM_EXIT                        40001

    #define IDM_ABOUT                       40002

     

    // Next default values for new objects

    //

    #ifdef APSTUDIO_INVOKED

    #ifndef APSTUDIO_READONLY_SYMBOLS

    #define _APS_NEXT_RESOURCE_VALUE        103

    #define _APS_NEXT_COMMAND_VALUE         40003

    #define _APS_NEXT_CONTROL_VALUE         1000

    #define _APS_NEXT_SYMED_VALUE           101

    #endif

    #endif

     

    现在笔者用Win32汇编语言程序实现本程序的功能。从上面的资源源文件中可以看出:Visual C++ 6.0中的可视化资源编辑器生成的资源源文件使用了Visual C++ 6.0特有的头文件,例如afxres.hMASM32软件包中的资源编译器如果不能正确地找到相应的头文件,则无法正确编译资源源文件。

     

    为了解决这个问题,可以检查一下INCLUDE环境变量,在命令提示符(MS-DOS