学习总结

    额。。。。。。。。。。。今天下午要去面试了。。。紧张中。希望能顺利通过哈。下面是昨天晚上到现在的学习总结,希望能完全应付这次的面试额。由于时间的原因,整理的很乱,很简单,等下次面试之前能做能完完整整的整理一下,俺要过面试额,我要找个好工作,哈哈

   具体如下:

COM所在的DLL中必须导出四个函数:
dllgetobjectclass, dllregisterserver, dllunregisterserver, dllunloadnow
这四个函数各有作用,有些是提供给COM管理器用的,通过CLSID和IID来使用,有些是提供给注册机用的.

Com组件一般提供给其他程序调用(对外)
DLL一般是自己的程序调用(也可能是自己的几个程序)(对内)

VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short、long、double等,包括各类指针和数组。
1、使用SAFEARRAY实现二维数组
SAFEARRAY安全数组可以实现多维数组,SAFEARRAY实现的步骤可以大致分为三步。
(1)创建SAFEARRAY安全数组,包括设置数组元素的类型、数据的维数,大小等。
(2)对SAFEARRAY数组赋值,既可通过SafeArrayPutElement函数逐个元素进行负责,也可通过指针来获得SAFEARRAY的数据地址,然后对指针指向的值进行赋值操作。其中,如果SAFEARRAY中的数组时多维数组,即可以把多维数组转换为一维数组,也可以通过获得指向数组的指针方式来操作数组中的元素。
(3)使用VARIANT变量把SAFEARRAY进行包装。

使用COleSafeArray实现二维数组
COleSafeArray继承于VARIANT,是MFC的自动化类,因此,只有在使用MFC类库时才能使用该类。COleSafeArray封装操作相关的函数,可通过MSDN查询该类的成员函数来了解与安全数组相关的函数。COleSafeArray还可以直接转换为VARIANT。因此,相对于SAFEARRAY,COleSafeArray的使用更方便。COleSafeArray和SAFEARRAY之间的关系就是MFC类库和Win32 SDK的关系,使用步骤类似。

进程间通信的消息方法
当进程要与其它进程通讯时,可利用msgsnd()系统调用来发送消息。对于msgsnd()系统调用,核心检查消息队列描述符合许可权是否合法,消息长度是否超过系统规定的长度。通过检查后,核心为消息分配消息数据区,并将消息从用户消息缓冲区拷贝到消息数据区。分配消息首部,将它链入消息队列的末尾;在消息首部中填写消息的类型、大小以及指向消息数据区的指针等;还要修改消息队列头标中的数据(如消息队列中的消息数、字节数等)。然后,唤醒等待消息到来的睡眠进程。 消息的接收: 进程可利用msgrcv()系统调用,从指定消息队列中读一个消息。对于msgrcv()系统调用,先由核心检查消息队列标识符合许可权,继而根据用户指定的消息类型做相应的处理。消息类型msgtyp的参数可能有三种情况:当msgtyp=0时髦核心寻找消息队列中的第一个消息,并将它返回给调用进程;当msgtyp为正整数时,核心返回指定类型的第一个消息;当msgtyp为负整数时,核心应在其类型值小于或等于msgtyp绝对值的所有消息中,选出类型值最低的第一个消息返回。如果所返回消息的大小等于或小于用户的要求,核心便将消息正文拷贝到用户区,再从队列中删除该消息,并唤醒睡眠的发送进程;如果消息长度比用户要求的大,则系统返回出错信息。用户也可以忽略对消息大小的限制,此时,核心无需理会消息的大小而一概把消息内容拷贝到用户区。

管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。

ATL,Active Template Library活动模板库:对COM组件的开发提供最大限度的代码自动生成以及可视化支持。首先ATL的基本目标就是使COM应用开发尽可能地自动化,这个基本目标就决定了ATL只面向COM开发提供支持

关于本机流量监控
使用setsockopt(socksrv,IPPROTO_IP,IP_HDRINCL,(char *)sockFlag,sizeof(sockFlag));
绑定端口后,使用 ioctlsocket(socksrv,SIO_RCVALL,&dwvalnue);实现把套接字设置为接收所有数据包
获取协议栈信息:AllocateAndGetTcpExTableFromStack,AllocateAndGetUdpExTableFromStack,GetProcessHeap
TCP协议三次握手过程分析:
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

挂起进程的实习:
CreateRemoteThread创建远程线程,用这个挂起某进程的所有线程,实现挂起进程
dump(转存):MiniDumpWriteDump
查询进程信息:NtQueryInformationProcess
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 获取线程快照
if (Thread32First(hThreadSnap, &te32))
{
do
{
if (te32.th32OwnerProcessID == ProcessID)
{
HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);
if (bResumeThread)
{
//cout << _T("Resuming Thread 0x") << cout.setf( ios_base::hex ) << te32.th32ThreadID << ' ';
ResumeThread(hThread);
}
else
{
//cout << _T("Suspending Thread 0x") << cout.setf( ios_base::hex ) << te32.th32ThreadID << ' ';
SuspendThread(hThread);
}
CloseHandle(hThread);
}
}while (Thread32Next(hThreadSnap, &te32));
bRet = TRUE;
}


二叉树的遍历:
(1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右。

(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树。简记左-根-右。

(3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点。简记左-右-根。

posted @ 2012-06-15 11:46  qqnihao  阅读(202)  评论(0编辑  收藏  举报