- 博客(46)
- 资源 (1)
- 收藏
- 关注
原创 获得一个对话框上的所有控件
方法一:m_hWnd代表对话框window HWND hwndChild = GetWindow( m_hWnd , GW_CHILD ); while( hwndChild ) { hwndChild = GetWindow( hwndChild , GW_HWNDNEXT ); } GetW
2006-11-07 19:38:00 796
原创 Edit控件换行_自动滚屏技巧
,"/r/n"才是换行. EDIT也要设置成MULTILINE的.Auto HScroll改为false,want return设为true./r是软回车,就是当字符到达一定数满行时不用回车就自动换行/n是硬回车,就是只有你输入回车键时才换行在程序中使用回车时缺一不可/*在C++文件中 /n就能实现换行,vc的edit和这点不同*//*VC-旷野 (289956293) 16:
2006-11-06 14:12:00 2688
转载 在vc6.0中点击f1无法正确启动msdn的解决方法。
症状:在vc6.0中,光标在一个库函数上,之后点击f1无法正确启动msdn,而是告诉你msdn无法定位到正确地文件上。参考:无法打开 MSDN 库文件或 MMC 帮助文件http://support.microsoft.com/kb/830859/zh-cn平台:win2003.vc6.0 ,msdn98.关键文件:hhcolreg.dat解决方法: 到C:/W
2006-10-20 16:01:00 1544
转载 win2003问题大集合
1.windows server 2003 3790版本识别 RTM=release to manufacture (公开发行批量生产)是给硬件制造商的版本!是送去压盘的,不是拿去卖的。 OEM=Original Equipment Manufacturer只能全新安装,和RTM差不多,只是称呼不同而已。 RTL=retail(零售)正式零售版,可以升级或者全新安装。 VLK=Volu
2006-09-25 09:06:00 739
原创 State模式
State模式 以前在浏览重构时,书中提出把switch,if ---else溶化为函数或者类。。。State的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为.。 何时使用?State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 或者switch进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State
2006-08-15 19:33:00 691
原创 Command模式
Command模式 作用:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作.UML结构图:图有点问题,client到Invoker之间应由条单方向箭头。解析:Comnand模式的思想是把命令封装在一个类中,就是这里的Command基类,同时把接收对象也封装在一个类中就是这里的Receiver类中,由调用这个命令的类也就是这
2006-08-15 17:05:00 596
转载 IOC详解
作者:冰云 icecloud(AT)sina.com BLOG: http://icecloud.51.net 时间:2004.02.15版权声明:本文由冰云完成,首发于CSDN,作者保留中文版权。未经许可,不得使用于任何商业用途。欢迎转载,但请保持文章及版权声明完整。如需联络请发邮件:icecloud(AT)sina.com一、IOCIoC就是Inversion of Control,控制反
2006-08-14 20:50:00 740
转载 什么是pod类型
原文出处:MSDN Magazine November 2004 (C++ Q&A) 调用虚拟函数 持续化视图状态 POD 类型概念 问题: 在 C++ 中,无法从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立。但是在C#中好像就可以,是这样吗?为什么会有这种差别呢?Clifton F. Vaughn 答案: 确实如此,在这个方面 C#
2006-08-10 10:29:00 4621 1
转载 DLL(Dynamic Link Libraries):
//摘要 :dll与使用它地进程在用一个进程空间 ,dll有自己的数据段 (什么意思?)但没有自己的堆栈,所以它利用 使用它的进程地堆栈。如果有一个dll被多个进程使用,则dll重的全局变量在这些进程中都有各自的 实例。1、dll与进程、线程之间的关系DLL模块被映射到调用它的进程的虚拟地址空间。DLL使用的内存从调用进程的虚拟地址空间分配,只能被该进程的线程所访问。DLL的句柄可以被
2006-08-10 09:41:00 615
原创 使用atl_com创建第一个本地服务器
使用atl_com创建第一个本地服务器vc61.file-->new-->project--->atl com project设定工程名:LocalServer2.在server type 下选择 executable ,之后选择 finish3.系统自动生成了一些文件其中比较重要的有:localserver.idl// 接口定义文件localserver.cpp// 可执行文件(编译连接
2006-08-09 08:31:00 650
原创 父进程 等待子进程初始化后才使用子进程_waitforinputidle
在进程中创建子进程是很常见的话题。常规的方法是用CreateProcess(),这个函数功能强大,使用起来也很方便。不过CreateProcess()或其他函数,如ShellExecuteEx(),在创建子进程后,并不等待子进程初始化完毕,而是立即返回。 通常你应该等子进程初始化完毕后再开始其它事情,特别是子进程有消息循环时。这可以通过函数WaitForInputIdle()实现。这个函数要求你提
2006-08-07 20:04:00 5821
原创 用com建立本地服务器_入门_自动生成proxy_stub.dll
用com建立本地服务器_入门_自动生成proxy_stub.dll。1.vc6.0---->new project--->alt/com--->dll 服务器,在allow merging proxy/stub前面打勾--〉finish这样就建立了一个新的工程。假定我们这个工程的名字为TryCom6_idl。请注意这个时候系统会生成一个makefile文件:TryCom6_idlps.mk,注
2006-08-07 17:22:00 1002
原创 倒立平行四边形的虚拟继承解析_及对com/dll的影响讨论
倒立平行四边形的虚拟继承解析结构: A | | virtual virtual | | D D2 | | TF#include using namespace std;
2006-08-07 11:04:00 592
原创 在客户端使用智能指针的COM_自己弄个简单的智能指针
//dll / com 部分//...........interface.h.........#define INO 10#define IANO 11#define IBNO 12//................#define CANO 20//...................class I{public: virtual int Add
2006-08-07 10:39:00 582
原创 com_2_是否应该在纯抽象类(接口)里面加入非静态成员变量
按照com地规定是不要在接口里面加入数据成员,接口应该只有虚函数。这是com地规则。但是者并不是说 ,如果你在com地接口里加入数据成员,客户就无法访问。从技术上说。你可以在接口里加入任何东西。只要你愿意。但是为了com为什么规定 不要在接口里加入数据成员呢?答案我也不晓得。 不过 如果在接口里加入非静态数据成员那么在 倒立地平行四边形继承时将会如何呢 ?会有什么影响?
2006-08-06 10:23:00 580
原创 第一个com程序_不使用微软的东西。
一句话:如果你真正理解dll那么实现com实在是太容易了。在我的blog里有我写的关于dll的系列文章。当然我在这里说多是c++的实现。因为com就是利用了dll的动态连接的特性,加上面相对象的封装,同时由于dll为了实现动态链接 所以它不能不有些限制,正是由于这些限制导致了 特殊化的写com的方式。或者说倒至了特殊化的封装方式。//一下是dll部分//................
2006-08-05 17:11:00 627
原创 dll_6 多进程中使用dll导出的静态变量(全局变量或局部的静态变量)
关于这个主题的答案我也不知道。不过我要先对题目进行说明。不过怎么样我们可以使用导出函数,而到处函数中取得静态变量的地址然后作为返回值返回,所以,不过怎么我们总是可以访问的。现在要文德是在多进程或多线程中这种行为会有什么效果。也就是如果在一个进程中取得dll的全局变量的地址,然后修改它,另外一个进程会受到这种修改的影响吗?事实上我也不知道,但是我判断应该是不会的。猜测理由如下。在隐士
2006-08-05 13:05:00 1592 1
原创 dll_5 vtable 布局对显式使用dll导出类的影响
根据我对vc的试验得出的结论如下: vc对vatabled的布局是如下确定的 // This class is exported from the trydll2.dllclass __declspec(dllexport) CTrydll2 {public: CTrydll2(void); virtual void diplay(); virtual int fnp(int i);
2006-08-05 12:55:00 580
原创 设计模式之Chain of Responsibility(职责链)
作用:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.假定有消息(事件)发生者 也就是客户端C,有处理者 H,H1,H2,H3.一般的 H为基类,并且有一个虚的基函数设为handle,同时还有一个指向 H的 指针(successor),通常H1,H2,H3均继承H,并各自实现handle,C调用H
2006-08-04 18:07:00 579
原创 dll_4显式使用dll导出的类_利用vtable这个特性
//////////////////////////trydll2.h///// The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the
2006-08-04 17:14:00 601
原创 dll_3,显式利用dll导出全局变量与函数_有参或无参
...................................trydll2.h.......................#ifdef TRYDLL2_EXPORTS#define TRYDLL2_API __declspec(dllexport)#else#define TRYDLL2_API __declspec(dllimport)#endif// This class
2006-08-04 16:04:00 2061
原创 dll_入门2,隐士利用dll导出的类,变量,有参函数
trydll2.h// from a DLL simpler. All files within this DLL are compiled with the TRYDLL2_EXPORTS// symbol defined on the command line. this symbol should not be defined on any project// that uses thi
2006-08-04 15:00:00 702
原创 dll_入门
四种dll:none_mfc dll;mfc dll with static link mfcmfc dll shared mfcextend mfx dll///dll 在编译后会生成dll 和lib文件。 如果我们是显示地使用dll的话则只要用dll文件就可以了。。如果要隐士的使用dll文件则需要 dll , lib .还有头文件。//。。。。。。。。。
2006-08-04 14:24:00 894
原创 weak_ptr
#include using namespace std;#include "boost/weak_ptr.hpp"using boost::weak_ptr;using boost::shared_ptr;using boost::make_shared;//using boost::scoped_ptr;int main(int argc, char* argv[]){ /**///
2006-08-03 21:15:00 517
原创 weak_ptr,shared_ptr,scoped_ptr
scoped_ptr是不能和 weak_ptr,shared_ptr进行转换的,因为没有相应的转换函数!所以他是孤立,这点从他的名字上也可以见到。scope:作用地域,领域。来开了就没有了。同时在领域内所有权又独占!!shared_ptr:可以把weak_ptr转化成(赋值给)shared_ptr:而且这种赋值不会导致weak_ptr的引用计数增加。 而仅仅是把weak_ptr的引用计数
2006-08-03 20:43:00 1261
原创 shared_ptr深入理解
#include "boost/shared_ptr.hpp"#include #include using namespace std;using boost::shared_ptr;void fn(shared_ptr sp){ cout}int _tmain(int argc, _TCHAR* argv[]){ shared_ptr sps1 ,sps2; //注意临时对象的影响 s
2006-08-03 19:47:00 1799
原创 auto_ptr 和 scoped_ptr比较和区别,深入理解
#include "boost/scoped_ptr.hpp"#include #include //contain auto_ptr using namespace std;using boost::scoped_ptr;int main(int argc, char* argv[]){ scoped_ptr sp( new int(10) ) , sp2; //sp = new in
2006-08-03 18:37:00 4175
原创 观察者模式代码
#pragma warning(disable: 4786)#include #include using namespace std;/*¹Û²ìÕßģʽ£º ¹Û²ìÕߣ¨Ê¼þÏìÓ¦Õߣ©-----Ö÷Ì壨ʼþ·¢ÉúÕߣ©---ÈÝÆ÷£¨±£´æ¶ÔÖ÷Ìå¸ÐÐËȤµÄ¹Û²ìÕߣ©*/class IObserver{public: virtual
2006-08-03 17:17:00 819 1
原创 观察者模式--不少理论阐述--摘抄他人的作品--感觉还可以
观察者模式--不少理论阐述--摘抄他人的作品软件设计模式的起源归因于 Christopher Alexander 所做的工作。 作为架构师,Alexander 注意到在给定的环境中存在常见问题及其相关的解决方案。 Alexander 将此问题/解决方案/环境三元组称为“设计模式”,架构师在构建设计过程中可通过它以统一的方式快速解决问题。 二十五年前第一次出版的 A Pattern
2006-08-03 16:32:00 713
原创 话说 memento.备忘模式
me men to 汉译为纪念品 纪念物。看到它你能想到过去的样子。这里实际上是 保存一个对象的状态以便将来能恢复到这种状态。 毫无疑问 这将需要耗费内存,如果你要保存一个对象的多个状态,或者是多个对象的一个状态。当然你可以用文件来保存。不过你得考虑怎么样让这一切方便。class CommemorableObj{private:int m_i;public:
2006-08-03 15:48:00 446
原创 flyweight-- 费解的名字 还不如叫做仓库
在程序中要用到1000个对象 但是其实不同的只有20个。1. 创建一个仓库保存20个对象。当需要时当仓库取(当然要告诉藏库要什么了 。所以需要一个对象 / 类的表示符号 )。如果仓库没有则 仓库就创建加入仓库 ,然后返回给客户2.事实上 如果在每一个小时间段内只有3个对象,那么保存这20则在程序的 运行时间上看占用更多的空间。但是别忘了如果总是在需要才生成那么你要构造1000次,这是花
2006-08-02 19:11:00 399
原创 伤脑筋的bridge模式-我不明白。。
看了看 看了看。。看不明白。还是那图,还是那人。伤脑筋。不过看到了几句话:oo的原则 之一就是 相比使用继承 使用 对象组合更好 。另外:GoF 在说明Bridge 模式时,在意图中指出Bridge 模式“将抽象部分与它的实现部分分离,使得它们可以独立地变化”。而这里的“实现”的含义指的是怎么去实现用户的需求,并且指的是通过组合(委托)的方式实现的,因此这里的实现不是指的继
2006-08-02 18:03:00 514
原创 重写大量接口与重新修改结构或者无法扩展相比,我选择错了,因为短见--慢性自杀的行为
现在我可以告诉你正确的选择是 优先考虑扩张性,至于重写大量接口,如果你实在没办法把这些接口精简,那么就重写吧!不过通常能有精简的方法。千万别为了眼前的利益而错误的选择,因你要避免重写大量接口付出的是以后发生变化时要重新修改结构,因为原来的结构是在无法再扩展或者如果要在原有结构上进行扩展你将面对了很多不可预见性和复杂性!无论何时,选择可扩张性是优先考虑的!!本人 呓语!。。。
2006-08-02 17:17:00 520
原创 auto_ptr的使用
#include #include #include using namespace std;int main(int argc, char* argv[]){ auto_ptr api ,api2; api = auto_ptr( new int(10) ); cout /* api对象的布局:一个int数表示该对象是否有效。(==1有效,==0无效)
2006-08-01 19:23:00 1799 2
原创 decorator呓语——2
我们排除使用函数指针地情况。因为它不够对象化,当然也许未来可能需要使用。所以不用忘了这是一种可以使用的方式。其次我们来思考一下使用编译器为什么我们生成指向vtable地指针。这个东西编译器会为写代码来设定它地值。你想修改它将面临不少问题。 具体可以参考我的blog C++中默认的(拷贝)构造函数 如何处理类对象中 指向vtable 这4个字节的空间的内容 (2)http://blog.
2006-08-01 16:35:00 484
原创 decorator模式 呓语
decorator 的 功能是动态给一个对象添加一些额外的职责。试想一下 。一个已经创建 的对象 如何才能 动态地给他 增加功能呢 ?对象的空间布局 是 数据值。这些数据可以是 非指针属性也可以是指针属性 。如果呢想动态的改变 对象所具有的行为 那么 就只能使用 指针属性的 成员。那么类里面有什么养的 成员是指针属性呢 ?可以给他一个 成员 这个成员是一个 指针。这个指针可
2006-08-01 16:13:00 368
原创 C++中默认的(拷贝)构造函数 如何处理类对象中 指向vtable 这4个字节的空间的内容 (2)
#include #include #include using namespace std;class CBase{public: virtual void fn() { ; } virtual void Add(CBase b) { } virtual void Add(CBase *pb) { } CBase( const CBase &b) { ::memcpy( (void*)t
2006-07-31 19:56:00 571
原创 C++中默认的(拷贝)构造函数 如何处理类对象中 指向vtable 这4个字节的空间的内容
class CBase{public: virtual void fn() { ; } virtual void Add(CBase b) { } virtual void Add(CBase pb) { }}; class CPart :public CBase{public: void fn() { cout }};class CCom:public CBase{public:
2006-07-31 19:03:00 838
Effective c#
2008-07-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人