自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

转载 Com 组件的装载和卸载

<br />进程内组件的装载: <br /><br /><br /><br />客户程序调用COM 库的 CoCreateInstance 或 CoGetClassObject 函数创建 COM 对象,在 CoGetClassObject 函数中,COM 库根据系统注册表中的信息,找到类标识符 CLSID 对应的组件程序(DLL 文件)的全路径,然后调用 LoadLibrary(实际上是 CoLoadLibrary)函数,并调用组件程序的 DllGetClassObject 引出函数。DllGetClass

2010-08-25 17:26:00 5446 1

原创 给一个应用程序插入dll的三种方式

1.使用注册表  这种方式依赖着User32.dll  <br />    当应用程序加载User32.dll,User32.dll会接收到一个DLL_PROCESS_ATTACH通知,当这个通知被处理时,User32.dll便检索注册表中保存的这个关键字的值,并且为字符串中指定的每个dll调用LoadLibrary函数。    <br />    这种方法优点是比较简单,缺点是几乎每个进程都会加载User32.dll,所以几乎每一个进程都会加载这些dll,这将影响进程的特性和健壮性。<br /><br /

2010-07-27 10:02:00 1496 2

转载 VC剪切板

<br />本文主要介绍了VC++/MFC中如下内容的剪贴板操作:<br />1、文本内容的操作<br />2、WMF数据的操作<br />3、位图的操作<br />4、设置使用自定义格式<br />5、感知剪贴板内容的改变<br />6、自动将数据粘贴到另一应用程序窗口 <br />一、文本内容的操作<br />下面的代码示范了如何将文本内容复制到剪贴板(Unicode编码的先转化为ASCII):<br />CString source;<br />//文本内容保存在source变量中<br />if(

2010-07-19 17:03:00 3281

原创 VS2005错误:error PRJ0050: 未能注册输出。请确保您有修改注册表的相应权限

<br />工程设置的问题,VS2005建的ATL工程中默认的设置是:<br />ALT的使用:动态链接到 ATL<br />配置属性->链接器->常规->注册输出: 是<br />改为:<br />ALT的使用:静态链接到 ATL<br />配置属性->链接器->常规->注册输出: 否

2010-07-18 17:25:00 2353

转载 再谈客户区对话框拖动操作

<br />当初实现拖动的基本思路是改写 OnNcHitTest 例程,让鼠标在客户区中的点击始终返回 HTCAPTION 而不是 HTCLIENT,从而诱使 <br />   Windows 实现拖动操作。没想到这样做使上下文菜单的操作出现了混乱,原因是如果强制 OnNcHitTest 在客户区返回 HTCAPTION,Windows 不会发送 WM_CONTEXTMENU <br />   消息。有一个解决是调用 GetKeyState 函数,在返回 HTCAPTION <br />   之前检查鼠标右

2010-07-06 16:13:00 752

转载 使用_CRTDBG_LEAK_CHECK_DF检查VC程序的内存泄漏

我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏。例如:class CMyApp : public CWinApp{public:BOOL InitApplication(){int* leak = new int[10];return TRUE;}};产生的内存泄漏报告大体如下:Detected memory leaks!Dumping objects ->c:worktest.cpp(186) : {52} n

2010-07-01 21:20:00 702

原创 _swab函数

