Sunday, May 6, 2012

Vc++

C++0x — Range-based for-loop (foreach) 试用心得

 
 

源文档 <http://watashi.ws/blog/1990/c0x-ranged-based-for-loop/>

 
 

 
 

 
 

 
 

 
 

【高效程序员系列】2、别做机器人——让工作自动化

 
 

源文档 <http://www.cnblogs.com/conexpress/archive/2011/08/03/2126716.html>

 
 

 
 

 
 

mycp c++web中间件

2012年4月10日

9:44

 
 

C++ Web应用服务器中间件 MYCP

 
 

源文档 <http://www.oschina.net/p/mycp>

 
 

 
 

node.js的c++移植版本Node.native

2012年4月10日

9:32

 
 

Node.js的C++移植版本 Node.native

 
 

源文档 <http://www.oschina.net/p/node-native>

 
 

c++的web应用服务器

2012年4月10日

9:32

 
 

C++的Web应用服务器 Tntnet

 
 

源文档 <http://www.oschina.net/p/tntnet?from=20120407>

 
 

boost

2011年10月12日

9:18

 
 

1.检出代码:

d:\work\svn\svn co http://svn.boost.org/svn/boost/trunk/boost boost

 
 

2.

 
 

scanf

2011年7月25日

16:54

 
 

%[characters]

 
 

 
 

 
 

一个字符串包含任意characters列表中的字符.

 
 

一个减号可以用来表示范围。例如%[a-d]表示包含任意a、b、c的字符串(前闭后开的区间).

 
 

一个 ^ 符号表示否定、去除的意思。例如%[^abc]表示除了a,b,c的任意字符.

 
 

这些符号可以组合使用.

 
 

 
 

%{format%}

 
 

 
 

 
 

尽可能多地重复匹配这个格式,匹配结果是一个数组的数组。例如%{%d%} 匹配0个或多个整数.

 
 

manifest

2011年7月14日

9:39

资料:http://blog.csdn.net/wengyb/article/details/4335138

VS2008编译的程序在某些机器上运行提示"由于应用程序配置不正确,应用程序未能启动"的问题

 
 

源文档 <http://tangxingqt.blog.163.com/blog/static/2771087220098214123904/>

 
 

_BIND_TO_CURRENT_VCLIBS_VERSION and other strange things

 
 

源文档 <http://connect.microsoft.com/VisualStudio/feedback/details/339587/bind-to-current-vclibs-version-and-other-strange-things>

 
 

 
 

 
 

D:\work\svn\168soft\168ElfDll\168TestUnit\Release\168TestUnit.exe.intermediate.manifest

<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

 
 

E:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\Microsoft.VC90.CRT.manifest 我同SVN一样

<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.6161" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

 
 

D:\work\svn\168soft\168ElfDll\MTXToolkit\Release\MTXToolkit.dll.intermediate.manifest

<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.6161' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

 
 

default file encode

2011年7月3日

22:37

 
 

VS2008中自定义C++工程模板与修改新建文件默认编码的办法

 
 

源文档 <http://apps.hi.baidu.com/share/detail/22471089>

 
 

new

2011年6月20日

15:02

 
 

深入C++的new

 
 

源文档 <http://www.builder.com.cn/2008/0104/696370.shtml>

 
 

 
 

socket

2011年6月13日

20:22

 
 

LINUX下使用ICE编程入门--第一章

 
 

源文档 <http://www.alisdn.com/wordpress/?p=699>

 
 

套接口低潮限度

 
 

源文档 <http://memorymyann.iteye.com/blog/638048>

 
 

 
 

 
 

Printf

2011年6月3日

14:37

 
 

%lld : 64位

%llu:64位无符号

%s 字符串

%S 转码字符串

%c 字符

%d 32位

%.8x 补足8位十六进制

 
 

 
 

 
 


Collapse All


Code: All

Run-Time Library Reference

printf Type Field Characters

See Also
Send Feedback

The type character is the only required format field; it appears after any optional format fields. The type character determines whether the associated argument is interpreted as a character, string, or number. The types C, n, p, and S, and the behavior of c and s with printf functions, are Microsoft extensions and are not ANSI compatible.

Character

Type

Output format

