随笔分类 -  C++

上一页 1 ··· 4 5 6 7 8 9 10 11 12 下一页
摘要:Dll原理和使用- -『转载』引言 调用方式 MFC中的DLL DLL入口函数 关于约定 关于DLL的函数 模块定义文件(.DEF) DLL程序和调用其输出函数的程序的关系 作者 。。。引言比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时, 阅读全文
posted @ 2010-08-31 23:18 dzqabc 阅读(2115) 评论(0) 推荐(2) 编辑
摘要:一种可能是在安装路径Microsoft Visual Studio *\VC\bin 或者 System32 下里放了个mspdb80.dll,是从common7 中找到并粘贴过去的,因为想用bin目录下的dumpbin程序,今天一运行也出现了楼主的问题,在网上查一下,把那个dll删除就好了。 阅读全文
posted @ 2010-08-22 20:29 dzqabc 阅读(1010) 评论(0) 推荐(0) 编辑
摘要:要达到DOS程序运行时不显示窗口的效果,有两种可能:一是创建该DOS进程时,指定不创建窗口;二是隐藏该DOS进程有窗口。根据MSDN,CreateProcess() API的原型如下: BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID l 阅读全文
posted @ 2010-08-22 16:37 dzqabc 阅读(1802) 评论(0) 推荐(0) 编辑
摘要:DDX用于控件与变量的数据交换.DDV用于对数据交换后的变量进行校验,倘若校验失败将抛出异常导致Updata后面部分不能正常执行.必要时需要对Updata的返回值进行判断. 对于数据交换,需要编写一个带有参数CDataExchange指针、一个控件ID和对某变量引用的全局函数,尽管可以不在函数前面添加DDX_前缀,但是为了可以和Class Wizard集成,最好忍住你的这种念头(后面你会看到为什么了). 在交换函数中,可以检查CDataExchange指针,以了解你所须的细节.下面就来看看CDataExchange类的成员.成员 描述m_bSaveAndValidate对应于你提供给Updat 阅读全文
posted @ 2010-08-22 16:15 dzqabc 阅读(1737) 评论(0) 推荐(0) 编辑
摘要:obj,lib,dll,exe的关系 lib是和dll对应的。lib是静态链接库的库文件,dll是动态链接库的库文件。 所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行你的exe的时候不再需要lib。 所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。 lib,dll,exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。源代码和最终目标文件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。比如说一个exe需要很多的cpp文件生成。而编译器一次只能编译一个cpp文件。这样编译器 阅读全文
posted @ 2010-08-18 22:44 dzqabc 阅读(3249) 评论(2) 推荐(1) 编辑
摘要:在VC2008中编程如下: TempValue.Format("%d",m_CH1_Value); //TempValue为Cstring类型,m_CH1_Value为Int类型编译之后出现1>e:\project\cplus\control\control\controldlg.cpp(200) :error C2664: “void ATL::CStringT<BaseType,StringTraits>::Format(constwchar_t *,...)”: 不能将参数1 从“const char [3]”转换为“const wchar_t *” 阅读全文
posted @ 2010-08-12 23:35 dzqabc 阅读(1562) 评论(0) 推荐(0) 编辑
摘要:在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用 ( 不满足继承关系,而是组合关系 ) 。也就是需要互相声明。好了,这时候会带来一些混乱。如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已的处理办法:编码时,我们一般会尽量避免 include 头文件,而是采用声明 class XXX 。 但有时候还是必须用 Include 头文件,那么,两者的划分在于什么呢?应该是很明确的,但书上好像都少有提及。首先: 我们要明白为什么要用声明取代头文件包含:对了,是为了避免无必要的重编译 ( 在头文件发生变更时 ) 。 工程较大,低速机,或基础类经常变更 ( 不合理的设计吧 ) ,编译. 阅读全文
posted @ 2010-08-10 23:51 dzqabc 阅读(1877) 评论(0) 推荐(1) 编辑
摘要:首先引用一段: _MSC_VER 定义编译器的版本。下面是一些编译器版本的_MSC_VER值(参见扩展阅读中的参考文献2的链接) MS VC++ 9.0 _MSC_VER = 1500 MS VC++ 8.0 _MSC_VER = 1400 MS VC++ 7.1 _MSC_VER = 1310 MS VC++ 7.0 _MSC_VER = 1300 MS VC++ 6.0 _MSC_VER = 1200 MS VC++ 5.0 _MSC_VER = 1100 其中MS VC++ 9.0就是Visual C++ 2008,MS VC++ 8.0就是Visual C++ 2005。版本名称上的的 阅读全文
posted @ 2010-08-05 14:39 dzqabc 阅读(607) 评论(0) 推荐(1) 编辑
摘要:"在共享DLL中使用MFC"指的是打包时一些MFC的DLL的内容没有被硬编码到在EXE文件中,所以EXE会文件较小,但是运行时要求运行的系统环境中要有相关的DLL文件. "在静态库中使用MFC"是将DLL对应的lib静态库中的相关代码硬编码到EXE文件中,文件较大,但是可以在没有已经被包含DLL的机器上运行,当然即使如此也并非所有的DLL都会将其硬编码到Exe中,因此仍然某些DLL是必须的.比如Redistributable Package中的某些DLL. 阅读全文
posted @ 2010-07-31 15:10 dzqabc 阅读(823) 评论(0) 推荐(0) 编辑
摘要:摘自:MSDN 1.由于服务必须从服务控制管理器的上下文中运行,而不是从 Visual Studio 中运行,因此调试服务不像调试其他 Visual Studio 应用程序类型那样简单。若要调试服务,必须首先启动服务,然后将一个调试器附加到正在运行服务的进程中(AttachToProcess)。 附加到服务的进程使您能够调试大多数服务代码,但并非全部;例如,由于服务已经启动,因此不能用这种方法调试服务的 OnStart 方法中的代码,或调试用于加载服务的 Main 方法中的代码。(不断循环的那块代码当然可以调试,只是不能调试初始化服务运行环境的线程的代码,和服务线程中初始化部分代码(初始化代码 阅读全文
posted @ 2010-07-30 00:42 dzqabc 阅读(4532) 评论(0) 推荐(0) 编辑
摘要:VS2008 lib静态链接一、 静态链接库与动态链接库区别静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。如果在当前工程中有多处对dll文 阅读全文
posted @ 2010-07-22 17:23 dzqabc 阅读(7303) 评论(0) 推荐(2) 编辑
摘要:Windows将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录, 2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录, 5.列在Path环境变量中的一系列目录。 阅读全文
posted @ 2010-07-21 20:45 dzqabc 阅读(420) 评论(0) 推荐(0) 编辑
摘要:1:把dll的项目直接放进带有exe启动的项目,引用,调试(放在一个Workspace或者是solution中,这样应该可以连调了)2:直接启动dll项目: 项目属性的“启动操作”里把调试模式该为程序,并在“启动应用程序”栏选取exe程序。(2005中设置是项目属性->配置属性->调试->命令中指定会调用该dll的Exe程序) 这样vs.studio会先把那个exe启动起来。当然那个exe如果调用了这个dll的话,在这里设置断点就没问题了。 比如,我提供了一个exe程序,里面有一大堆的处理,其中一个需要调用xx.dll。某开发者只有xx.dll的源码,没有exe的源码,但是又 阅读全文
posted @ 2010-07-19 23:29 dzqabc 阅读(433) 评论(0) 推荐(0) 编辑
摘要:默认参数 在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数赋值。这就是默认参数; (2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。 注意: (1)默认参数只可在函数声明中设定一次。只有在无函数声明时,才可以在函数定义中设定。(即在第一次出现时设定) (2)默认参数定义的顺序为自右到左。即如果一个参数设定了缺省值时,其右边的参数都要有缺省值。 如:int mal(int a, int b=3, int c=6, int d=8) 正确,按从右到左顺序设定默认值。 in 阅读全文
posted @ 2010-07-01 10:14 dzqabc 阅读(398) 评论(0) 推荐(0) 编辑
摘要:在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开发,加快软件的开发速度。下面就来使用文件映射的方式进行共享数据。先要使用函数 CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用 OpenFileMapping函数在另一个进程里打开共享文件的名称,这样就可以实现不同的进程共享数据。 函数 CreateFileMapping、MapViewOfFile声明如下: WINBAS. 阅读全文
posted @ 2010-04-20 11:25 dzqabc 阅读(3854) 评论(0) 推荐(0) 编辑
摘要:简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 为什么要使用回调函数? 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。 回调函数:就是指向指针的指针,保存的就一个地址,通常用在钩子过程,异步过程调用等等,因为是一个地址,不会携带任何其他的信息所以一般的回调函数不是类型安全的. 委托就一个类,他的每个实例就是对一个方法(定义好了返回值,输入参数类型,个数以及函数调用的约定)和其. 阅读全文
posted @ 2010-03-18 23:44 dzqabc 阅读(3716) 评论(0) 推荐(0) 编辑
摘要:C语言中实现参数个数可变的函数 采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va_start、va_arg和va_end等。 使用这些宏有两种不同的形式,二者在程序中包括的头文件不同,宏的定义也存在一些差别。 采用ANSI标准形式时,参数个数可变的函数的原型声明是: type 阅读全文
posted @ 2010-01-07 11:36 dzqabc 阅读(3800) 评论(0) 推荐(1) 编辑
摘要:按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。param.message = "I was changed";// 由于是新创建了对象,所以将不会在函数外反映新值,新值仅在函数内有效 阅读全文
posted @ 2009-12-14 21:41 dzqabc 阅读(254) 评论(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) 编辑
摘要:VC中的Just-in-time调试,使用该调试模式应用程序可以再Visual C++开发环境之外运行知道发生一个错误.当遇到一个程序错误时,Just-in-time调试自动加载Visual C++ Debugger .要打开Just-in-time调试只需要修改Tools->Options->Just-in-time debugging选项即可(其实该选项所做的操作就是写了个注册表,将自己作为其他程序抛出异常时的处理程序,下面有介绍) 设置即时调试断点,在编译生成的Debug版本程序中加入断点异常,在代码中硬编码一个断点(相当于让程序出错),让程序在到达程序员希望停止位置时加载已 阅读全文
posted @ 2009-09-18 23:08 dzqabc 阅读(3559) 评论(0) 推荐(0) 编辑

上一页 1 ··· 4 5 6 7 8 9 10 11 12 下一页