回 帖 发 新 帖 刷新版面

主题:API学习经验之谈___1

大家好,小生(非飞鱼)最近学习了点API,没什么好东西给大家的,就说点学习经验,要是有什么不够的,还请大家多多指教啊!

问题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里面"乱七八糟"的数据类型,哎呀,其实是你看的或写的太少的缘故罢了!
这个我不说了,虽然确实是个问题,不过有点脑子的人都知道,上网可以找嘛,真的很多的,要是真的找不到,没办法,问我好了(我的个人隐私QQ:275913977)

暂时想不到什么问题了,反正你只要知道程序的入口是int WINAPI WndMain(HINSTANCE,HINSTANCE,LPSTR,int){}
当事件发生了,就要用到switch(message){case}结构了,因为发生了不同的事件要用不同的方式去处理,这个过程是在函数LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)里执行的,主要是(WndProc)!
明天在说点,今天就先这样了,要是有问题的话,可以互相交流(275913977),还有,我也是API这个巨大海洋里的一只小虾啊!

回复列表 (共29个回复)

沙发

老罗那句话很经典.
第二点嘛.先看向导做出来的代码再自己写我觉得比较好.看懂了结构再写而不是把代码背下来.
第三.学API主要是看MSDN或Platform SDK.这可是最权威,全面(不过有时感觉还不够全面,MS有时会藏点什么东东)的资料.其实数据类型也就那几种.内置的,用typedef定义过的.还有更多的是结构体(好像这个鬼东东数量最多).枚举.到时看MSDN就可以了.还有另外一个方法.VC编辑环境.在结构体名字上点右键.选择转到定义.真相即可大白于天下.

板凳

好贴!~顶~!~~~

3 楼

我现在正在考虑封装自己的API的问题......

4 楼

现在介绍API的书有,介绍VC.NET的书也有,就是没有如何实际写程序时改怎么用的书!连基本的操作都不交,程序就没法编译了,程序都没法去验证,怎么叫人家继续学下去呢?中国人注重理论知识一定要过硬,不过就我个人认为还是老外的注重实际操作的学习方式更值得我们去提倡啊!

这几句真是深有体会。所以我坚持以老外的为主,国内的为辅,呵呵
学习很多时候都要靠自己摸索,因为许多知识不是你上网或者看书就能学到的。

5 楼

我个人认为,学习MFC之前很有必要先学下API编程,这样你对Windows的认识就相当于从庖丁的眼中去看牛一样了!学习API对于大家来说是很有好处的,比如可以写拦截数据包的外挂啊,能更好的学习W32下的汇编啊,加深对MFC的理解啊,API甚至是学习加密与解密的必备之技能(还有汇编),还有,就是很多学生都是读大三了,水平还是只停留在C++,JAVA,JSP等一些简单的编程语言阶段,口中却是一味的埋怨学校的教学,国家的教育政策等等,所以,如果是那样的同学可以去看看API,或许你可以像我大二(现在读大3了)时一样如饥似渴的钻进去,发疯一样的茶不思,饭不香的去学习(我可是冲着为了学加密与解密去学的),学点到社会后有用的东西!

6 楼

受益不少

7 楼


好猛啊,8错8错,我正在学MFC面向对编程,这贴子对我帮助很大。谢谢[em4][em4]

8 楼

能不能介绍些学API编程比较好的书啊  我找了很久了还没找到好的

9 楼

《Windows程式开发设计指南》这本书还不错的,说的挺全面的.你想要的话可以QQ上问我要拿!

10 楼


flyfish321,你QQ号多少,我也学了一段时间的API,觉得很有意思。
有时间聊聊,我QQ:56288044[em20]

我来回复

您尚未登录,请登录后再回复。点此登录或注册