c

int or wint_t

When used with printf functions, specifies a single-byte character; when used with wprintf functions, specifies a wide character.

C

int or wint_t

When used with printf functions, specifies a wide character; when used with wprintf functions, specifies a single-byte character.

d

int

Signed decimal integer.

i

int

Signed decimal integer.

o

int

Unsigned octal integer.

u

int

Unsigned decimal integer.

x

int

Unsigned hexadecimal integer, using "abcdef."

X

int

Unsigned hexadecimal integer, using "ABCDEF."

e

double

Signed value having the form [ – ]d.dddd
e [sign]dd[d] where d is a single decimal digit, dddd is one or more decimal digits, dd[d] is two or three decimal digits depending on the output format and size of the exponent, and sign is + or –.

E

double

Identical to the e format except that E rather than e introduces the exponent.

f

double

Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.

g

double

Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.

G

double

Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).

a

double

Signed hexadecimal double precision floating point value having the form []0xh.hhhh
dd, where h.hhhh are the hex digits (using lower case letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.

A

double

Signed hexadecimal double precision floating point value having the form []0Xh.hhhh
dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.

n

Pointer to integer

Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument. See Security Note below.

p

Pointer to void

Prints the argument as an address in hexadecimal digits.

s

String

When used with printf functions, specifies a single-byte–character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.

S

String

When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte–character string. Characters are printed up to the first null character or until the precision value is reached.

Note If the argument corresponding to %s or %S is a null pointer, "(null)" will be printed.

Note In all exponential formats, the default number of digits of exponent to display is three. Using the _set_output_format function, the number of digits displayed may be set to two, expanding to three if demanded by the size of exponent.

Security Note The %n format is inherently insecure and is disabled by default; if %n is encountered in a format string, the invalid parameter handler is invoked as described in Parameter Validation. To enable %n support, see _set_printf_count_output.


See Also

Concepts

printf, _printf_l, wprintf, _wprintf_l

Send feedback on this topic to Microsoft.

 
 

 
 

Template

2011年6月3日

14:35

 
 

跨vc版本时,不可以使用template做参数.

 
 

查询系统语言

2011年5月7日

20:15

 
 

1. 

LANGID   langeID=GetSystemDefaultLangID(); 

if(langeID==0) 


AfxMessageBox( "fail "); 


else   if(langeID==0x0804)// 


AfxMessageBox( "Chinese "); 


2. 

LANGID   langID=GetUserDefaultLangID(); 

if(langID==0){ 

AfxMessageBox( "Fail "); 

}else   if   (langID==0x0804) 


AfxMessageBox( "Chinese "); 


3. 

char   chLange[255]= " "; 

int   nResult=GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SLANGUAGE,chLange,sizeof(chLange)); 

AfxMessageBox(chLange); 

共上述三种方法

 
 

clistctrl

2011年5月6日

15:25

 
 

== 选中整行 ==

mLstCtl.SetExtendedStyle(LVS_EX_FULLROWSELECT); // 选中整行

 
 

 
 

 
 

== 显示网格线 ==

m_ctlList.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT)

 
 

 
 

== 添加行列 ==

LV_ITEM                liItem;

liItem.mask = LVIF_TEXT;

liItem.cchTextMax = 0;

 
 

CString exp,dst,desc;

// 标题

// exp = UiData->get_value(RSSREGEXP_SECTION,RSSREGEXP_FIELD_EXP,_T("exp"));

// dst = UiData->get_value(RSSREGEXP_SECTION,RSSREGEXP_FIELD_DST,_T("to"));

// desc = UiData->get_value(RSSREGEXP_SECTION,RSSREGEXP_FIELD_DESC,_T("description"));

 
 

mLstCtl.InsertColumn(0,exp,0,120);

mLstCtl.InsertColumn(1,dst,0,120);

mLstCtl.InsertColumn(2,desc,0,240);

 
 

// int cnt = RssRegexpSevice->get_reg_count(); 数据数量

for(int i=0;i<cnt;++i)

