qt-opensource-windows-x86-msvc2010_opengl-5.3.2.exe

ZC: “const QString” 作传入参数的时候,不太会弄... 貌似 还是在进行构建等的操作,按照暂时的水平这种情况还不太会弄... 于是 用“QString&”或“QString*”作参数

ZC: Qt调试 比较麻烦,还是使用 VS2010 来调试 看汇编的...

1、mainwindows.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
} MainWindow::~MainWindow()
{
delete ui;
} #include <QDebug>
#include "TClassFuncPtr.h" void MainWindow::on_pbtnTest01_clicked()
{
//*
CTest test; void *pFunc = pointer_cast<void*>(&CTest::GetString); Tcfp_Qs_II cfp;
cfp.Set(&test, pFunc);
QString str = cfp.Call(, );
qDebug() << str;
//*/
/*
CTest test;
QString str = test.GetString(1, 3);
//*/
} void MainWindow::on_pbtnTest02_clicked()
{
QString str = "";
//*
CTest test; void *pFunc = pointer_cast<void*>(&CTest::GetIntFromString); Tcfp_I_CQs cfp;
cfp.Set(&test, pFunc);
int iRtn = cfp.Call(str);
qDebug() << str;
//*/
/*
CTest test;
int iRtn = test.GetIntFromString(str);
qDebug() << iRtn;
//*/
} void MainWindow::on_pbtnTest03_clicked()
{
QString str = "";
//*
CTest test; void *pFunc = pointer_cast<void*>(&CTest::GetIntFromString01); Tcfp_I_Qs cfp;
cfp.Set(&test, pFunc);
int iRtn = cfp.Call(str);
qDebug() << iRtn;
} void MainWindow::on_pbtnTest04_clicked()
{
QString str = "";
//*
CTest test; void *pFunc = pointer_cast<void*>(&CTest::GetIntFromString02); Tcfp_I_Qsp cfp;
cfp.Set(&test, pFunc);
int iRtn = cfp.Call(&str);
qDebug() << iRtn;
}

2、TClassFuncPtr.h

#ifndef TCLASSFUNCPTR_H
#define TCLASSFUNCPTR_H #include <QString> // ZC: 子类 命名规则:“Tcfp_返回值类型_各个传入参数类型()” class TClassFuncPtr
{
public:
TClassFuncPtr()
{
FpObj = NULL;
FpFunc = NULL;
} protected:
void* FpObj; // ZC: 对象指针
void* FpFunc; // ZC: 类函数的 函数地址(统一使用stdcall调用约定,函数传参/调用的时候 方便一点) public:
void Set(void *_pObj, void *_pFunc)
{
FpObj = _pObj;
FpFunc = _pFunc;
} bool IsValid()
{
return ( (FpObj != NULL) && (FpFunc != NULL) );
}
}; class Tcfp_Qs_II :public TClassFuncPtr
{
public:
QString __stdcall Call(int _i, int _j);
}; class Tcfp_I_CQs :public TClassFuncPtr
{
public:
int __stdcall Call(const QString _str);
}; class Tcfp_I_Qs :public TClassFuncPtr
{
public:
int __stdcall Call(QString &_str);
}; class Tcfp_I_Qsp :public TClassFuncPtr
{
public:
int __stdcall Call(QString *_pstr);
}; // ZC: 获取 类函数指针(地址)
template<typename dst_type,typename src_type>
dst_type pointer_cast(src_type src)
{
return *static_cast<dst_type*>(static_cast<void*>(&src));
}
#endif // TCLASSFUNCPTR_H class CTest
{
private:
int Fi;
public:
QString __stdcall GetString(int _i, int _j); int __stdcall GetIntFromString(const QString _str);
int __stdcall GetIntFromString01(QString &_str);
int __stdcall GetIntFromString02(QString *_pstr);
};

3、TClassFuncPtr.cpp

#include "TClassFuncPtr.h"

#pragma optimize( "", off )
QString __stdcall Tcfp_Qs_II::Call(int _i, int _j)
{
if (IsValid())
{
_asm
{
push _j
push _i
mov eax,dword ptr [ebp+0xC]
push eax
mov eax,[this] // ZC: 貌似和语句“mov eax,this”是一样的效果...
// [eax] ==> FpObj
// [eax+4] ==> FpFunc
push [eax]
call [eax+]
}
}
} int __stdcall Tcfp_I_CQs::Call(const QString _str)
{
if (IsValid())
{
void *p = (void*)&_str;
_asm
{
push p
mov eax,[this] // ZC: 貌似和语句“mov eax,this”是一样的效果...
// [eax] ==> FpObj
// [eax+4] ==> FpFunc
push [eax]
call [eax+]
}
}
} int __stdcall Tcfp_I_Qs::Call(QString &_str)
{
if (IsValid())
{
_asm
{
mov eax,[ebp+0xC]
push eax
mov eax,[this] // ZC: 貌似和语句“mov eax,this”是一样的效果...
// [eax] ==> FpObj
// [eax+4] ==> FpFunc
push [eax]
call [eax+]
}
}
} int __stdcall Tcfp_I_Qsp::Call(QString *_pstr)
{
if (IsValid())
{
_asm
{
mov eax,[ebp+0xC]
push eax
mov eax,[this] // ZC: 貌似和语句“mov eax,this”是一样的效果...
// [eax] ==> FpObj
// [eax+4] ==> FpFunc
push [eax]
call [eax+]
}
}
} //#pragma optimize( "", on ) //#pragma optimize( "", off )
QString __stdcall CTest::GetString(int _i, int _j)
{
__asm
{
mov eax,eax
mov eax,eax
mov eax,eax
}
Fi = ;
return ( QString::number(_i)+","+QString::number(_j)+","+QString::number(Fi) );
} int __stdcall CTest::GetIntFromString(const QString _str)
{
return _str.toInt();
} int __stdcall CTest::GetIntFromString01(QString &_str)
{
return _str.toInt();
} int __stdcall CTest::GetIntFromString02(QString *_pstr)
{
return (*_pstr).toInt();
} #pragma optimize( "", on )

