关于函数地址

C++语言 码拜 9年前 (2016-05-16) 1002次浏览
#include "stdafx.h"
#include <windows.h>
#include <iostream>
int main()
{
	typedef int(WINAPI *pMsgBoxFunType) (HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
	unsigned char funAddr[100] = {};
	memcpy(funAddr,&MessageBox,sizeof(&MessageBox));
	pMsgBoxFunType pMsgBox = (pMsgBoxFunType)((void *)(funAddr));
	(*pMsgBox)(nullptr, L"", L"", MB_OK);
	getchar();
    return 0;
}

程序运行崩溃,求原因?

解决方案

15

引用
memcpy(funAddr,&MessageBox,sizeof(&MessageBox));

1) sizeof 不能用于取得“函数”的大小
2) 函数不是对象,不能拷贝(或 memcpy)
直接用
pMsgBoxFunType pMsgBox = &MessageBox
不好嘛 …

20

    memcpy(funAddr,&MessageBox,sizeof(&MessageBox));
    pMsgBoxFunType pMsgBox = (pMsgBoxFunType)((void *)(funAddr));

1、funAddr 存的不是MessageBox函数的地址
2、pMsgBox存的是funAddr数组的地址,不是MessageBox的地址

5

memcpy 的,通常是是函数开头4个或8 个字节的代码数据(也就是指令)
而不是 MessageBox这个函数的地址
必须经过一次赋值,或初始化给指针,才能够使用memcpy 复制函数地址
原因是 无论MessageBox,还是&MessageBox
都不是一个现实存在的指针变量,而是解析为一个地址常量(函数的地址),
里面存放的是函数编译后的二进制指令
的开头几个个字节,通常是
push ebp,
mov ebp,esp 之类的指令的二进制编码
因此复制出来的是一个指针长度的,几个字节的指令代码本身。不是全部哦

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于函数地址
喜欢 (0)
[1034331897@qq.com]
分享 (0)