{

liItem.iItem = i;

liItem.iSubItem = 0;

 
 

// RssRegexpSevice->get_reg_content(i,exp,dst,desc); 取数据

 
 

liItem.pszText = exp.GetBuffer(0);

mLstCtl.InsertItem(&liItem);

 
 

liItem.iSubItem = 1;

liItem.pszText = dst.GetBuffer(0);

mLstCtl.SetItem(&liItem);

 
 

liItem.iSubItem = 2;

liItem.pszText = desc.GetBuffer(0);

mLstCtl.SetItem(&liItem);

}

 
 

 
 

== 取选中行 ==

POSITION pos = mLstCtl.GetFirstSelectedItemPosition();

return mLstCtl.GetNextSelectedItem(pos);

 
 

Resource leak

2011年4月13日

19:42

 
 

下面为某次浏览找到的Win32资源的分配清除文档,只简单的翻译了几个文字。

 
 

正在装载数据……


文档对防止资源泄露有很大帮助。抱歉一贴上就串了。

***********************************************************************

资源                     分配函数                                   清除函数              需要手动清除?

======================================================================

 
 

Accelerators       LoadAccelerators                         N/A                  No

 
 

Atoms               GlobalAddAtom                        GlobalFreeAtom       Yes

 
 

Bitmaps                CreateBitmap                      DeleteObject             Yes *

                CreateBitmapIndirect                   DeleteObject             Yes *

                CreateCompatibleBitmap           DeleteObject                Yes *

                CreateDIBitmap                   DeleteObject       Yes *

                CreateDiscardableBitmap               DeleteObject                Yes *

                LoadBitmap                       DeleteObject                Yes *

 
 

Brushes         CreateBrushIndirect                   DeleteObject         Yes

                CreateDIBPatternBrush            DeleteObject         Yes

                CreateHatchBrush                 DeleteObject         Yes

                CreatePatternBrush                   DeleteObject         Yes

                CreateSolidBrush                 DeleteObject         Yes

 
 

Carets                 CreateCaret                      DestroyCaret         No  #

 
 

Clipboard              OpenClipboard                    CloseClipboard       Yes

 
 

Comms Ports     OpenComm                  CloseComm          Yes

 
 

Cursor                 CreateCursor                     DestroyCursor           Yes

                LoadCursor                       N/A                 No

 
 

DC             CreateDC                         DeleteDC             Yes

                CreateCompatibleDC               DeleteDC             Yes @

                GetDC                            ReleaseDC            Yes

                GetWindowDC                      ReleaseDC            Yes

                BeginPaint                       EndPaint             Yes

 
 

Dialog Box             CreateDialog                     DestroyWindow        No

                CreateDialogIndirect                  DestroyWindow        No

                CreateDialogIndirectParam             DestroyWindow        No

                CreateDialogParam                DestroyWindow        No

 
 

File                   OpenFile                         _lclose                     No

 
 

Fonts                  CreateFont                       DeleteObject         Yes

                CreateFontIndirect                   DeleteObject                Yes

                AddFontResource                  RemoveFontResource         Yes

 
 

GDI Stock Obj          GetStockObject                   N/A                  No  &

 
 

Hook                  SetWindowsHook                   UnhookWindowsHook    Yes

 
 

IC              CreateIC                         DeleteDC             Yes

 
 

Icon            CreateIcon                       DestroyIcon          Yes

                LoadIcon                         N/A                  No

 
 

Library                LoadLibrary                      FreeLibrary          Yes

 
 

Memory         AllocDStoCSAlias                 FreeSelector         Yes

                AllocSelector                           FreeSelector         Yes

                GlobalAlloc                      GlobalFree           No

                GlobalDOSAlloc                   GlobalDOSFr          No

                GlobalFix                        GlobalUnfix          No

                GlobalLock                       GlobalUnlock         No

                GlobalPageLock                   GlobalPageUnlock     No

                GlobalRealloc                    GlobalFree           No

                GlobalWire                       GlobalUnwire         No

                LocalAlloc                       LocalFree            No

                LocalLock                        LocalUnlock          No

                LocalRealloc                     LocalFree            No

 
 

Menu           CreateMenu                       DestroyMenu          No  %

                CreatePopupMenu                  DestroyMenu          No  %

                LoadMenu                         DestroyMenu          No  %

                LoadMenuIndirect                 DestroyMenu          No  %

                GetSystemMenu                    N/A                  No

 
 

