原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。
由于各种原因,可能存在诸多不足,欢迎斧正!
有幸在这样一家国内顶级的互联网公司实习,由于在校期间主要时间都投在ACM上,对于windows编程比较生疏,工作方面职位为PC客户端开发,所以职场导师推荐了基本专业书籍,在完成自己的任务之余,我把时间放在慢慢咀嚼这些经典书籍上。由于相关积累有限,故有些地方怕表达不当,所以以摘抄经典为主。在此说明,由于工作原因,有些技术需要保密,程序代码就不提供了,具体做些什么就不宜多说了。实习很快结束了,在这两个多月里真的很愉快,学到很多在学校学不到的东西,只是马上快开学了,得回学校继续自己的学习生活。由衷的感谢实习期间帮助过我的导师同事们!
6月24日
1.COM即组件对象模型,Component Object Model ,COM是一种跨应用和语言共享二进制代码的方法。与C++不同,它提倡源代码重用。COM与语言、平台无关。
2.COM,是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够交互操作,客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。
3.HRESULT 其实是一个双字节的值,其最高位(bit)如果是0表示成功,1表示错误。我们在程序中如果需要判断返回值,则可以使用比较运算符号;switch开关语句;也可以使用VC提供的宏:
HRESULT hr = 调用组件函数;
4.COM 组件是运行在分布式环境中的。BSTR 其实是一个指针类型,指向 UNICODE 字符串的指针,且 BSTR 向前的4个字节中,使用DWORD保存着这个字符串的字节长度( 没有含字符串的结束符)。
5.COM组件实际上是一个C++类,而接口都是纯虚类。接口都是纯虚类,所包含的函数都是纯虚函数,而且它没有成员变量。而COM组件就是从这些纯虚类继承下来的派生类,它实现了这些虚函数。COM组件是以C++为基础的,特别重要的是虚函数和多态性的概念,COM中所有函数都是虚函数,都必须通过虚函数表VTable来调用。
6月26日
1.ATL,即ActiveX template library,活动模板库。ATL可以连接MFC,如CString、CRect等类。
2.类向导又称Class Wizard,VC提供了管理类快捷界面和快捷方式使我们能方便管理成员变量、成员函数、消息映射等。
3.分布式应用程序是指:应用程序分布在不同计算机上,通过网络来共同完成一项任务。通常为服务器/客户端模式。人们开始偏爱基于浏览器的客户应用程序。这当然不是因为客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序安装和配置的问题,另一半是因为客户和服务器之间通信的问题。
4.COM实际提供了一组开发组件的方法。组件是功能相对独立的二进制可执行程序,可以提供给其他应用程序使用。COM组件可以看做动态的、面向对象的API。
6月27日
1.OLE,全称Object Linking and Embedding,对象连接与嵌入。OLE 不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为组件对象模型(COM)。
2.COM组件必须可以动态链接、隐藏实现细节。
3.COM组件是以Win32动态链接库DLL和可执行文件EXE组成的可执行代码组成的。COM组件与语言无关,是由二进制代码组成。
6月28日
1.类并非COM组件。一个组件可有多个C++类实现,或者根本不用类也可实现组件。
2.COM接口是一个标准的二进制可执行代码,客户同接口的连接并不是按其名称或其成员函数的名称来完成的,而是通过它在内存块中的位置来完成的。
3.一个接口表示的行为越多,适用场所的特定性就越强,可复用性就越小。
4.在C++中接口可通过只含纯虚函数的抽象类表示,而接口的机制可以通过虚指针、虚函数表来理解。
5.COM接口都继承了IUnkown,每个COM接口虚指针vtbl的前3个元素都是指向函数QueryInterface、AddRef、Release的。
6.表示错误有3种方式:消息ID(宏)、消息文本、错误号。当Windows函数运行失败时,应该立即调用GetLastError函数。如果调用另一个Windows函数它的值很可能被改写。注意GetLastError能返回线程产生的最后一个错误。
6月29日
1.将this指针进行类型转换会导致其值的改变,如
static_cast<IX*>(this)!= static_cast<IY*>(this);
通常将一个类型的指针转换成另一个类型的指针不会导致其值的改变,但为了支持多继承,某些情况下其值会发生改变。
1.组件的实例只有一个IUnkown接口,故查询组件的接口时无论通过哪个接口所得到的均是同一个指针值。
2.COM组件所支持的接口集就是QueryInface能够返回接口指针的接口集。客户了解COM组件的唯一方法就是进行查询。
6月30日
1.AddRef和Release函数实现的是名为引用计数的内存管理技术。引用计数技术室内存管理的一个非常重要的技术。
上面是非线程安全的版本,下面是县城安全的版本,可以保证同一时刻只能有一个线程来来访成员变量。
7月1日
1.关于vector用法应该特别注意vector容器的erase()函数会返回下一个迭代器的地址,这可能会给编程带来问题。在对vector循环删除时,erase(iter)自动返回下一个迭代器的地址,即iter=iter+1,如果是某种条件删除:连续多个都要删除此时若for(;;++iter)就会漏掉一些数,而且若删除的是最后一个数,则iter=end(),此时执行++iter会出错。最好的方法将++iter放在for循环体内。这是vector的内部机制所造成的,所以对vector进行erase的时候特别注意迭代器是否会失效!
for(iter = member.begin();iter != member.end();iter++)
{
if(*iter == 2)
{
iter = member.erase(iter);//vector中可以直接用member.erase(iter),但map不行
}
}
上述代码犯了提到的2个错误,下面代码是对的。
for(iter = member.begin();iter != member.end();)
{
if(*iter == 2)
{
iter = member.erase(iter);
}
else iter++;
}
上述规则同样适用于map关联容器。