MFC 跨类调用

eketty 2010-05-08 10:42:58
2个cpp文件 A B
A里面有个函数func 设置为public
B里面如何调用func啊,

#include A.h
A * p;
p->func();

运行报错
...全文
1015 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-05-08
  • 打赏
  • 举报
回复
消息多了感觉很混乱
===========
那只能说明你程序架构有问题
就从你想通过帖子里的方式跨类调用函数
足以说明你对windows编程甚至是面向对象技术理解有误区
最好好好补补基础知识
eketty2 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]

引用 10 楼 eketty2 的回复:
引用 9 楼 xianglitian 的回复:

引用 8 楼 eketty2 的回复:
现在又要报错,, 说系统不支持的操作,,

我现在改成了:

A里面有一个函数func1,设置StaticBox的文字
func1()
{
//这里如果什么都不写,B调用时不报错,但是调用m_text = "abc";UpdateData(0)……
[/Quote]

消息多了感觉很混乱,
向立天 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 eketty2 的回复:]
引用 9 楼 xianglitian 的回复:

引用 8 楼 eketty2 的回复:
现在又要报错,, 说系统不支持的操作,,

我现在改成了:

A里面有一个函数func1,设置StaticBox的文字
func1()
{
//这里如果什么都不写,B调用时不报错,但是调用m_text = "abc";UpdateData(0);就报错,更别说传入一个 变量了,如果使用Ge……
[/Quote]

发消息不科学?!!!!!
::PostMessage(hWnd, WM_MESSAGW, 参数, 参数);
eketty2 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]

引用 8 楼 eketty2 的回复:
现在又要报错,, 说系统不支持的操作,,

我现在改成了:

A里面有一个函数func1,设置StaticBox的文字
func1()
{
//这里如果什么都不写,B调用时不报错,但是调用m_text = "abc";UpdateData(0);就报错,更别说传入一个 变量了,如果使用GetDlgItem->SetWindowText同样报……
[/Quote]

呵呵 必须的

发消息是用PostMessage么?A.PostMessage么?但感觉有点不科学嘛,,
向立天 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 eketty2 的回复:]
现在又要报错,, 说系统不支持的操作,,

我现在改成了:

A里面有一个函数func1,设置StaticBox的文字
func1()
{
//这里如果什么都不写,B调用时不报错,但是调用m_text = "abc";UpdateData(0);就报错,更别说传入一个 变量了,如果使用GetDlgItem->SetWindowText同样报错,,,
}
B里面
A * p……
[/Quote]

你的所谓A类是个对话框吧
开始的时候就觉得你的应用有些怪
这种情况不要这么调用
发个消息给A让A自己处理
另外
你在CSDN账号不少啊
eketty2 2010-05-08
  • 打赏
  • 举报
回复
现在又要报错,, 说系统不支持的操作,,

我现在改成了:

A里面有一个函数func1,设置StaticBox的文字
func1()
{
//这里如果什么都不写,B调用时不报错,但是调用m_text = "abc";UpdateData(0);就报错,更别说传入一个 变量了,如果使用GetDlgItem->SetWindowText同样报错,,,
}
B里面
A * p = new A;
p->func1;
magic7004 2010-05-08
  • 打赏
  • 举报
回复
5楼的代码这样写会误导小青年的。
标准的做法应该是Class A的print声明成static
Class B中用A::print来调用
gudaoqianfu 2010-05-08
  • 打赏
  • 举报
回复
哦,对哦。
我看到头文件错误就没想下去了,呵呵
汪宁宇 2010-05-08
  • 打赏
  • 举报
回复
a.h
#ifndef _MY_A_H
#define _MY_A_H

#include <iostream.h>

class A
{
public:
void Print()
{
cout<<"from class A..."<<endl;
}
};

#endif


b.h
#ifndef _MY_B_H
#define _MY_B_H

#include "a.h"

class B
{
public:
void Print()
{
A *a;
cout<<"from class B..."<<endl;
a->Print();
}
};

#endif


mainAB.cpp
#include "a.h"
#include "b.h"
#include <iostream.h>

void main()
{
B b;
b.Print();
}