MetaFile               CreateMetaFile                   DeleteMetaFile       Yes

 
 

Palette                CreatePalette                           DeleteObject         Yes

 
 

Pen             CreatePen                        DeleteObject         Yes

                CreatePenIndirect                   DeleteObject         Yes

 
 

Regions         CreateEllipticRgn                    DeleteObject         Yes

                CreateEllipticRgnIndirect               DeleteObject         Yes

                CreatePolygonRgn                 DeleteObject         Yes

                CreatePolyPolygonRgn             DeleteObject         Yes

                CreateRectRgn                    DeleteObject         Yes

                CreateRectRgnIndirect               DeleteObject         Yes

                CreateRoundRectRgn               DeleteObject         Yes

 
 

Resource               AllocResource                    FreeResource         No

                FindResource                     N/A                  No

                LoadResource                     FreeResource         No

                LockResource                     UnlockResource       No

 
 

Sound                 OpenSound                        CloseSound           Yes

 
 

String                 LoadString                       N/A                  No

 
 

Thunk                 MakeProcInstance                 FreeProcInstance     No

 
 

Timer           SetTimer                         KillTimer            No

 
 

Window         CreateWindow                     DestroyWindow        No

                CreateWindowEx                   DestroyWindow        No

 
 

 
 

Notes:

------

*   位图资源在释放的时候必须从选中它的DC中脱离。

%   当菜单失去焦点和窗口不再关联或者应用程序结束的时候占用资源必须被释放。

@   DC被释放前必须和它关联(选中)的位图取消联系

#   如果脱字符指定了位图,位图必须被释放

&   对DeleteObject的调用不会销毁常规的StockObject(系统内定资源)

 
 

源文档 <http://www.99inf.net/SoftwareDev/VC/26826.htm>

 
 

 
 

Memory leak

2011年4月13日

19:36

 
 

_CrtSetBreakAlloc(579);

 
 

检测内存泄漏的主要工具是调试器和 CRT 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句:

 
 

#define CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

注意 #include 语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作。

 
 

通 过包括 crtdbg.h,将 malloc 和 free 函数映射到其"Debug"版本_malloc_dbg 和_free_dbg,这些函数将跟踪内存分配和释放。此映射只在调试版本(在其中定义了 _DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。

 
 

#define 语句将 CRT 堆函数的基版本映射到对应的"Debug"版本。并非绝对需要该语句,但如果没有该语句,内存泄漏转储包含的有用信息将较少。

 
 

在添加了上面所示语句之后,可以通过在程序中包括以下语句来转储内存泄漏信息:

_CrtDumpMemoryLeaks();

当在调试器下运行程序时,_CrtDumpMemoryLeaks 将在"输出"窗口中显示内存泄漏信息。内存泄漏信息如下所示:

Detected memory leaks!

 
 

Dumping objects ->

 
 

C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.

 
 

Data: <> CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

如果不使用 #define _CRTDBG_MAP_ALLOC 语句,内存泄漏转储如下所示: Detected memory leaks!

Dumping objects ->

{18} normal block at 0x00780E80, 64 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

未定义 _CRTDBG_MAP_ALLOC 时,所显示的会是:

 
 

内存分配编号(在大括号内)。

块类型(普通、客户端或 CRT)。

十六进制形式的内存位置。

以字节为单位的块大小。

前 16 字节的内容(亦为十六进制)。

定义了 _CRTDBG_MAP_ALLOC 时,还会显示在其中分配泄漏的内存的文件。文件名后括号中的数字(本示例中为 20)是该文件内的行号。

 
 

转到源文件中分配内存的行

 
 

在"输出"窗口中双击包含文件名和行号的行。

-或-

 
 

在"输出"窗口中选择包含文件名和行号的行,然后按 F4 键。

 
 

_CrtSetDbgFlag

如果程序总在同一位置退出,则调用 _CrtDumpMemoryLeaks 足够方便,但如果程序可以从多个位置退出该怎么办呢?不要在每个可能的出口放置一个对 _CrtDumpMemoryLeaks 的调用,可以在程序开始包括以下调用:

 
 

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF 两个位域,如上所示。

 
 

说明

在VC++6.0的环境下,不再需要额外的添加

 
 

#define CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

只需要按F5,在调试状态下运行,程序退出后在"输出窗口"可以看到有无内存泄露。如果出现

 
 

Detected memory leaks!

Dumping objects ->

就有内存泄露。

 
 

确定内存泄露的地方

根据内存泄露的报告,有两种消除的方法:

 
 

第一种比较简单,就是已经把内存泄露映射到源文件的,可以直接在"输出"窗口中双击包含文件名和行号的行。例如

 
 

Detected memory leaks!

Dumping objects ->

C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20)

