Board logo

标题: API学习经验之谈___1 [打印本页]

作者: 柔肠寸断    时间: 2009-6-5 16:49     标题: API学习经验之谈___1

API学习经验之谈___1
问题1____句柄
相信这个"东西"足以让各位朋友郁闷很长一段实际在"云里雾里"中(小生可能更严重)
其实,这是一个最不足以让你去深究的东西,先听听"大师级人物"(个人认为)罗云彬老师在<<Windows 环境下32位汇编语言程序设计>>(好书啊!~_~)一书中对它的定义:
句柄只是一个数值而已,它的值对程序来说是没什么有意义的,它只是Windows用来表示资源的编号而已,所以只有Windows才知道怎么使用它来引用各种资源!
明白了吗?(鬼才明白~_~!)
好,举例来说,屏幕上已经有10个窗口,Windows把他们从1道10编号,应用程序又建立了一个窗口,现在Windows把它编号位11,然后把11当做窗口句柄返回个应用程序,应用程序并不知道11代表的是什么,但在操作窗口的时候,把11当作句柄传给Windows,Windows自然可以根据这个数值查出是哪个窗口.当该窗口关闭的时候,11这个编号就作废了.第二次运行的时候,如果屏幕上又有5个窗口,那么现在句柄可能就是6了,所以,应用程序不用关心句柄的具体数值是多少.打个比方,可以把句柄当做是商场中寄放包包时营业员MM给的纸条,纸条上的标号代表什么,用户不用去了解,但把它给营业员MM时,她自然会给你正确的包包啦!
明白了吗?(要是还不明白就改行算了!你小子的天赋不在学计算机上~_~!)

问题2____新建项目(以VC.NET/6.0为例)
要想编译一段API代码,可以考虑走明星路线(我就是我生活中的明星,呵呵,说笑)
VC.NET
在新建项目中选择"Win32项目"为模板,前提是你选择Visual C++为项目类型
填了名字下一步后,停下,选择应用程序设置,给附加选项的空项目打上钩
好了,你就可以随心所欲了,每次看到这个界面,我就忍不住欲火焚身啊!(不要误解,是写程序的欲火)
我先在源文件里添加了一个Cpp文件,叫做first.cpp,为了让你们爽下,带码也考给你们算了,要是觉得太简单,不要K我啊!(我躲):
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HDC hdc;
HDC hdcmem;
HBITMAP hBm;
BITMAP bm;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    char lpszClassName[]=" ";
    char lpszTitle[]="Example";
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor=LoadCursor(NULL,IDI_APPLICATION);
    wndclass.hIcon=LoadIcon(NULL,IDC_ARROW);
    wndclass.hInstance=hInstance;
    wndclass.lpfnWndProc=WndProc;
    wndclass.lpszClassName=lpszClassName;
    wndclass.lpszMenuName=0;
    wndclass.style=0;
    if(!RegisterClass(&wndclass))
    {
        MessageBeep(0);
        return FALSE;
    }
    hwnd=CreateWindow(lpszClassName,
        lpszTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,NULL,
        hInstance,NULL);
    hBm=LoadBitmap(hInstance,"tomato");
    GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm);
    ShowWindow(hwnd,nCmdShow);
    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)
{
    PAINTSTRUCT ps;
    switch(message)
    {
    case WM_CREATE:
        hdc=GetDC(hwnd);
        hdcmem=CreateCompatibleDC(hdc);
        ReleaseDC(hwnd,hdc);
    case WM_PAINT:
        //back=LoadBitmap(hInstance,
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdcmem,hBm);
        BitBlt(hdc,180,80,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);
        EndPaint(hwnd,&ps);
        break;
    case WM_DESTROY:
        DeleteObject(hBm);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd,message,wParam,lParam);
    }
    return 0;
}
然后我在资源文件里添加一个.rc的文件(在添加新项里有),取名叫pic7.rc,接着双击pic7.rc就可以看到资源视图,里面有个文件夹就叫pic7.rc,右击,选择添加资源,选择Bitmap,再导入一张.bmp图片(system32这个文件夹下这种图片很多的),右击导入的图片,可以看到选项属性,你把它的ID改为"tomato"(我随便找了张tomato的图片,你也可以把它定义为apple啊,或者banana啊什么的都行,只是你要在程序中改下它的名字就行了)好了,perfect!你运行下看看,有了吧!
现在介绍API的书有,介绍VC.NET的书也有,就是没有如何实际写程序时改怎么用的书!连基本的操作都不交,程序就没法编译了,程序都没法去验证,怎么叫人家继续学下去呢?中国人注重理论知识一定要过硬,不过就我个人认为还是老外的注重实际操作的学习方式更值得我们去提倡啊!

问题3____数据类型
很多人搞不懂API里面"乱七八糟"的数据类型,哎呀,其实是你看的或写的太少的缘故罢了!
这个我不说了,虽然确实是个问题,不过有点脑子的人都知道,上网可以找嘛

暂时想不到什么问题了,反正你只要知道程序的入口是int WINAPI WndMain(HINSTANCE,HINSTANCE,LPSTR,int){}
当事件发生了,就要用到switch(message){case}结构了,因为发生了不同的事件要用不同的方式去处理,这个过程是在函数LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)里执行的,主要是(WndProc)!
明天在说点,今天就先这样了.
作者: gassiori    时间: 2009-6-5 17:09

看晕乎了,离看懂这些还有很远啊
作者: bexond    时间: 2009-6-5 17:48

根楼上同感~!




欢迎光临 【3.A.S.T】网络安全爱好者 (http://3ast.com/) Powered by Discuz! 7.2