<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xsh_123321的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/xsh_123321</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xsh_123321]]></copyright><item><title><![CDATA[Assembly Manifest详解]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/7441509</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/7441509</guid><author>xsh_123321</author><pubDate>Mon, 09 Apr 2012 16:36:31 +0800</pubDate><description><![CDATA[[现象]
对这个问题的研究是起源于这么一个现象：当你用VC++2005（或者其它.NET）写程序后，在自己的计算机上能毫无问题地运行，但是当把此exe文件拷贝到别人电脑上时，便不能运行了，大致的错误提示如下：应用程序配置不正确，请重新安装程序……或者是MSVCR80D.dll 没有找到什么的（我记得不是很清楚，不过大致是这样的）

[分析]
看到这样的提示，当然不会傻到重装咯。第一反应应该]]></description><category></category></item><item><title><![CDATA[OnPaint OnEraseBkgnd的调用关系]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/6004771</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/6004771</guid><author>xsh_123321</author><pubDate>Fri, 12 Nov 2010 13:33:00 +0800</pubDate><description><![CDATA[以下是定制Button的OnPaint函数，详细说明如下：void CCustomBtn::OnPaint() {    CPaintDC dc(this); // CPaintDC 实际上封装了BeginPaing，EndPaint。 BeginPaint() 和EndPaint() 可以删除消息队列中的WM_PAINT消息，并使无效区域有效，以防止因包含无效区域不停得发送WM_PAINT消息。如果无效区域被标记为可擦除的，BeginPaint发送一个WM_ERASEBKGND消息给窗口，WM_ERASE]]></description><category></category></item><item><title><![CDATA[ATL之thunk技术]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5990192</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5990192</guid><author>xsh_123321</author><pubDate>Fri, 05 Nov 2010 16:37:00 +0800</pubDate><description><![CDATA[<br /><br /><br />学习下 ATL 的 thunk<br />由于 C++ 成员函数的调用机制问题，对C语言回调函数的 C++ 封装是件比较棘手的事。为了保持C++对象的独立性，理想情况是将回调函数设置到成员函数，而一般的回调函数格式通常是普通的C函数，尤其是 Windows API 中的。好在有些回调函数中留出了一个额外参数，这样便可以由这个通道将 this 指针传入。比如线程函数的定义为：<br />typedef DWORD (WINAPI *PTHREAD_START_ROUTINE]]></description><category></category></item><item><title><![CDATA[C++虚继承对象模型]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5956289</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5956289</guid><author>xsh_123321</author><pubDate>Thu, 21 Oct 2010 12:36:00 +0800</pubDate><description><![CDATA[1.为什么需要虚继承如下图所示如果访问Der::Fun or Der::m_nValue就会带来二义性，无法确定是调用Base1的还是Base2的，所以为了解决多重继承情况下成员访问的二义性，引入了虚继承机制。一般继承                                                                           虚继承2.虚继承实现在虚继承下，Der通过共享虚基类SuperBase来避免二义性，在Base1，Base2中分别保存虚基类指针，Der继承Ba]]></description><category></category></item><item><title><![CDATA[C++ 异常处理]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5929157</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5929157</guid><author>xsh_123321</author><pubDate>Sat, 09 Oct 2010 11:30:00 +0800</pubDate><description><![CDATA[一、 概述　　C++自身有着非常强的纠错能力，发展到如今，已经建立了比较完善的异常处理机制。C++的异常情况无非两种，一种是语法错误，即程序中出现了错误的语句，函数，结构和类，致使编译程序无法进行。另一种是运行时发生的错误，一般与算法有关。　　关于语法错误，不必多说，写代码时心细一点就可以解决。C++编译器的报错机制可以让我们轻松地解决这些错误。　　第二种是运行时的错误，常见的有文件打开失败、数组下标溢出、系统内存不足等等。而一旦出现这些问题，引发算法失效、程序运行时无故停止等故障也是常有的。这就要求我们在]]></description><category></category></item><item><title><![CDATA[C++强制类型转换]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5929105</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5929105</guid><author>xsh_123321</author><pubDate>Sat, 09 Oct 2010 11:16:00 +0800</pubDate><description><![CDATA[1.C强制类型转换(T) expression // cast expression to be of type T2.C++标准强制类型转换static_cast、dynamic_cast、reinterpret_cast、const_cast各自用法如下：1）static_cast用法：static_cast  ( expression )该运算符把expression转换为type-id类型，但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法：a.用于类层次结构中基类和子类的转换。b.进行u]]></description><category></category></item><item><title><![CDATA[字节对齐]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5891318</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5891318</guid><author>xsh_123321</author><pubDate>Fri, 17 Sep 2010 16:45:00 +0800</pubDate><description><![CDATA[一. 字节对齐的作用和原因：   各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐，其他平台可能没有这种情况，但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐，会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始，如果一个int型（假设为32位系统）如果存放在偶地址开始的地方，那 么一个读周期就可以读出这32bit，而如果存放在奇地址开始]]></description><category></category></item><item><title><![CDATA[构造函数，静态函数可不可以为虚函数]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5873976</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5873976</guid><author>xsh_123321</author><pubDate>Thu, 09 Sep 2010 17:46:00 +0800</pubDate><description><![CDATA[答案是否定的。我们从以下两个方面进行分析：1.技术方面虚函数的实现依靠的是类对象中的虚指针，但是当调用构造函数调用的时候，对象还没有产生，无从谈起虚指针的存在。2.存在意义构造函数的作用是提供初始化，在对象生命期只执行一次，不是对象的动态行为，也没有太大的必要成为虚函数]]></description><category></category></item><item><title><![CDATA[COM原理之套间]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5871387</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5871387</guid><author>xsh_123321</author><pubDate>Wed, 08 Sep 2010 16:59:00 +0800</pubDate><description><![CDATA[1.    COM套间的由来
为了解决COM组件在多线程环境下临界资源的访问。
2.    COM套间的类型
1)    客户端程序创建的COM线程模型
a)     单线程套间(STA)
单线程套间可以保证，调用COM对象的方法被顺序执行，COM库所做的幕后工作是在我们调用CoInitializeEx(NULL,COINIT_APARTMENTTHREADED)的时候，会生成一个隐藏窗]]></description><category></category></item><item><title><![CDATA[Windows应用程序的消息处理机制]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5871026</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5871026</guid><author>xsh_123321</author><pubDate>Wed, 08 Sep 2010 15:11:00 +0800</pubDate><description><![CDATA[1 操作系统接受到应用程序的窗口消息，将消息投递到该应用程序的消息队列中。2 应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息，取到消息后返回。取出消息后，应用程序可以对消息进行一些预处理，例如，放弃对某些消息的响应，或者调用TranslateMessage将虚拟键消息转换为字符消息，字符消息被送到调用线程的消息队列中，在下一次线程调用函数GetMessage或PeekMessage时被读出。3 应用程序调用DispathMessage，将消息回传给操作系统。消息是由MSG结构]]></description><category></category></item><item><title><![CDATA[COM原理之包容与聚合]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5870443</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5870443</guid><author>xsh_123321</author><pubDate>Wed, 08 Sep 2010 11:36:00 +0800</pubDate><description><![CDATA[1.包容和聚合的概念包容和聚合实际上是使一个组件使用另外一个组件的一种技术。包容的情况下，客户只能看到外部组件的接口，而外部组件接口的实现是通过转发给内部组件实现的。聚合的情况下，直接将内部组件的借口暴漏给客户，虽然客户不知道内部组件的存在。2.包容的实现包容的实现比较简单，例如外部组件CA（接口IX，IY，其中IY转发给内部组件），内部组件CB（接口IY）。组件CA中添加一成员变量，用于保存内部组件CB的接口指针：private:   IY* m_pIY;CA中Fy函数的实现：Virtual void _]]></description><category></category></item><item><title><![CDATA[MFC RTTI 实现]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5868595</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5868595</guid><author>xsh_123321</author><pubDate>Tue, 07 Sep 2010 15:02:00 +0800</pubDate><description><![CDATA[MFC RTTI 实现  ——摘自侯俊杰《深入浅出MFC》1.为了支持RTTI，MFC引入了CRuntimeClass的定义，定义如下：struct CRuntimeClass{    //Attributes    LPCSTR m_lpszClassName;    int m_nObjectSize;    UINT m_wSchema;//schema number of the loaded class    CObject* (PASCAL* m_pfnCreateObject)();//NUL]]></description><category></category></item><item><title><![CDATA[ 类static 成员变量，const成员变量，static const 成员变量]]></title><link>https://blog.youkuaiyun.com/xsh_123321/article/details/5868161</link><guid>https://blog.youkuaiyun.com/xsh_123321/article/details/5868161</guid><author>xsh_123321</author><pubDate>Tue, 07 Sep 2010 11:43:00 +0800</pubDate><description><![CDATA[class Test{int a = 0;// 1 error.const int a = 0; //2 error.static int a = 0; //3 error.static const a = 0; //4 ok. int/char等可以进行就地初始化，是因为这些变量可以直接被优化为立即数.};以上四种变量的定义方式只有4是正确的，原因如下：error 1:编译器对每个包含该头文件的源文件编译，导致生成多个a的导出符号，则会导致duplicated external simbols。因此如果头]]></description><category></category></item></channel></rss>