就是源文件名称和行号。

 
 

第二种比较麻烦,就是不能映射到源文件的,只有内存分配块号。

 
 

Detected memory leaks!

Dumping objects ->

{18} normal block at 0x00780E80, 64 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

这种情况我采用一种"试探法"。由于内存分配的块号不是固定不变的,而是每次运行都是变化的,所以跟踪起来很麻烦。但是我发现虽然内存分配的块号是变化的,但是变化的块号却总是那几个,也就是说多运行几次,内存分配的块号很可能会重复。因此这就是"试探法"的基础。

 
 

先在调试状态下运行几次程序,观察内存分配的块号是哪几个值;

选择出现次数最多的块号来设断点,在代码中设置内存分配断点: 添加如下一行(对于第 18 个内存分配): _crtBreakAlloc = 18;

或者,可以使用具有同样效果的 _CrtSetBreakAlloc 函数: _CrtSetBreakAlloc(18);

 
 

在调试状态下运行序,在断点停下时,打开"调用堆栈"窗口,找到对应的源代码处;

 
 

退出程序,观察"输出窗口"的内存泄露报告,看实际内存分配的块号是不是和预设值相同,如果相同,就找到了;如果不同,就重复步骤3,直到相同。

 
 

最后就是根据具体情况,在适当的位置释放所分配的内存。

 
 

源文档 <http://topic.csdn.net/u/20100127/11/905b389c-4f9d-4bf1-9744-bd9a7051fa98.html>

 
 

Visual C++ 的 C 运行时刻函数库标识模板

0xCD    已经分配的数据(alloCated Data)

0xDD    已经释放的数据(Deleted Data)

0xFD    被保护的数据(Fence Data)

 
 

Visual C++ 的 C 运行时刻函数库内存块类型标识符

_NORMAL_BLOCK    由程序直接分配的内存

_CLIENT_BLOCK    由程序直接分配的内存,可以通过内存调试函数对其拥有特殊控制权

_CRT_BLOCK      由运行时刻函数库内部分配的内存

_FREE_BLOCK      已经被释放,但是跟踪仍然被保留下来的内存,这在用户选择了调试堆的选项 _CRTDBG_DELAY_FREE_MEM_DF 以后会出现

_IGNORE_BLOCK    当使用 _CrtDbgFlag 关闭内存调试操作以后分配的内存

 
 

Visual C++ 的 C 运行时刻函数库提供的帮助调试内存错误的函数

_CrtCheckMemory  检查每一个内存块的内部数据结构和守护(guard)字节,以测试其完整性。

_CrtIsValidHeapPointer 检验指定指针是否存在于本地堆中

_CrtIsValidPointer 检验给定内存范围对读写操作是否合法

_CrtIsMemoryBlock 检验给定内存范围是否位于本地堆当中,是否拥有例如 _NORMAL_BLOCK 这样的有效内存块类型标识符(该函数还可以被用以获得分配数目以及进行内存分配的源文件名和行号)

 
 

用于调试内存泄露的 Visual C++ 的 C 运行时刻函数库中的函数

_CrtSetBreakAlloc  在给定的分配数目上分配断点,每一块被分配的内存都被指派一个连续的分配号。(查找特定的内存泄露十分有用)

_CrtDumpMemoryLeaks 判断内存泄露是否发生。如果发生则将本地堆中所有当前分配的内存按照用户可以阅读的方式进行内存映象转储。(在程序结束的时候检测内存泄露十分有用)

_CrtMemCheckPoint  在 _CrtMemState 结构中产生一个本地堆的当前状态的快照