4、mainwindow.ui

  4.1、

  4.2、

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QPushButton" name="pbtnTest01">
<property name="geometry">
<rect>
<x>50</x>
<y>40</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Test01</string>
</property>
</widget>
<widget class="QPushButton" name="pbtnTest02">
<property name="geometry">
<rect>
<x>50</x>
<y>70</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Test02</string>
</property>
</widget>
<widget class="QPushButton" name="pbtnTest03">
<property name="geometry">
<rect>
<x>50</x>
<y>100</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Test03</string>
</property>
</widget>
<widget class="QPushButton" name="pbtnTest04">
<property name="geometry">
<rect>
<x>50</x>
<y>130</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Test04</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>17</height>
</rect>
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>

5、

ZC_C++类函数指针_模拟_Delphi类函数指针_Qt例子的更多相关文章

  1. ZC_C++类函数指针_模拟_Delphi类函数指针

    ZC: C++的类函数指针 不像 Delphi的类函数指针,前者 需要规定死 是哪个类的函数的指针,后者就不需要 很灵活. 测试环境: Win7x64 cn_visual_studio_2010_ul ...

  2. C++第四篇--重载_指针_引用

    C++第四篇--重载_指针_引用 1. 基础知识 重载:函数名相同,根据参数不同(类型.数量.顺序不同)调用同名函数 指针和引用:引用就是别名,引用时必须初始化,引用你定义的变量. int a; in ...

  3. ca71a_c++_指向函数的指针_通过指针调用函数txwtech

    /*ca71a_c++_指向函数的指针_通过指针调用函数用typedef简化函数指针的定义简化前: bool(*pf)(const string&, const string &); ...

  4. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  5. C语言_初步了解一下指针

    指针的基本概念 在计算机中,所有的数据都是存放在存储器中的. 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等.为了正确地访问这 ...

  6. 零基础逆向工程24_C++_01_类_this指针_继承本质_多层继承

    1 类内的成员函数和普通函数的对比 1.1 主要是从参数传递.压栈顺序.堆栈平衡来总结. 1.参数传递:成员函数多传一个this指针 2.压栈顺序:成员函数会将this指针压栈,在函数调用取出 3.堆 ...

  7. 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数

    #include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...

  8. Qt 智能指针学习(7种指针)

    Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...

  9. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

随机推荐

  1. 关闭WPS启动时显示的在线模板

    关闭WPS启动时显示的在线模板 以WPS2016为例,如下图: 操作步骤如下: ①点击在线模板页面右下方的"设置"选项 ②"设置"界面打开后,选择启动WPS默认 ...

  2. iOS常用第三方类库及Xcode插件

    第三方类库(github地址): 1.AFNetworking 网络数据     https://github.com/AFNetworking/AFNetworking 2.SDWebImage 图 ...

  3. 浅谈Android View滑动和弹性滑动

    引言 View的滑动这一块在实际开发中是非常重要的,无论是优秀的用户体验还是自定义控件都是需要对这一块了解的,我们今天来谈一下View的滑动. View的滑动 View滑动功能主要可以使用3种方式来实 ...

  4. 007-配置IP和DNS

    2.配置DNS. 3.

  5. Bus,Exclusive access,memory attribute

    指令LDREX,STREX是在armv6中新加的指令,配合AMBA3--AXI中的lock[1:0]信号. 在Atomic Access一节中是这么规定的:ARLOCK[1:0]/AWLOCK[1:0 ...

  6. PAT乙级 1024. 科学计数法 (20)(未通过全部测试,得分18)

    1024. 科学计数法 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 科学计数法是科学家用来表示很 ...

  7. 浅谈EM算法的两个理解角度

    http://blog.csdn.net/xmu_jupiter/article/details/50936177 最近在写毕业论文,由于EM算法在我的研究方向中经常用到,所以把相关的资料又拿出来看了 ...

  8. Intermediate Python for Data Science learning 3 - Customization

    Customization from:https://campus.datacamp.com/courses/intermediate-python-for-data-science/matplotl ...

  9. Python: re.IGNORECASE 标志参数字符串忽略大小写的搜索替换

    为了在文本操作时忽略大小写,需要在使用re 模块的时候给这些操作提供re.IGNORECASE 标志参数.比如 >>> text = 'UPPER PYTHON, lower pyt ...

  10. CPU负载过高异常排查实践与总结

    昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并 ...