运行结果:
C:\Documents and Settings\Administrator>cl /O2 mainAB.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

mainAB.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:mainAB.exe
mainAB.obj

C:\Documents and Settings\Administrator>mainab
from class B...
from class A...
汪宁宇 2010-05-08
  • 打赏
  • 举报
回复
你这样随手写的指针是野指针嘛,没有内存空间的,当然会XXO
向立天 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 eketty 的回复:]
2个cpp文件 A B
A里面有个函数func 设置为public
B里面如何调用func啊,

#include A.h
A * p;
p->func();

运行报错
[/Quote]

你都没给p分配空间能不报错么
eketty 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gudaoqianfu 的回复:]

#include "A.h"
[/Quote]

恩 有引号的 编译通过 运行报错
gudaoqianfu 2010-05-08
  • 打赏
  • 举报
回复
#include "A.h"
程老师2088 2010-05-08
  • 打赏
  • 举报
回复
呵呵 凑凑热闹
汪宁宇 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 magic7004 的回复:]

5楼的代码这样写会误导小青年的。
标准的做法应该是Class A的print声明成static
Class B中用A::print来调用
[/Quote]

这样会让lz更纠结,只是按照他的思路来随手写的...
Eleven 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 eketty 的回复:]
2个cpp文件 A B
A里面有个函数func 设置为public
B里面如何调用func啊,

#include A.h
A * p;
p->func();

运行报错
[/Quote]
如果A和B的亲缘关系很近的话,B中保存A的指针,然后调用A的方法,如果亲缘关系很远,就需要借助中间类,通过中间类中转消息。。。
「已注销」 2010-05-08
  • 打赏
  • 举报
回复
都没A的实例怎么用啊????
//官方网站:www.feiyuol.com //郁金香灬老师 //QQ 150330575 //个人网站:www.yjxsoft.com 跨进程调用CALL 跨进程调用带多个的参数CALL // myInject_dll.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include"RWA.h" //PVOID 跨进程分配内存(WORD nSize ); //1、获取进程句柄 //2、读写 分配内存 创建线程 //3、跨进程分配内存 void mycall() { PVOID p1=跨进程分配内存(1000); printf("分配的内存地址=%p\n",p1); printf("按回车键 释放内存\n"); getchar(); 跨进程释放内存(p1,1000); printf("已经 释放内存\n"); } LPTHREAD_START_ROUTINE a; BOOL 跨进程调用CALL(PVOID pcall地址,PVOID plst参数 ); //LoadLibraryA(dll名字指针) //MessageBeep(1) void Test远程调用MessageBeep() { 跨进程调用CALL(MessageBeep,(PVOID)0x12768); } //注入my022MFC.dll到目标进程 void Test3() { char szDllName[]="my022MFC.dll"; //全路径 // char szDllName[]="C:\\Users\\yjxsoft\\Documents\\visual studio 2010\\Projects\\my022\\Debug\\my022MFC.dll"; PVOID p1=跨进程分配内存(1000); printf("分配的内存地址=%p\n",p1); WN((DWORD)p1,szDllName,sizeof(szDllName));//WriteProcessMemory /*跨进程调用CALL(LoadLibraryA,(PVOID)szDllName);*/ 跨进程调用CALL(LoadLibraryA,(PVOID)p1); } void Test4() { // char szDllName[]="my022MFC.dll"; //全路径 char szDllName[]="E:\\1905\\代码\\my022-24\\Debug\\my022MFC.dll"; PVOID p1=跨进程分配内存(1000); printf("分配的内存地址=%p\n",p1); WN((DWORD)p1,szDllName,sizeof(szDllName));//WriteProcessMemory /*跨进程调用CALL(LoadLibraryA,(PVOID)szDllName);*/ 跨进程调用CALL(LoadLibraryA,(PVOID)p1); } int _tmain(int argc, _TCHAR* argv[]) { //mycall(); Test3(); Test4(); return 0; } //作业 //1、练习跨进程注入DLL //2、跨进程分配的内存内存 使用完后 用VirtualFreeEx释放掉 //3、进程句柄使用完后用CloseHandle释放句柄资源

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