DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  C++/C

上一页 1 ··· 25 26 27 28 29 30 31 32 33 ··· 47 下一页

摘要:声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法。非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出。对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerf. 阅读全文
posted @ 2013-11-21 11:01 DoubleLi 阅读(1637) 评论(0) 推荐(0) 编辑

摘要:开发时有一个工程的一个文件的断点无效,VS 2005提示说当前不会命中断点。源代码与原始版本不同,请在断点选项里设置允许源代码与原始版本不同。这个是针对单个断点进行设置。如果要对所有的断点进行设置,则要在“工具”——〉“选项”——〉“调试”——〉“要求源文件与原始版本完成匹配”去掉勾。 实际上有比这个办法更好的办法,就是将出问题的文件用notepad打开,然后另存为Unicode编码,覆盖原来的文件。 网上另外有一种办法是:通过重新格式化出问题的源文件亦可以解决,即在VS2005中选择 “编辑”——〉“高级”——〉“设置选定内容的格式”。 阅读全文
posted @ 2013-11-21 10:54 DoubleLi 阅读(854) 评论(0) 推荐(0) 编辑

摘要:以前看《Window核心编程》,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解。近日接触了ATL的一个很好的字符串的转换宏:A2W和W2A。用法很简单,A2W的用法:[cpp]view plaincopy #includeDoSomething(LPWSTRstr);//函数声明USES_CONVERSION;DoSomething(A2W("SomeString"));W2A的用法:[cpp]view plaincopy #includeDoSomething( 阅读全文
posted @ 2013-11-21 10:53 DoubleLi 阅读(929) 评论(0) 推荐(0) 编辑

摘要:转载地址:http://www.cnblogs.com/chio/archive/2008/08/05/1261296.html目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称"静态库"),另一种为动态连接库(DLL,以下简称"动态库")的导入库(Import Libary,以下简称"导入库")。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态 阅读全文
posted @ 2013-11-21 10:49 DoubleLi 阅读(444) 评论(0) 推荐(0) 编辑

摘要:DLL的动态链接有两种方法。一种是加载时动态链接(Load_time dynamic linking)。Windows搜索要装入的DLL时,按以下顺序:应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录→PATH环境变量指定的路径。 前天看到这几句,突然设计出一道自认绝妙的笔试题:"如果采用加载时动态链接的方式,Windows搜索要装入的DLL采用怎样的顺序?"这个是基础题,估计你很容易答出(答案就是上面的)。呵呵,我还有后着呢:"你是如何证明Windows搜索要装入的DLL遵循这样的顺序呢,说出你的证明步骤" 你可以思考一 阅读全文
posted @ 2013-11-21 10:47 DoubleLi 阅读(802) 评论(0) 推荐(0) 编辑

摘要:根据我的实践,在Windows平台下设计并实现一个C++插件系统,需要解决几个关键技术问题。下面我谈谈需要解决的几个关键技术问题以及我想到的简单的解决思路。由于我主要专注于Windows平台C++程序的开发,这里假设以VS为编译环境,MFC界面库来说明。1. 主程序和插件的关系问题 插件架构一般可以用下面的图来表示:(注:此图来自李先静的博客文章:http://blog.csdn.net/absurd/archive/2006/07/04/877063.aspx,略有修改,特向李大侠表示感谢) 一般来说:应用程序框架所完成的功能应为一个软件系统的核心和基础,这些基本功能主要包括一些核心功能,即 阅读全文
posted @ 2013-11-21 10:17 DoubleLi 阅读(1733) 评论(0) 推荐(0) 编辑

摘要:C++编写的桌面软件中传统的App+Dll的架构已经显现出的模块之间的强耦合、维护性差、升级不方便等诸多弊端,为此我进行了一些思考,有兴趣的朋友请看我以前的一个思考片断:《Windows平台下C++插件系统实现的几个关键技术问题及其解决思路》,今天则具体介绍的我的一个具体设计和实现。 我的目标是要去除功能模块的相互依赖,在模块调用必须采用动态加载的办法,但同时各个模块可以进行自由地进行通讯。我的设想大致是这样的:在动态加载各个模块后调用统一接口后生成插件对象,在某个插件对象都能通过标识符找到其它的插件对象,通过统一的接口将数据传给它们。系统架构图如下:系统流程图如下: 大家可以看到,要构建这样 阅读全文
posted @ 2013-11-21 10:16 DoubleLi 阅读(879) 评论(0) 推荐(0) 编辑

摘要:一.《Google C++ 编程风格指南》里的观点 公司在推行编码规范,领导提议基本上使用《Google C++ 编程风格指南》。其中《Google C++ 编程风格指南》对于头文件的包含顺序是这样的:Names and Order of Includeslink ▽Use standard order for readability and to avoid hidden dependencies:C library, C++ library, other libraries' .h, your project's .h.All of a project's head 阅读全文
posted @ 2013-11-21 10:12 DoubleLi 阅读(839) 评论(0) 推荐(0) 编辑

摘要:在VC中访问Oracle,可以使用ADO或ODBC,如果你比较强大,也可以直接使用OCI API,但我个人认为OTL是最佳选择,它是一套数据库访问C++模板库,全部代码都在otlv4.h头文件中,通过OTL不但可以访问Oracle数据库(使用OCI API),还可以访问DB2,或者使用ODBC连接字符串访问其他数据库。 otl的源码只有一个头文件——otlv4.h。下面以一个例子来说明如何使用otl。[cpp]view plaincopy #defineOTL_ORA10G#includevoidCAboutDlg::OnBnClickedOk(){//TODO:在此添加控件通知处理程序代码o 阅读全文
posted @ 2013-11-21 10:10 DoubleLi 阅读(1415) 评论(0) 推荐(0) 编辑

摘要:C++中防止头文件被多次include 的常见方式有:1) 用#ifndef ... #define ... #endif 宏#ifndef __MYHEADER_H__#define __MYHEADER_H__// Here is my class ...#endif2) 用 #pragma once#pragma once// Here is my class ...建议使用 #pragma once ,原因:1) 代码简洁,维护性比较好。 #pragma once 显然比 #ifndef ... 要简短许多,而且避免了__MYHEADER_H__ 重定义 或者 #endif 包含范围错 阅读全文
posted @ 2013-11-21 10:03 DoubleLi 阅读(372) 评论(0) 推荐(0) 编辑

