函数名代表的内存地址转换成DWORD

mdzwmyy 2014-02-10 05:15:41
#include <iostream>
#include <windows.h>

void fuc(int a)
{
std::cout<<a<<"\n";
}

int main()
{
DWORD Fuc=(DWORD)fuc;//我想得到的是内存中函数fuc的首地址,但是强制转换后就不对了
std::cout<<Fuc<<"\n";
return 0;
}
...全文
237 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdzwmyy 2014-02-10
  • 打赏
  • 举报
回复
引用 5 楼 ADF1230 的回复:
[quote=引用 4 楼 mdzwmyy 的回复:] [quote=引用 3 楼 ADF1230 的回复:] [quote=引用 2 楼 mdzwmyy 的回复:] [quote=引用 1 楼 ADF1230 的回复:] 参考这篇文章: http://www.cnblogs.com/xylc/p/3503612.html
谢谢你!那么我想得到这个函数的地址比如:0x00401100 怎么把这个数值存放到Fuc这个DWORD变量中呢,新手不懂,求教额~[/quote] 直接强转啊,release模式是正常的。 debug模式下,在地址0x00401100处应该有一条跳转指令:jmp xxxx 你解析一下这个jmp指令就知道真实地址了。(PS:visual studio 是这样,其他编译器不保证)。 注意X64平台下指针可能被截断。[/quote] 用release模式编译了,然后用OD调试了 不是正确的值 我是用的VC6.0[/quote]
#include <stdio.h>
#include <windows.h>

void test_func()
{
	printf("hello world\n");
}

int main()
{
	DWORD dwFuc = (DWORD)test_func;//我想得到的是内存中函数fuc的首地址,但是强制转换后就不对了

	_asm{
		call dwFuc
	}
	BYTE* pAddress = (BYTE*)test_func;
	printf("0x%x ", *pAddress++);
	printf("0x%x ", *pAddress++);
	printf("0x%x ", *pAddress++);
	printf("0x%x \n", *pAddress++);
	return 0;
}
vs2013编译,结果: debug: hello world 0xe9 0x3e 0x3 0x0 release: hello world 0x68 0x0 0x21 0x93 0xe9是跳转指令,这个结果是对的啊。[/quote] 嗯嗯 原来我代码没错 太谢谢你了
神-气 2014-02-10
  • 打赏
  • 举报
回复
引用 4 楼 mdzwmyy 的回复:
[quote=引用 3 楼 ADF1230 的回复:] [quote=引用 2 楼 mdzwmyy 的回复:] [quote=引用 1 楼 ADF1230 的回复:] 参考这篇文章: http://www.cnblogs.com/xylc/p/3503612.html
谢谢你!那么我想得到这个函数的地址比如:0x00401100 怎么把这个数值存放到Fuc这个DWORD变量中呢,新手不懂,求教额~[/quote] 直接强转啊,release模式是正常的。 debug模式下,在地址0x00401100处应该有一条跳转指令:jmp xxxx 你解析一下这个jmp指令就知道真实地址了。(PS:visual studio 是这样,其他编译器不保证)。 注意X64平台下指针可能被截断。[/quote] 用release模式编译了,然后用OD调试了 不是正确的值 我是用的VC6.0[/quote]
#include <stdio.h>
#include <windows.h>

void test_func()
{
	printf("hello world\n");
}

int main()
{
	DWORD dwFuc = (DWORD)test_func;//我想得到的是内存中函数fuc的首地址,但是强制转换后就不对了

	_asm{
		call dwFuc
	}
	BYTE* pAddress = (BYTE*)test_func;
	printf("0x%x ", *pAddress++);
	printf("0x%x ", *pAddress++);
	printf("0x%x ", *pAddress++);
	printf("0x%x \n", *pAddress++);
	return 0;
}
vs2013编译,结果: debug: hello world 0xe9 0x3e 0x3 0x0 release: hello world 0x68 0x0 0x21 0x93 0xe9是跳转指令,这个结果是对的啊。
mdzwmyy 2014-02-10
  • 打赏
  • 举报
回复
引用 3 楼 ADF1230 的回复:
[quote=引用 2 楼 mdzwmyy 的回复:] [quote=引用 1 楼 ADF1230 的回复:] 参考这篇文章: http://www.cnblogs.com/xylc/p/3503612.html
谢谢你!那么我想得到这个函数的地址比如:0x00401100 怎么把这个数值存放到Fuc这个DWORD变量中呢,新手不懂,求教额~[/quote] 直接强转啊,release模式是正常的。 debug模式下,在地址0x00401100处应该有一条跳转指令:jmp xxxx 你解析一下这个jmp指令就知道真实地址了。(PS:visual studio 是这样,其他编译器不保证)。 注意X64平台下指针可能被截断。[/quote] 用release模式编译了,然后用OD调试了 不是正确的值 我是用的VC6.0
神-气 2014-02-10
  • 打赏
  • 举报
回复
引用 2 楼 mdzwmyy 的回复:
[quote=引用 1 楼 ADF1230 的回复:] 参考这篇文章: http://www.cnblogs.com/xylc/p/3503612.html
谢谢你!那么我想得到这个函数的地址比如:0x00401100 怎么把这个数值存放到Fuc这个DWORD变量中呢,新手不懂,求教额~[/quote] 直接强转啊,release模式是正常的。 debug模式下,在地址0x00401100处应该有一条跳转指令:jmp xxxx 你解析一下这个jmp指令就知道真实地址了。(PS:visual studio 是这样,其他编译器不保证)。 注意X64平台下指针可能被截断。
mdzwmyy 2014-02-10
  • 打赏
  • 举报
回复
引用 1 楼 ADF1230 的回复:
参考这篇文章: http://www.cnblogs.com/xylc/p/3503612.html
谢谢你!那么我想得到这个函数的地址比如:0x00401100 怎么把这个数值存放到Fuc这个DWORD变量中呢,新手不懂,求教额~
神-气 2014-02-10
  • 打赏
  • 举报
回复

16,548

社区成员

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

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

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