2010年8月7日

转一篇说明的比较不错的:

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。


从 上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可 能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的 WINDOWS函数就可以使用该句柄,以引用相应的对象。


如果想更透彻一点地认识句柄,我可以告诉大家,句柄是 一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内 存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作 系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果 地址总是如此变化,我们该到哪里去找该对象呢?


为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来 专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地 址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给 的,当系统卸载时(Unload)又释放给系统。



句柄地址(稳定)→记载着对象在内存中的地址────→对象在内存中的地址(不稳定)→实际对象



本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。



但 是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成 是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

受M$的帮助文档以及很多Windows编程书籍的影响,大家对局柄比较普遍的认识是:句柄是一个整数,用以标识Windows对象,句柄不是一个指针……


而实际上,这些不过是M$进行数据封装的幌子而已,下面我们一起来分析一下HANDLE到底是什么。


请先到Windef.h找绝大多数句柄的定义:

DECLARE_HANDLE(HWND);

DECLARE_HANDLE(HHOOK);

……

DECLARE_HANDLE(HGDIOBJ);

DECLARE_HANDLE(HBITMAP);

DECLARE_HANDLE(HBRUSH);

……

typedef HANDLE HGLOBAL;

typedef HANDLE HLOCAL;

……


OK, 现在大家跟我一起翻到Winnt.h,看看DECLARE_HANDLE和HANDLE到底是什么:

#ifdef STRICT

typedef void *HANDLE;

#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name

#else

typedef PVOID HANDLE;

#define DECLARE_HANDLE(name) typedef HANDLE name

#endif

typedef HANDLE *PHANDLE;


哈哈,现在知道了吧,HANDLE就是PVOID,也就是无类型指针,

而DECLARE_HANDLE(HWND);就是:

struct HWND__ {

  int unused;};

typedef struct HWND__ *HWND;

现在实际上都清楚啦,这些Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,^o^


现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么,而且可以编个句柄的瞎话防止大家的质疑:)。而M$的程序大可以这么写:

#include <windows.h> //这个和大家用的一样

#include "windows_in.h" //这个是M$自用的,外人别想看到^o^


HSOMETHINGELSE DoSomething(HSOMETHING hSomething) {

  struct RealSomething* p = (struct RealSomething*)hSomething; //先强制类型转换成内部结构指针

  ……do something……

  return (HSOMETHINGELSE)pRealSomethingElse;//强制类型逆转换
posted @ 2010-08-07 10:13 欣萌 阅读(460) | 评论 (0)编辑 收藏

2010年8月6日

我准备了三天。  然后得到百度的实习生offer  可惜时间不合适。

我真的很想去那里工作,让自己更加的进步。。

追求   热情   技术 我都不愿意放弃

posted @ 2010-08-06 09:31 欣萌 阅读(108) | 评论 (0)编辑 收藏

2010年7月21日

又下雨了

不能去游泳了。。。。。。


现在又没有下雨了。。。


细细
posted @ 2010-07-21 14:42 欣萌 阅读(208) | 评论 (0)编辑 收藏

2010年7月16日

之前写的不算。

现在要做的是 智能监控下的普通监控平台

把从采集卡采集到的数据 压缩, 打包多路发送,同时给智能监控留接口。智能监控为给我报警区域和报警信号。 然后打包发送。

接收端显示。


这不是我的本意 但是导师让我做。
posted @ 2010-07-16 15:03 欣萌 阅读(363) | 评论 (4)编辑 收藏

2010年7月14日

4路摄像头USB的

一个视频转发服务器 兼备 流媒体服务器

N个监控端

N个浏览器端

摄像头 采集---> 压缩(h264)--->TCP--->视频转发服务器--->组合4路码流--->RTP--->监控端--->解码--->显示

视频转发服务器需要保存264数据,控制监控端的访问权。保存的数据 放入流媒体服务器(Live555),供IE查看(安装VLC的插件)。 可能需要转码。

用到的库

jrtp  live555 vcl ffmpeg sdl

posted @ 2010-07-14 16:15 欣萌 阅读(305) | 评论 (0)编辑 收藏

2010年7月12日

好好准备

打好基础

奋斗 奋斗

posted @ 2010-07-12 11:58 欣萌 阅读(223) | 评论 (0)编辑 收藏

2010年7月7日


学习中 每2个月遇到大瓶颈一次

半个月小瓶颈一次


遇到瓶颈 解决的时间在拉长。


Code  看书 看博客 逛论坛 Code


posted @ 2010-07-07 17:17 欣萌 阅读(225) | 评论 (1)编辑 收藏

2010年7月2日

在复习Primer的时候看到的。


void RetrieveEmailFromPage(const string& page, const string& url)
{
    int posCur = 0, posStart, posAt, posEnd, posTmp;
    string email;
    string tags = "._-" "abcdefg" "hijklmn" "opqrst" "uvwxyz"
        "ABCDEFG" "HIJKLMN" "OPQRST" "UVWXYZ" "0123456789";

    while (true) {
        if ((posAt = page.find('@', posCur)) != string::npos) {
            posStart = page.find_last_not_of(tags, posAt - 1) + 1;
            posEnd = page.find_first_not_of(tags, posAt + 1);
            posTmp = page.find('.', posAt + 1);
// domain has at least one dot "xxx.yy"

            if (posTmp != string::npos && posTmp < posEnd - 1 && posStart != posAt && posEnd != posAt + 1) {
                email = page.substr(posStart, posEnd - posStart);
                AddEmail(email, url); // add the email to special data struct
            }
            posCur = posEnd;
        } else {
            return;
        }
    }
//while
}


posted @ 2010-07-02 10:42 欣萌 阅读(241) | 评论 (0)编辑 收藏
 
因为导师的临时反悔,我不能去实习了。

很对不起实习公司。觉得自己浪费的别人的时间。经过这么多面试,好不容易的机会,本来想去好好学习,顺便解决毕业论文的问题。没想到,导师会出尔反尔。 唉。

GoogleDOC好像也不能新建文档了。

以后这里就成了我 摘抄小程序,写体会的地方了。



posted @ 2010-07-02 10:39 欣萌 阅读(250) | 评论 (2)编辑 收藏
仅列出标题