« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1405682 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]对类成员进行特殊操作(2) |
大家在看了文章1后以经对取得虚函数地址有所了解,但用它作回调函数还是有一点问题,因为要使成员函数正确运行,我们必须每次在调用这前传一个this给ecx(对应的成员函数中没有操作类成员除外,原因见(文章1)),作为回调函数,它可不给你这个机会,那怎么实现呢?
下面就是一种实现方法:
我们可以在数据段中开一个数组,在这个数组里存放一些特殊的数据,然后将这个数组的地址作为回调函数的地址,然后这个数组将被作为代码运行。那么这个数组对应的代码又做些什么呢?很简单的:将对象的地址传入ecx, 然后jmp到真正的回调函数。
下面是个例子:
主要部分也就是ThunkInit(ThunkData t, void *This, int VirFucID);
传入一个数组指针,一个对象的指针,一个对应第几个虚函数。然后这个函数将生成对应的可执行代码:将对象的地址传入ecx, 最
|
阅读全文(1952) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]对类成员进行特殊操作(1) |
以下在win2000, vc6中编译通过
大家有没有想到过用一个成员函数做回调函数呢?是不是老是编译通不过呢?那么下面将会给你一个答案。
在大家的印象中,访问类成员及函数,是不是object.XX或object.XX(); 其实在c/c++这种中级语言完全可以不守这个规矩。你其甚至可以存取类中的私有成员。不相信吗?大家看看这个例子:
例1:class CAA
{
public:
CAA() {m_data1=50; m_data2=100;}
~CAA() {};
void print() { ::printf("%d, %dn", m_data1, m_data2); }
private:
int m_data1;
int m_data2;
};
|
阅读全文(2042) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]消息与消息队列 |
About Messages and Message Queues
基于windows的应用程序是事件驱动的。它们不进行明确的函数调用(比如调用C运行库)来获得输入。取而代之的是他们等待操作系统将输入传递给他们。 操作系统传递所有的输入给各种应用程序。每个window有一个函数叫做窗口过程,只要有输入操作系统就调用他们。窗口过程处理输入后,将控制返回给操作系统。详细资料请看窗口过程。
Microsoft? Windows? XP:如果最顶层(top-level)的窗口停止响应几秒钟,系统将认为窗口被挂起。这种情况下,系统将隐藏这个窗口并用一个ghost window在相同z坐标上,相同的大小,相同的可视属性来取代他。以允许用户移动窗口,改变窗口大小,关闭窗口。然而,仅有这些行为是可操作的因为应用程序已挂起。在Debugger模式下,系统不产生ghost窗口。
This section discusses the following topics: · Windows Messages · Message Types
|
阅读全文(2053) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]利用CRC-32检测程序的完整性 |
CRC-32算法原作者:胡春松
由于原算法是嵌在一个对话框类中,使用不尽方便,所以我将其提出,封装成一个CCrc32类,使用时只需定义一个对象,再调用int GetCRC(LPCTSTR csData, DWORD dwSize);便可得到结果。
或许你对CRC-32不是很了解,也不知有何用处,那看看下面:
以下摘自:http://www.luocong.com/articles/show_article.asp?Article_ID=15 作者:老罗CRC是什么东西呢?其实我们大家都不应该会对它陌生,回忆一下?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。
|
阅读全文(3283) | 回复(1) | 编辑 | 精华 | 删除 |
[【技术文档】]屏蔽系统热键的方法 |
在程序开发过程中,为了满足一些特殊的需求,有时需要屏蔽系统热键。这些系统热键包括Alt+Tab、Ctrl+Alt+Del、Alt+Esc、Ctrl+Esc、Win等。由于屏蔽系统热键涉及到系统的安全,所以一般不推荐这样做,但由于存在实际的应用需求,所以作为编程人员还是要对此加以了解。本文分三种情况来讨论屏蔽系统热键的方法。
在Windows 95/98操作系统下
在Windows
|
阅读全文(3804) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]仅通过崩溃地址找出源代码的出错行 |
作为程序员,我们平时最担心见到的事情是什么?是内存泄漏?是界面不好看?……错啦!我相信我的看法是不会有人反对的——那就是,程序发生了崩溃!
“该程序执行了非法操作,即将关闭。请与你的软件供应商联系。”,呵呵,这句 M$ 的“名言”,恐怕就是程序员最担心见到的东西了。有的时候,自己的程序在自己的机器上运行得好好的,但是到了别人的机器上就崩溃了;有时自己在编写和测试的过程中就莫名其妙地遇到了非法操作,但是却无法确定到底是源代码中的哪行引起的……是不是很痛苦呢?不要紧,本文可以帮助你走出这种困境,甚至你从此之后可以自豪地要求用户把崩溃地址告诉你,然后你就可以精确地定位到源代码中出错的那行了。(很神奇吧?呵呵。)
首先我必须强调的是,本方法可以在目前市面上任意一款编译器上面使用。但是我只熟悉 M$ 的 VC 和 MASM ,因此后面的部分只介绍如何在这两个编译器中实现,请读者自行融会贯
|
阅读全文(3559) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]深入了解MFC中的文挡/视结构 |
作者:李泽宇 金刚 熊联欢 姜军 eNet学院
Visual C++ 6.0 以其功能强大、用户界面友好而倍受程序员们的青睐。但是,在当前的M icrosoft 基本类库4.2 版本中,大约有将近200 个类,数千个函数,加之Microsoft 公司 隐藏了一些技术细节,使得人们深入学习MFC变得十分困难。
MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用、单文档应用(SD I)和多文档应用(MDI)。前两者的结构较简单,本文不再赘叙。笔者拟从MFC中的文档/ 视结构入手,分析一些函数的流程,并解决编制MDI 应用程序过程中的一些常见问题。
(一)、了解文档/视结构
MFC应用程序模型历经多年以有了相当大的发展。有一个时期,它只是个使用应用程序 对象和主窗口对象的简单模型。在这个模型中,应用程序的数据作为成
|
阅读全文(3932) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]VC中的一些常用方法(20条) |
VC中的一些常用方法
//一、打开CD-ROM
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
//二、关闭CD_ROM
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
//三、关闭计算机
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构 OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&OsVersionInfo); //获取操作系统版本信息 if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
|
阅读全文(3264) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]MFC界面包装类(多线程时成员函数调用的断言失败) |
经常在论坛上看到如下的问题: DWORD WINAPI ThreadProc( void *pData ) // 线程函数(比如用于从COM口获取数据) { // 数据获取循环 // 数据获得后放在变量i中 CAbcDialog *pDialog = reinterpret_cast< CAbcDialog* >( pData ); ASSERT( pDialog ); // 此处如果ASSERT_VALID( pDialog )将断言失败 pDialog->m_Data = i; pDialog->UpdateData( FALSE ); // UpdateData内部ASSERT_VALID( this )
|
阅读全文(3269) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]用Visual C++打造IE浏览器(3) |
二、实现收藏菜单
一般IE的用户都有个习惯,那就是将自己喜欢的网址保存起来,以方便今后快速的登陆,为了使我们的浏览器能够显示IE收藏过的网址,程序中设置了一个"Favorites"菜单,通过RegOpenKey()、RegQueryValueEx()等函数操作Windows的注册表中的HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders项,将收藏的网址显示到菜单上。为此,笔者定义了两个函数,实现代码如下所示:
TCHAR GetDir( ) //得到存放
|
阅读全文(3042) | 回复(0) | 编辑 | 精华 | 删除 |
|