_CrtMemDifference  比较两个堆中的断点,将不同之处保存在 _CrtMemState 结构中。如果不同则返真。(检测特殊区域代码的内存泄露十分有用)

_CrtMemDumpAllObjectsSince将从给定堆断点或者从程序开始分配的内存的所有信息按照用户可以阅读的方式进行内存映象转储

_CrtMemDumpStatistics 将信息按照用户可以阅读的方式进行内存映象转储到一个 _CrtMemState 结构中。(对于得到被使用的动态内存的全面观察信息来说十分有用)

 
 

用于一般内存调试的 Visual C++ 的 C 运行时刻函数库中的函数

_CrtSetDbgFlag      控制内存调试函数的行为

_CrtSetAllocHook    加裁在内存分配过程中的钩子函数。(对于检测内存使用状况或者模拟内存不足情况十分有用)

_CrtSetReportHook  加裁进行定制报告处理的函数。

_CrtSetDumpClient  加裁对用户进行内存映象转储的函数。

_CrtDoForAllClientObject 对于所有作为用户块进行分配的数据,调用指定的函数

 
 

ATL 内存调试

在 #include <AtlCom.h> 之前,定义控制预处理的常量 _ATL_DEBUG_INTERFACES,这样就可以对接口资源泄露进行跟踪(跟踪 AddRef 和 Release)

INTERFACE LEAK: RefCount = 7, MaxRefCount = 10, {Allocation = 42}

CMyComClass - Leak

然后在服务器初始化的时候对 CComModule 对象的 m_nIndexBreakAt 成员变量进行设置

#define _ATL_DEBUG_INTERFACES

 
 

BOOL WINAPI DllMain(...)

{

    if (dwReason == DLL_PROCESS_ATTACH) {

        ...

        _Module.m_nIndexBreakAt = 42; // Set breakpoint to find interface leak

    }

    ...

}

 
 

使用调试堆

必须使用程序的调试版本,连接的是 C 运行时刻函数库的调试版本,必须定义 _DEBUG,这样调试堆版本的 new 和 delete 才会被调用。

调试堆选项

_CRTDBG_ALLOC_MEME_DF,启动堆分配检查

_CRTDBG_DELAY_FREE_MEM_DF,阻止内存被真正释放

_CRTDBG_CHECK_ALWAYS_DF,每次内存分配和释放都调用 _CrtCheckMemory

_CRTDBG_CHECK_CRT_DF,一般不使用

_CRTDBG_LEAK_CHECK_DF,在程序结束时调用 _CrtDumpMemoryLeaks

推荐总是使用 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF,仅仅在调试内存错误时才用 _CRTDBG_CHECK_ALWAYS_DF 和 _CRTDBG_DELAY_FREE_MEM_DF,

 
 

显示内存泄露

#define _CRTDBG_MAP_ALLOC 在所有头文件之前,

在 cpp 文件中,加上

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 
 

查看 Windows 内存地址

Windows 进程一般放在 0x00400000 的地址,0x00400000 是所有版本的 Windows 能使用的最低地址,进程实例句柄的值总是和它的基地址相同,

所有未被初始化的自动变量都会设上 0xCCCCCCCC,

 
 

Windows 2000 的虚拟地址空间的使用

0x00030000 ~ 0x0012FFFF 线程栈

0x00130000 ~ 0x003FFFFF 堆(有时堆位于此处)

0x00400000 ~ 0x005FFFFF 可执行代码

0x00600000 ~ 0x0FFFFFFF 堆(有时堆位于此处)

0x10000000 ~ 0x5FFFFFFF App Dlls, Msvcrt.dll, Mfc42.dll

0x77000000 ~ 0xFFFFFFFF Advapi32.dll,...

 
 

通过设置数据断点,在对 0xCDCDCDCD,0xCCCCCCCC,0xDDDDDDDD 等地址修改时,调试器会提醒你,写非合法数据

调试比较难的内存破坏问题时,可以试试 _CRTDBG_CHECK_ALWAYS_DF 和 _CRTDBG_DELAY_FREE_MEM_DF,

 
 

当类需要析构函数或者复制构造函数或者赋值操作符时,它同时需要这三个,否则可能导致内存破坏和泄露,

 
 

