严格说,C++的禁止外部类访问private 是指在编译期,运行期都是在内存中的数据,是可以做任何修改的。本文的方式讲的就是针对运行期如何修改。
这个方案源于N年前有个第三方实现的静态库,我们没有代码,只有库的头文件声明和编译好的lib库。在一个类的头文件中,有个私有变量存储的是Color值,但库的开放接口却没有能力修改这个值。
### 方法
通过头文件的类定义,算出该私有变量在内存中的偏移值,有了偏移值,就可以通过获取该类实例在内存中的地址,从而算出私有变量的内存地址。需要对class内存结构有所了解,如图:
![class struct](http://p.blog.csdn.net/images/p_blog_csdn_net/pathuang68/EntryImages/20090424/1604.GIF)
具体实现代码:
~~~.cpp
// 获取开始内存地址
volatile char *pThis = (char *)&pRichEditChatLogEx;
volatile CHARFORMAT2 cf;
ZeroMemory((char *)&cf, sizeof(CHARFORMAT2));
cf.cbSize = sizeof(CHARFORMAT2);
cf.crTextColor = RGB(0, 0, 0);
cf.yHeight = 20 * 10;
cf.dwMask = CFM_COLOR | CFM_FACE | CFM_SIZE | CFM_PROTECTED;
cf.dwEffects = 0;
cf.bCharSet = 134;
cf.bPitchAndFamily = 34;
// 算偏移地址,篇幅原因,不贴出具体类的定义了
// 下面的公式是取基类最后结束的偏移,仔细想想,是从屁股开始往前推...
int endOffset = sizeof(CRichEditChatLogEx) * 2 - sizeof(CRichEditChatLog);
// 通过调试内存看出,DEBUG下,内存多4个字节
#if _DEBUG
volatile int offset = endOffset - sizeof(CHARFORMAT2) - 20;
#else
volatile int offset = endOffset - sizeof(CHARFORMAT2) - 24;
#endif
// 内存写入要修改的值,注意千万不要超出数据长度哦,否则就是场灾难
memcpy((char *)&pThis[offset], (char *)&cf, sizeof(CHARFORMAT2));
~~~
转自:http://www.yinqisen.cn/blog-530.html
分享到:
相关推荐
c++访问私有private成员变量的常用方法 在 C++ 编程中,private 成员变量是类的内部实现细节,不能被外部直接访问,这是为了保护类的封装性和安全性。然而,在某些情况下,我们需要访问私有成员变量,例如在测试、...
通过分析提供的文件信息,我们可以深入探讨如何利用C++中的虚函数机制实现对私有成员的间接访问。这一技术不仅能够帮助我们理解C++中的多态性,还能够在一定程度上突破语言设计上的限制,实现更为灵活的编程方式。 ...
在C++中,静态成员函数可以被类的所有对象共享,它并不持有隐含的`this`指针,因此不能访问非静态成员变量。静态成员函数通常用于执行与对象状态无关的操作,如计算、比较等。例如,在`静态成员函数.cpp`中,可能会...
C++ 类访问控制机制是面向对象编程中的核心概念,它主要涉及到`public`、`private`和`protected`这三个访问修饰符。它们的作用是限制类的成员(数据成员和成员函数)在不同作用域内的可访问性,从而实现数据封装和...
`public`成员可以在类的任何地方被访问,`private`成员只能在类的内部访问,而`protected`成员则可以被类本身及其派生类访问。 3. **成员变量的私有化**:将成员变量声明为`private`,意味着它们不能直接从类的外部...
C++初始化成员列表 C++语言中的初始化成员列表是一种特殊的语法结构,它...C++语言中的初始化成员列表是一种非常有用的机制,它可以解决一些特殊的问题,提高效率,并且可以对const成员或引用类型的成员进行初始化。
这种设计允许类A访问类B的成员,同时类B也可以访问类A的成员,形成一种循环依赖的关系。然而,这种关系需要谨慎处理,以避免编译错误和设计上的问题。下面我们将深入探讨这个主题。 首先,我们要理解C++中的“包含...
在C++中,类的成员可以被声明为私有的(private),这意味着它们在类的外部不能直接访问。这是封装性原则的体现,有助于保护数据的安全性和完整性。然而,在某些情况下,我们需要在类外部修改私有成员,这通常通过...
public成员可以被类外的任何代码访问,protected成员可以被类内和友元访问,private成员只能被类内和友元访问。 现在,让我们深入了解三种继承方式的特点: 1. public继承 在public继承中,基类的public成员、...
- 友元函数(Friend functions)是非成员函数,但可以访问类的private和protected成员。声明一个函数为友元,可以打破封装原则,允许该函数直接访问类的私有和保护成员。 - 友元类(Friend classes)是整个类而...
- **对象访问**:派生类的对象可以直接访问基类的public成员,但不能直接访问protected或private成员。 - **概念理解**:“公有继承”意味着“是一个”。例如,如果`Dog`是从`Animal`公有继承而来,那么可以说每个`...
C++作为一种强大的编程语言,虽然原生并不包含直接访问数据库的库,但可以通过第三方库如ocilib与Oracle数据库进行交互。本篇将详细介绍如何利用C++结合ocilib库实现对Oracle数据库的访问。 ocilib是一个开源的C/...
关于tolua++的资料太少,这个通过实例让你知道如何通过tolua++和C++交互,简单明了。 通过5个文件来演示这个tolua++版 hello world hello.lua ,hello.h ,hello.pkg ,Main.cpp ,build_pgk.bat 1.启动CodeBlocks...
静态成员函数可以访问静态数据成员,但不能直接访问非静态数据成员。 6. **常量成员**:常量成员包括常量数据成员(const data member)和常量成员函数。常量数据成员在类的常量成员函数中不可修改,但在非常量成员...
C++ 类访问控制的条件总结 最近在使用C++创建类的时候,忽然发现自己...类成员是否可以访问 Yes Yes Yes 友元函数是否可以访问 Yes Yes Yes 子类是否可以访问 Yes Yes No 类的实例化对象是否可以访问 Yes No No
1. **访问修饰符的默认值**:在C++中,默认访问修饰符是`private`,而在Java中是`package-private`(同一包内的其他类可以访问)。 2. **构造函数**:C++中构造函数可以是无参或有参,且没有默认构造函数的概念。...
3. 访问控制:C++提供了三种访问控制级别——公共(public)、私有(private)和保护(protected)。公共成员可被类内外的成员访问,私有成员只能被类内部访问,保护成员则允许类及其派生类访问。 4. 构造函数与析...
4. **访问修饰符**:public成员可以被任何代码访问,private成员只能在类内部访问,protected成员可被类及其派生类访问。合理设置访问权限能保证数据安全。 5. **成员函数**:类可以包含各种函数,如方法、友元函数...