<br />    此函数的作用是调换字符串中的两个相邻的字符并赋给另一个字符串<br /> <br />int main(){ char from[] = "BADCFEHGJILKNMPORQTSVUXWZ"; char to[] = "........................."; cout<<"from:"<<from<<endl; cout<<"to: "<<to<<endl; _swab(from, to, sizeof(from)); cout<<"f

2010-07-01 16:05:00 1733

转载 c++标准库以及STL

<br />1.C++标准库<br />   作为C++,其标准库包括以下内容:<br /> <br />(1)C标准函数库,基本保持了与原有C语言程序库的良好兼容,尽管有些微变化。人们总会忍不住留恋过去的美好岁月,如果你曾经是一个C程序员,对这一点一定体会颇深。或许有一点会让你觉得奇怪,那就是在C++标准库中存在两套C的函数库,一套是带有.h扩展名的(比如<stdio.h>),而另一套则没有(比如<cstdio>)。它们确实没有太大的不同。<br />(2)语言支持(language support)部分

2010-06-30 22:06:00 1361

转载 CreateIoCompletionPort和完成端口

摘自《Networking Programming for Microsoft Windows》第八章“完成端口”模型是迄今为止最为复杂的一种I/O模型。然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!从本质上说,完成端口模型要求我们创建一个Win32完成端口对象,通过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务。使用这种模型之前,首先要创建一个I/O完成端口对象,用它面向任意数量的套接字句柄,管理

2010-06-30 16:15:00 803

转载 关于句柄和伪句柄

<br />GetCurrentProcess(), DuplicateHandle()<br />Window中为什么会有句柄的概念:<br />从Visual C++的头文件来看,HANDLE被typedef为void的指针,那是指向未确定数据结构的指针:typedef void* HANDLE; <br />但是这并不说明任何问题,因为句柄远远不只是指向任意数据类型的指针。它是指向数据对象指针的指针。句柄的使用来源于早期的Windows,当时它只能在有限内存的机器中允许(因为当时内存昂贵也存储小)。为

2010-06-26 15:07:00 745

原创 GetMessage或PeekMessage提取消息算法

<br />1)如果QS_SENDMESSAGE标志被设置,GetMessage或PeekMessage调用窗口过程处理<br />2)查看登入消息队列是否有消息,若有则调用DispatchMessage让相应的窗口过程来处理<br />3)如果QS_QUIT标志被设置,GetMessage或PeekMessage返回一个WM_QUIT消息<br />4)查看虚拟输入队列,GetMessage或PeekMessage返回硬件输入消息<br />5)如果QS_PAINT标志被设置,GetMessage或Pee

2010-06-22 21:16:00 855

原创 ListCtrl设置可写

<br />// MyListCtrl.cpp : 实现文件//#include "stdafx.h"#include "EditListCtrl.h"#include "MyListCtrl.h"// CMyListCtrlIMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)CMyListCtrl::CMyListCtrl(){}CMyListCtrl::~CMyListCtrl(){}B

2010-06-19 10:54:00 1929

原创 进程通信——使用WM_COPYDATA消息通信

使用WM_COPYDATA消息通信<br />对于少量数据可以用WM_COPYDATA方便地实现通信。由于SendMessage()是阻塞的,只有接收方响应了消息,SendMessage()才能返回,否则一直阻塞。所以,对于大量数据来说,用SendMessage()就容易造成窗口假死。<br /><br />通过WM_COPYDATA消息实现进程间通信的方法<br />在Win32中,WM_COPYDATA消息主要目的是允许在进程间传递只读数据。SDK文档推荐用户使用SendMessage()函数,接收方在

2010-06-09 16:30:00 759

原创 __uuidof模拟

<br />#include <iostream>using namespace std;template <class Class>struct _UuidTraits{};#define _DEFINE_UUID(Class, uuid) /template <> /

2010-06-08 14:01:00 2144

原创 BSTR在函数中的使用

<br />右值:<br />BSTR bstr = ::SysAllocString("cert");<br />SetText(bstr);<br />SysFreeString(bstr);<br /> <br />左值:<br />BSTR bstr = NULL;<br />GetText(bstr);   //这个函数里面要用::SysAllocString来给bstr申请内存<br />SysFreeString(bstr);

2010-06-05 21:45:00 936

原创 VC中BSTR、Char*、CString和CComBSTR类型的转换

1、char*转换成CString若将char*转换成CString,除了直接赋值外,还可使用CString::format进行。例如:char* p = "This is a test"; 或CString theString = p;theString.format("%s", p);theString = p;2、CString转换成char*若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:方法一,使用强制转换。例如:CString theString( "This is

2010-06-05 21:25:00 10365

原创 链接库总结

<br />链接库分为动态链接库(dll)和静态链接库(lib)<br />当动态链接库有导出的数据,数据包括函数、类以及变量,就会生成一个.lib文件,注意这个.lib文件不是静态链接库而是导出库。<br />链接库的加载方式<br />静态链接库的加载方式只有一种#pragma comment(lib, ".lib")<br />动态链接库的加载方式有两种:<br />一种静态加载<br />先导入库#pragma comment(lib, ".lib"),这个和加载静态库一样,然后把.dll放在工程目

2010-06-03 21:13:00 861

原创 MFC的PreTranslateMessage截获Ctrl + 滚轮消息

<br />if (LOWORD(pMsg->wParam) == MK_CONTROL && pMsg->message == WM_MOUSEWHEEL) { MessageBox("OK"); }

2010-06-02 16:16:00 3229

原创 MFC中添加热键

热键分为局部和全局对于局部热键我们可以再PreTranslateMessage中进行捕获对于全局热键的步骤是这样第一:先注册 RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);//F2为热键 第二:添加消息响应头文件:afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);