用分配号定位内存泄露

_CrtSetBreakAlloc(27)

Watch 窗口 {,,msvcrtd.dll}_CrtSetBreakAlloc(27)

 
 

使用内存检查点

void LeakyFunction()

{

    _CrtMemState oldState, newState, stateDiff;

    _CrtMemCheckPoint(&oldState);

    {

    ...

    }

    _CrtMemCheckPoint(&newState);

    if (_CrtMemeDifference(&stateDiff, &oldState, &newState)) {

        _CrtMemDumpStatistics(&stateDiff);

        _CrtMemDumpAllObjectsSince(&oldState);

    }

}

使用 _CRTDBG_DELAY_FREE_MEM_DF 调试堆选项防止 _CrtMemDumpAllObjectsSince 导出错误的结果

 
 

在删除图形设备接口对象前,一定确定它们没有被任何有效的设备上下文选中

在 Windows 2000 里发现资源泄露是最简单方法是运行性能监视工具,监视程序的私有空间和句柄数随时间的变化,如果私有空间或者句柄数据持续增长,就出现了内存泄露

函数的返回值是通过 EAX 传递的,

 
 

源文档 <http://topic.csdn.net/u/20100127/11/905b389c-4f9d-4bf1-9744-bd9a7051fa98.html>

 
 

 
 

hotkey

2011年3月26日

16:17

// int mhotkeyTaskId;

// CHotKeyCtrl mHotkeyStartup;

// win32 reg hotkey method

BOOL regHotkey(HWND hWnd,int id,UINT fsModifiers,UINT vk)

{

//热键控件与registerhotkey不同!转化下

if ((fsModifiers & HOTKEYF_ALT) && !(fsModifiers & HOTKEYF_SHIFT) )//Shift->ALt

{

fsModifiers&=~HOTKEYF_ALT;

fsModifiers|=MOD_ALT;

 
 

// fsModifiers|=HOTKEYF_ALT;

// fsModifiers&=~MOD_ALT;

}

else if (!(fsModifiers & HOTKEYF_ALT) && (fsModifiers & HOTKEYF_SHIFT))//Alt->Shift

{

fsModifiers&=~HOTKEYF_SHIFT;

fsModifiers|=MOD_SHIFT;

 
 

// fsModifiers|=HOTKEYF_SHIFT;

// fsModifiers&=~MOD_SHIFT;

}

 
 

return ::RegisterHotKey(hWnd,id,fsModifiers,vk);

}

ON_WM_HOTKEY()

 
 

// response hotkey

void ChotkeyManDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

if(nHotKeyId == mhotkeyTaskId)

{


}

CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);

}

 
 

// class method,注册快捷键

void ChotkeyManDlg::regHotkey(void)

{

WORD fsModifiers;

WORD vk;

BOOL f;

mHotkeyStartup.GetHotKey(vk,fsModifiers);

f = ::regHotkey(m_hWnd,mhotkeyTaskId,fsModifiers,vk);

if(f)

{

mresult.SetWindowTextW(_T("result:ok"));

}

else

{

mresult.SetWindowTextW(_T("result:failed"));

}

}

 
 

Hide main window

2011年3月26日

16:24

 
 

// in OnInitDialog

CRect rt;

SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0);

rt.top = rt.bottom - 100;

MoveWindow(&rt,TRUE);

 
 

Query taskbar hwnd

2011年3月26日

16:36

 
 

typedef HWND (WINAPI *PROCGETTASKMANWND)();

static PROCGETTASKMANWND GetTaskmanWindow;

HWND TaskBarWnd = 0;

if(!GetTaskmanWindow)

{

HMODULE hUser32 = GetModuleHandle(_T("user32"));

 
 

GetTaskmanWindow = (PROCGETTASKMANWND)GetProcAddress(hUser32,"GetTaskmanWindow");

}

if(GetTaskmanWindow)

{

TaskBarWnd = GetTaskmanWindow();

}

Win7 x64:

 
 


// 取MSTaskListWClass

HWND hTaskList = ::FindWindowExW(TaskBarWnd,0,_T("MSTaskListWClass"),0);

 
 

这个是MSTaskListWClass:


No comments: