C++0x — Range-based for-loop (foreach) 试用心得
源文档 <http://watashi.ws/blog/1990/c0x-ranged-based-for-loop/>
源文档 <http://www.cnblogs.com/conexpress/archive/2011/08/03/2126716.html>
mycp c++web中间件
2012年4月10日
9:44
源文档 <http://www.oschina.net/p/mycp>
node.js的c++移植版本Node.native
2012年4月10日
9:32
源文档 <http://www.oschina.net/p/node-native>
c++的web应用服务器
2012年4月10日
9:32
源文档 <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
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 |
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 | 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 |
A | double | Signed hexadecimal double precision floating point value having the form [−]0Xh.hhhh |
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:
Post a Comment