2010-05-26 15:46:00 917

原创 MFC 修改窗口类名

单文档:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){ if( !CFrameWnd::PreCreateWindow(cs) )  return FALSE; // TODO: Modify the Window class or styles here by modifying //  the CREATESTRUCT cs WNDC

2010-05-24 14:13:00 1274

原创 STL的迭代器

vector是原生指针list是InputIteratordeque是random access iterator 迭代器一般分为五种:Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只从输入区间中读取数据一样,具

2010-05-22 19:35:00 693

原创 Copy和插入迭代器使用心得

Copy内部实际上是赋值,并不会给容器申请内存空间,如copy(v1.begin(), v1.end(), v2.begin());如果这个时候v2的内存占用量比v1中的元素少的话就会出现断言 插入迭代器是以赋值形式提供的但其内部调用的是push_front、push_back之类的函数来调用我们看看三种迭代器的源码     所以我们可以利用copy

2010-05-22 17:33:00 923

原创 Static控件的消息

如果Static控件设置了Notify消息的话,点击Static控件或者在Static控件上移动的话,消息就是Static控件自己发送的,这时候也存在消息的反射。如果Static控件没有设置了Notify消息的话,点击Static控件或者在Static控件上移动的话,消息就是对话框发送的,这个时候对话框接管了Static控件的所有消息。

2010-05-19 21:07:00 920

原创 设置套接字为非阻塞的方法

WSAAsyncSelectioctlsocket WSAIoctl

2010-05-19 18:54:00 890

转载 recvfrom以及recv

recvfrom比recv多两个参数的原因  recv是TCP的APIrecvfrom是UDP的API多余的两个参数可以用来接收对端的地址信息,这个对于udp这种无连接的,可以很方便地进行回复。而换过来如果你在udp当中也使用recv,那么就不知道该回复给谁了,如果你不需要回复的话,也是可以使用的。另外就是对于tcp是已经知道对端的,就没必要每次接收还多收一个地址,没有意义,要取地

2010-05-19 18:46:00 773

原创 MFC使用滚动条

先在对话框的OnInitDialog中设置滚动条的范围 CScrollBar *pScrollBar = (CScrollBar*)GetDlgItem(IDC_SCROLLBAR1); pScrollBar->SetScrollRange(0, 100); 接下来响应对话框的WM_VSCROLL和WM_HSCROLL消息void CXXXDlg::OnVScroll(UINT n

2010-05-17 14:53:00 1138

原创 MFC消息完成消息反射

BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam) // return TRUE if command invocation was attempted{ UINT nID = LOWORD(wParam); HWND hWndCtrl = (HWND)lParam; int nCode = HIWORD(wParam);

2010-05-16 21:37:00 853

原创 WM_DRAWITEM消息处理流程

WM_DRAWITEM是一般的消息,如果一个按钮设置了自绘,那么他会给父窗口发送WM_DRAWITEM,父窗口找到消息处理函数看源码: void CWnd::OnDrawItem(int /*nIDCtl*/, LPDRAWITEMSTRUCT lpDrawItemStruct){ if (lpDrawItemStruct->CtlType == ODT_MENU) {  CMenu*

2010-05-16 11:20:00 1138

原创 控件子类化的两种方式

1.  给控件关联变量,修改类名2.  定义一个成员变量,如CPassButton btn;       然后btn.SubclassDlgItem(IDC_BUTTON2, this);    IDC_BUTTON2是窗口的ID,第二个参数是窗口的父窗口的句柄

2010-05-15 11:13:00 771

转载 CRectTracker(橡皮筋)类的使用

CRectTracker(俗称“橡皮筋”类)是一个非常有意思的类。你在Windows中,在桌面上用鼠标拖拽,便可以看到一个虚线的矩形框,它便是橡皮筋.它可以用做显示边界,你也可以扽它的八个角用来放大缩小,做框选使用。如何通过编程来实现这种功能呢?这就是CRectTracker类的作用;介绍橡皮筋类前,先介绍其他两个类:(1) Cpoint 类或Point类,cpoint.x   cpoint.y,

2010-05-13 20:48:00 2104 1

原创 Static成员变量的使用

#include using namespace std;class enemytarget{public: enemytarget() { ++numtargets; } enemytarget(const enemytarget&) { ++numtargets; } ~enemytarget() { --

2010-05-13 18:42:00 757

转载 MFC 程序逆向

上篇啰里啰嗦地说了一大堆,其实所说的消息都是PostMessage方式的。MFC中还有另外一种很常见的消息发送方式,就是SendMessage函 数。这个消息起始路径和上篇所讲的完全不一样。这种方式下,前面的7个站点均不执行,而是直接进入第8站点:User32内核,从第8站点出来后,这两种 消息方式走上了同一条道路,进入第9个站点或第10个站点了,真是殊道同归。对于MFC窗口程序,所有窗口都使用同

2010-05-12 16:55:00 1513

转载 命令传递(源自深入浅出MFC)

  如果是一般的windows消息,则一定是由派生类流向基类,没有旁流的可能。  如果是命令消息wm_command,那就有奇特的路线了。 afxwndproc->afxcallwndproc->CWnd::WindowProc->oncommand->OnCmdMsg 我们看看CFrameWnd的源码 这样就完成了消息的横流

2010-05-11 12:11:00 745

转载 MFC多线程程序设计(源自深入浅出MFC)

一个进程的PDB通过一个"MODREF链表"连接到其所使用的所有模块一个线程的TDB里面都放置了消息队列只有UI线程的优先级会改变,Worker线程的优先级不会改变线程上下文  当线程暂停的时候要求把CPU拥有权让出来,以备将暂停之前一刻的状态统统记录下来。AfxBeginThread和CreateThread函数创建线程的时候,内部调用::CreateThread或_beginthr

2010-05-10 21:04:00 661

转载 template的编译和链接(源自深入浅出MFC)

  编译器遇到一个template时,不能够立即为它产生机器代码,它必须等待,直到template的完整定义将出现在template被使用的每一个角落。  Borland的Smart技术: 链接器会把赘余的template代码剔除,

2010-05-10 14:47:00 712

原创 CWnd::Create(EX)、CWnd::OnCreate和CreateWindow(EX)

Create(EX)是CWnd的成员函数,CWnd::OnCreate是wm_create的消息响应函数,CreateWindow(EX)是API,他们三者的调用关系是CWnd::Create(EX)调用CreateWindow(EX)来完成窗口的创建,CreateWindow(EX)会发送wm_create消息,注意发送之前窗口已经创建好了但是没有显示出来,所以三者的关系是CWnd::C

2010-05-09 19:22:00 2441

转载 MFC窗口销毁过程

假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:   1. 手工调用pWnd->DestroyWindow();   2. DestroyWindow会发送WM_DESTROY;   3. WM_DESTROY对应的消息处理函数是OnDestroy();   4. DestroyWindow会发送WM_NCDESTROY;   5. WM_NCDE

2010-05-08 16:09:00 820

转载 对话框及其子控件的内部创建过程之详细分析

创建非模态对话框时,首先程序最先开始调用CreateDialogIndirectParam函数来创建对话框  ,  在CreateDialogIndirectParam中调用CreateWindowEx函数创建对话框主框架, 这时 CreateWindowEx函数发出WM_CREATEX消息,开始调用OnCreate函数。 注意这时所有对话框的子控件都还没创建 ,所以在OnCreate函数中对子控

2010-05-08 14:22:00 4967 1

原创 VS2008控制台工程检测内存泄露

#include using namespace std;#ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#ifdef _DEB

2010-05-08 13:18:00 1165

转载 typename和typedef关键字

typename指示一个类型名,而非定义一个类型,以下声明了一个Seq::iterator类型的变量itr,其中Seq是一个模板实例化时才知道的类:    typename Seq::iterator itr;如果没有typename指示,Seq::iterator会被认为是Seq的静态变量,而不是类型名。typename关键字不会定义一个类型,如果你想定义一个新类型的话,你必须这样:   

2010-05-07 15:54:00 691

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除