======= 200分! 给一个函数名的字符串, 如何得到该函数地址?============

myb123 2002-10-10 04:47:33
我想实现类似sdk的函数FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName)
即给一个函数名的字符串, 如何得到该函数地址?

==============================

例:

FARPROC GetFuncAddress(LPCSTR lpFuncName)
{
// 如何编写实现代码?
}

void MyFunc()
{
printf("go to MyFunc.\n");
}

int main()
{
void (*pFn)();
pFn = GetFuncAddress("MyFunc");
}
...全文
88 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
icansaymyabc 2002-10-14
  • 打赏
  • 举报
回复
除非你的函数是动态链接或静态连接库,否则函数名称在编译的时候就被编译器丢弃,你真想找的话只能到阴曹地府去找了。
tuyang 2002-10-14
  • 打赏
  • 举报
回复
对于程序中的全局函数,由于在编译的过程中,编译器把函数名转换成了代码中的相对地址或绝对地址,函数名称在编译的时候已经被编译器丢弃了,从而,函数名称和函数地址就没有了对应关系。所以,从函数运行时的角度通过函数名来得到全局函数的函数地址是不可能的。如果设计的好的话,可以在设计阶段把各个全局函数名和地址建立一个对应关系表,这样就可以在运行时找到函数地址了。
myb123 2002-10-11
  • 打赏
  • 举报
回复
tuyang 与 psusong(我心飞扬)
谢谢您们了!
我的不是动态库的导出函数, 而是我的例子中那样的全局函数,
难道真要建立函数地址表才能解决问题吗?
myb123 2002-10-10
  • 打赏
  • 举报
回复
谢谢了!
mwc21@163.net
tuyang 2002-10-10
  • 打赏
  • 举报
回复
不用着急。
如果你使用的函数是类似于动态库的导出函数,能够用名字识别的,那么我就有办法给你解决。
microsoft的GetProcAddress我这儿有仿真的源程序,是从bo2k中得到的。

// Like GetProcAddress(), returns null if the procedure/ordinal is not there, otherwise returns function addr.
FARPROC GetDLLProcAddress(HMODULE hModule, LPCSTR lpProcName)
{
if(hModule==NULL) return NULL;

// Get header

PIMAGE_OPTIONAL_HEADER poh;
poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET (hModule);

// Get number of image directories in list

int nDirCount;
nDirCount=poh->NumberOfRvaAndSizes;
if(nDirCount<16) return FALSE;

// - Sift through export table -----------------------------------------------

if(poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size==0) return NULL;

// Good, we have an export table. Lets get it.

PIMAGE_EXPORT_DIRECTORY ped;
ped=(IMAGE_EXPORT_DIRECTORY *)RVATOVA(hModule,poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

// Get ordinal of desired function

int nOrdinal;

if(HIWORD((DWORD)lpProcName)==0) {
nOrdinal=(LOWORD((DWORD)lpProcName)) - ped->Base;
} else {

// Go through name table and find appropriate ordinal

int i,count;
DWORD *pdwNamePtr;
WORD *pwOrdinalPtr;

count=ped->NumberOfNames;
pdwNamePtr=(DWORD *)RVATOVA(hModule,ped->AddressOfNames);
pwOrdinalPtr=(WORD *)RVATOVA(hModule,ped->AddressOfNameOrdinals);

for(i=0;i<count;i++) {

// XXX should be a binary search, but, again, fuck it.

char *svName;
svName=(char *)RVATOVA(hModule,*pdwNamePtr);

if(lstrcmp(svName,lpProcName)==0) {
nOrdinal=*pwOrdinalPtr;
break;
}

pdwNamePtr++;
pwOrdinalPtr++;
}
if(i==count) return NULL;
}

// Look up RVA of this ordinal
DWORD *pAddrTable;
DWORD dwRVA;
pAddrTable=(DWORD *)RVATOVA(hModule,ped->AddressOfFunctions);

dwRVA=pAddrTable[nOrdinal];


// Check if it's a forwarder, or a local addr
// XXX Should probably do this someday. Just don't define forwarders. You're
// XXX not loading kernel32.dll with this shit anyway.

DWORD dwAddr;
dwAddr=(DWORD) RVATOVA(hModule,dwRVA);

return (FARPROC) dwAddr;
}
GoogleGeek 2002-10-10
  • 打赏
  • 举报
回复
简单,先建立你的函数表,然后使用函数指针,无非是一种映射关系而已!
信箱?
myb123 2002-10-10
  • 打赏
  • 举报
回复
难道真的编不出
FARPROC GetFuncAddress(LPCSTR lpFuncName)
{
}
吗? 那microsoft的GetProcAddress是怎么样编的?
myb123 2002-10-10
  • 打赏
  • 举报
回复
首先谢谢!
其实pFn = GetFuncAddress(MyFunc)就是pFn = MyFunc , 我不能用你的方法;

我的源文件不是在同一个工程中使用的, 而且我就是要利用传参.
例如我有以下函数:
int mytest(LPTSTR lpExecuteFuncName)
{
void (*pFn)();
pFn = GetFuncAddress(lpExecuteFuncName);
(*pFn)();
}
tuyang 2002-10-10
  • 打赏
  • 举报
回复
如果源文件是在同一个工程中,即使用GetFuncAddress("MyFunc")函数,参数代表的函数MyFunc在本工程中实现,那么使用GetFuncAddress("MyFunc")就没有意义了。直接赋值就可以了。
void MyFunc()
{
printf("go to MyFunc.\n");
}

int main()
{
void (*pFn)();
pFn = MyFunc;
}

如果你确实想通过传递参数的方法得到函数地址的话,那么只能是这样了。

#define GetFuncAddress(A) A

使用时为
pFn = GetFuncAddress(MyFunc);

begar 2002-10-10
  • 打赏
  • 举报
回复
gz
【CNN-GRU-Attention】基于卷积神经网络和门控循环单元网络结合注意力机制的多变量回归预测研究(Matlab代码实现)内容概要:本文介绍了基于卷积神经网络(CNN)、门控循环单元网络(GRU)与注意力机制(Attention)相结合的多变量回归预测模型研究,重点利用Matlab实现该深度学习模型的构建与仿真。该模型通过CNN提取输入数据的局部特征,利用GRU捕捉时间序列的长期依赖关系,并引入注意力机制增强关键时间步的权重,从而提升多变量时间序列回归预测的精度与鲁棒性。文中涵盖了模型架构设计、训练流程、参数调优及实际案例验证,适用于复杂非线性系统的预测任务。; 适合人群:具备一定机器学习与深度学习基础,熟悉Matlab编程环境,从事科研或工程应用的研究生、科研人员及算法工程师,尤其适合关注时间序列预测、能源预测、智能优化等方向的技术人员。; 使用场景及目标:①应用于风电功率预测、负荷预测、交通流量预测等多变量时间序列回归任务;②帮助读者掌握CNN-GRU-Attention混合模型的设计思路与Matlab实现方法;③为学术研究、毕业论文或项目开发提供可复现的代码参考和技术支持。; 阅读建议:建议读者结合Matlab代码逐模块理解模型实现细节,重点关注数据预处理、网络结构搭建与注意力机制的嵌入方式,并通过调整超参数和更换数据集进行实验验证,以深化对模型性能影响因素的理解。
下载前必看:https://pan.quark.cn/s/da7147b0e738 《商品采购管理系统详解》商品采购管理系统是一款依托数据库技术,为中小企业量身定制的高效且易于操作的应用软件。 该系统借助VC++编程语言完成开发,致力于改进采购流程,增强企业管理效能,尤其适合初学者开展学习与实践活动。 在此之后,我们将详细剖析该系统的各项核心功能及其实现机制。 1. **VC++ 开发环境**: VC++是微软公司推出的集成开发平台,支持C++编程,具备卓越的Windows应用程序开发性能。 在该系统中,VC++作为核心编程语言,负责实现用户界面、业务逻辑以及数据处理等关键功能。 2. **数据库基础**: 商品采购管理系统的核心在于数据库管理,常用的如SQL Server或MySQL等数据库系统。 数据库用于保存商品信息、供应商资料、采购订单等核心数据。 借助SQL(结构化查询语言)进行数据的增加、删除、修改和查询操作,确保信息的精确性和即时性。 3. **商品管理**: 系统内含商品信息管理模块,涵盖商品称、规格、价格、库存等关键字段。 借助界面,用户能够便捷地录入、调整和查询商品信息,实现库存的动态调控。 4. **供应商管理**: 供应商信息在采购环节中占据重要地位,系统提供供应商注册、联系方式记录、信用评价等功能,助力企业构建稳固的供应链体系。 5. **采购订单管理**: 采购订单是采购流程的关键环节,系统支持订单的生成、审批、执行和追踪。 通过自动化处理,减少人为失误,提升工作效率。 6. **报表与析**: 系统具备数据析能力,能够生成采购报表、库存报表等,帮助企业掌握采购成本、库存周转率等关键数据,为决策提供支持。 7. **用户界面设计**: 依托VC++的MF...

16,551

社区成员

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

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

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