随笔分类 -  MFC

摘要:Dll原理和使用- -『转载』引言 调用方式 MFC中的DLL DLL入口函数 关于约定 关于DLL的函数 模块定义文件(.DEF) DLL程序和调用其输出函数的程序的关系 作者 。。。引言比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时, 阅读全文
posted @ 2010-08-31 23:18 dzqabc 阅读(2119) 评论(0) 推荐(2) 编辑
摘要:简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 为什么要使用回调函数? 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。 回调函数:就是指向指针的指针,保存的就一个地址,通常用在钩子过程,异步过程调用等等,因为是一个地址,不会携带任何其他的信息所以一般的回调函数不是类型安全的. 委托就一个类,他的每个实例就是对一个方法(定义好了返回值,输入参数类型,个数以及函数调用的约定)和其. 阅读全文
posted @ 2010-03-18 23:44 dzqabc 阅读(3718) 评论(0) 推荐(0) 编辑
摘要:UpdateData,顾名思义,是用来刷新数据的。 UpdateData(TRUE) -- 刷新控件的值到对应的变量 UpdateData(FALSE) -- 拷贝变量值到控件显示例如,窗口中用 DDX_Text(pDX, IDC_EDIT1,m_usercode);将IDC_EDIT1编辑框控件与m_usercode变量做了关联,如果修改m_usercode之后要想对应控件显示更改,则需要调用UpdateData(FALSE);反之在IDC_EDIT1的oneditchanged()中需要加入UpdateData(TRUE); 简单的说,如果Updatedata(TRUE) == 将控件的值 阅读全文
posted @ 2009-09-23 23:30 dzqabc 阅读(999) 评论(0) 推荐(0) 编辑
摘要:关于Debug&Release在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一:1. 变量。大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数 阅读全文
posted @ 2009-09-07 22:38 dzqabc 阅读(1424) 评论(0) 推荐(0) 编辑
摘要:在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数。 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间 ,在系统下,栈空间是有限的 ,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 下面我们来看一个例子:#include <iostream> #include <string> using namespace std; inline string dbtest(int ... 阅读全文
posted @ 2009-09-03 23:46 dzqabc 阅读(397) 评论(0) 推荐(0) 编辑
摘要:开篇十个问题问题1 作为一个c/c++程序员,你的所有子程序代码都封装在函数体内,你知道还有其他类型的子程序否(与c/c++不同,许多语言还有另外一种类型的子程序成为过程)?问题2 你是否知道过程子程序和函数子程序之间的所有区别?问题3 你是否学习过如何解析一个表达式,考虑到操作符的优先级?问题4 你是否知道属于先行EOF(look-ahead EOF)和非先行EOF(non-look-ahead)的含义?问题5 你是否知道预读(priming read)语句的含义问题6 你是否知道标记循环指的是什么?问题7 你是否知道 static(静态)键字在内层,外层以及作为一个(数据或方法)类成员的作 阅读全文
posted @ 2009-08-30 21:58 dzqabc 阅读(1902) 评论(0) 推荐(0) 编辑
摘要:利用关键代码段实现多线程同步关键代码段又叫临界区,是指一个小代码段,在代码能够执行前,它必须对具有对资源的独中权。如一次只能一个人打电话的公用电话厅,开始时要建个电话厅(初始化临界区:InitializeCriticalSection),一个人打电话(EnterCiticalSection),打完电话离开,便于别人打(LeaveCriticalSection),电话厅不用时,拆掉,释放资源(DeleteCriticalSection);如下程序实现多线程同步:#include <windows.h>#include <iostream>using namespace s 阅读全文
posted @ 2009-08-28 18:42 dzqabc 阅读(352) 评论(0) 推荐(0) 编辑
摘要:C#访问同类实例的私有成员代码大家都知道,一个类的私有成员只能在他的内部访问!但是不知道大家注意到没有,实际上在C#中一个类的实例是可以访问同一个类的另外一个实例的私有成员的。请看这段简单的代码public class MyClass { private int i = 0; public void Function() { MyClass a = new MyClass(); Console.WriteLine( a.i); //这里成功访问了另外的一个实例a的私有实例字段 } }大家也可以自己写一段类似的代码来测试一下,的确是可以访问另外一个实例的私有成员!为什么呢?因为C#就是一开始就是 阅读全文
posted @ 2009-08-25 10:22 dzqabc 阅读(306) 评论(0) 推荐(0) 编辑
摘要:问题的起源: 我在看新版的《C++编程思想》的时候,看到拷贝构造函数章节处大致有这么一,非常不解: Class A { int n; //私有的n public: A(const A& a): n(a.n){} //为什么可以调用a.n,n明明是私有的 } 另外在重载=操作符的时候也有这样的问题。 后来得到的答案是:private是限定异类之间的访问,而不是限定同类不同对象的访问 只有smalltalk是连同类不同对象的访问都限制的 这样就清楚明白的回答了为什么拷贝构造函数可以根据一个对象完整的复制出另一个对象。 但是这样似乎有点不对劲,这样也就是说C++中的一个类是他自己的友员,那样 阅读全文
posted @ 2009-08-25 10:12 dzqabc 阅读(279) 评论(0) 推荐(0) 编辑
摘要:学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于 编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时, 编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不 明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非 常困难。 初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为: unresolved external symbol “symbol”(不确定的外部“符号”)。 如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或 标签,将产生此错误消息。一般来说,发生错误的原因有两个:. 阅读全文
posted @ 2009-08-06 14:08 dzqabc 阅读(227) 评论(0) 推荐(0) 编辑
摘要:QueryInterface 接上篇一.COM接口的开始IUnknowncom起于接口,又归于接口.com之所以是com,是因为其继承了一个名为IUnknown接口.IUnknown接口是一个非常有趣的名字.我们第一次看到这个接口,都会非常好奇,名字的由来开发内部肯定是有故事的,或者他们想不出啥好名字也是有可能的.下面我们来看一下IUnknown接口定义了哪些成员,这篇只讲QueryInterfaceinterface IUnknown{ virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) =0; v 阅读全文
posted @ 2009-08-05 17:08 dzqabc 阅读(548) 评论(0) 推荐(0) 编辑
摘要:会用CMap了,其他的基本也就会了,很容易理解。 映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”,就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。举个例子来说吧,公司的所有职员都有一个工号和自己的姓名,工号就是姓名的关键字,给出一个工号,就可以很快的找到相应的姓名。映射类最适用于需要根据关键字进行快速检索的场合。 常用CMap: CMapWordToPtr 保存void指针,关键字为WORD CMapPtrToWord 阅读全文
posted @ 2009-08-05 15:51 dzqabc 阅读(5531) 评论(1) 推荐(1) 编辑
摘要:C 风格(C-style)强制转型如下: (T) expression // cast expression to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(expression) // cast expression to be of type 阅读全文
posted @ 2009-08-05 13:16 dzqabc 阅读(213) 评论(0) 推荐(0) 编辑
摘要:钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。 在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular us 阅读全文
posted @ 2009-08-04 14:38 dzqabc 阅读(1337) 评论(0) 推荐(0) 编辑
摘要:如何从dll文件导出对应的lib文件? Visual C++ 开发工具提供了两个命令行工具,一个是dumpbin.exe,另一个是lib.exe。利用这两个工具即可从dll导出其对应的lib。 1、在命令行执行: dumpbin /exports yourdll.dll > yourdll.def 2、编辑 yourdll.def 文件,使之格式与.def文件格式一致。比如: EXPORTS; fn1; fn2; 3、在命令行执行: lib /def:yourdll.def /machine:i386 /out:yourdll.lib//为无LIB的DLL制作LIB函数符号输入库本文介绍 阅读全文
posted @ 2009-08-04 13:46 dzqabc 阅读(15270) 评论(0) 推荐(0) 编辑
摘要:我们都知道,COM组件编程中,QueryInterface实现的接口之间的查询,通过这个接口,我们可以获取该组件中其他的接口。但是,QueryInterface实现的原理,并不是大家都很清楚,也没有哪本书仔细讲了这点。我将个人心得写下来,供有需要的人查看。首先,我们看一下基本的COM实现。一般来说,COM是 通过多继承实现多个接口,如下图而对应的QueryInterface实现如下HRESULT实现类::QueryInterface(constIID&iid,void**ppv)...{ if(iid==IID_IUnknown) *ppv=(接口一*)this; else if(ii 阅读全文
posted @ 2009-08-04 12:50 dzqabc 阅读(1105) 评论(0) 推荐(0) 编辑
摘要:getbuffer是为了让你使用CString类中,保存字符串缓冲区的那块指针. 至于releasebuffer,在MSDN中有这样一句话. If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions. 在对GetBuffer返回的指针使用之后需要调用ReleaseBuffer,这样才能使用其他Cstring的operations。否则会发生错误. 首. 阅读全文
posted @ 2009-08-03 14:34 dzqabc 阅读(3763) 评论(0) 推荐(0) 编辑
摘要:BEGIN_MESSAGE_MAP 把消息和函数指针联系起来 1首先要在窗口类的cpp文件手动添加消息响应机制,ON_MESSAGE(ID,Handler) LRESULT Handler(WPARAM,LPARAM);//响应的函数BEGIN_MESSAGE_MAP(CShellDlg, CDialog) //{{AFX_MSG_MAP(CShellDlg) ON_MESSAGE(WM_SENDOFFLINE, OnSendOffline) //自定义消息 ON_MESSAGE(WM_SWIPECARD, OnSwipeCard) //自定义消息 ON_MESSAGE(WM_MODEM, O 阅读全文
posted @ 2009-07-30 16:51 dzqabc 阅读(4765) 评论(0) 推荐(0) 编辑
摘要:.clw 支持ClassWizard .ncb 支持ClassView .opt 保存工作空间的配置 .aps 支持ResourceView .bsc 浏览器信息文件 .dsp 项目文件 .dsw 工作空间文件 .mak 外部的创建文件 .plg 建立日志文件 阅读全文
posted @ 2009-07-28 08:53 dzqabc 阅读(255) 评论(0) 推荐(0) 编辑
摘要:在View类中动态创建一个Edit控件如下: editT1.Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,CRect(0,0,50,20),this, IDC_EDITT1); 现在想实现类似对话框中的数据交换功能。 我的方法是: void CMatlabPrintView::DoDataExchange(CDataExchange* pDX) { // TODO: Add your specialized code here and/or call the base class CView::DoDa 阅读全文
posted @ 2009-07-27 15:57 dzqabc 阅读(5933) 评论(1) 推荐(0) 编辑