摘要:开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁。 这篇MSDN文章《Best Practices for Creating DLLs》深入讨论了开发DLL的时候应该注意哪些事项, 非常推荐。简单来说,系统在装载DLL 的时候会自动产生一个Loader Lock, 避免多个DLL同时被装载。 LoaderLock从API函数LoadLibrary调用的开始就自动加锁, 直到DllMain 退出为止。 常见到一些开发者喜欢在DllMain 里面写大量的初始化代码(比如 CoInitializeEx, LoadLibraryEx,C 阅读全文
posted @ 2013-11-21 10:02 DoubleLi 阅读(432) 评论(0) 推荐(0) 编辑

摘要:在一些情况下(比如屏幕软键盘或者输入法程序),自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题。AttachThreadInput把一个线程(idAttach)的输入消息连接到另外线程(idAttachTo)。函数定义:BOOL WINAPI AttachThreadInput( __in DWORD idAttach, __in DWORD idAttachTo, __in BOOL fAttach);用法示例:AttachThreadInput( ::GetWindowThreadProcessId 阅读全文
posted @ 2013-11-21 09:58 DoubleLi 阅读(453) 评论(0) 推荐(0) 编辑

摘要:例子代码就在我的博客中,包括六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具工程,和此小工具的所有运行时库、资源和执行程序。代码的压缩包位置是http://www.blogjava.net/Files/wxb_nudt/socket_src.rar。1前言在一些常用的编程技术中,Socket网络编程可以说是最简单的一种。而且Socket编程需要的基础知识很少,适合初学者学习网络编程。目前支持网络传输的技术、语言和工具繁多,但是大部分都是基于Socket开发的,虽说这些“高级”的网络技术屏蔽了大部分底层实现,号称能极大程度的简化开发,而事实上如果你没有一点Socket基础 阅读全文
posted @ 2013-11-21 09:46 DoubleLi 阅读(1715) 评论(0) 推荐(0) 编辑

摘要:关于结构体和C++类的内存地址问题今天终于有时间写点东西了~ 太爽了 *_*很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。类分为成员变量和成员函数,我们先来讨论成员变量。一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)我们来以一段代码说明问题://类的定义class K{public:K(){k = 12;}~K(){}int k;};//类的使用//...K kTem 阅读全文
posted @ 2013-11-21 09:11 DoubleLi 阅读(1487) 评论(0) 推荐(0) 编辑

摘要:动态内存使用最多的是在C++应用程序的代码中。有过编程经验的程序员虽然都知道new操作符的使用一定要与delete匹配,在某些场合仍然可能有内存溢出。当异常被掷出时,程序的正常控制流程被改变,因此导致潜在的内存溢出。例如,void g() //可能掷出{ if (some_condition == false) throw X();}void func() { string * pstr = new string; g(); //如果 g 掷出一个异常,内存溢出 delete pstr; //如果 g 掷出一个异常,则此行为不能达到的代码行。}int main... 阅读全文
posted @ 2013-11-21 09:10 DoubleLi 阅读(676) 评论(0) 推荐(0) 编辑

摘要:在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为: #pragma Para。其中Para 为参数,下面来看一些常用的参数1.message 参数 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message(“消息文本”) 当编译器遇到这... 阅读全文
posted @ 2013-11-21 09:08 DoubleLi 阅读(395) 评论(0) 推荐(0) 编辑

摘要:下面的代码是介绍如何在windows平台发消息到非UI线程.主要是'PeekMessage||GetMessage'这两个API的应用.当他们被调用的时候,如果当前线程还没有消息循环,就会创建一个.利用这个特性比自己手动的去创建一个消息循环要方便得多.发消息主要是使用线程PostThreadMessage#include#include#include"cassert"#include"windows.h"#include"process.h"enum{MSG_TEST=WM_USER+100,MSG_EXIT};un 阅读全文
posted @ 2013-11-21 09:05 DoubleLi 阅读(469) 评论(0) 推荐(0) 编辑

摘要:.\\与API函数GetModuleFileName获取应用程序目录有何不一样? 采用.\\也能获得应用程序目录,采用GetModuleFileName也能获得,二者有何不同? 一样!一个是相对路径,一个是绝对路径 .\\是的到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。GetModuleFileName()得到模块的完整路径名,例如,你载入c:\windows\system32\a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。 .\\一般用在包含头文件的语句中。另一个 阅读全文
posted @ 2013-11-21 09:03 DoubleLi 阅读(3901) 评论(0) 推荐(0) 编辑

摘要:一.深入浅出Win32多线程程序设计之基本概念[转]引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。 理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。 因此, 阅读全文
posted @ 2013-11-21 09:02 DoubleLi 阅读(997) 评论(0) 推荐(0) 编辑

摘要:下载源代码八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。MFC提供了多种同步对象,下面我们只介绍最常用的四种.. 阅读全文
posted @ 2013-11-21 09:01 DoubleLi 阅读(452) 评论(0) 推荐(0) 编辑

上一页 1 ··· 25 26 27 28 29 30 31 32 33 ··· 47 下一页