问题~一个函数如何知道它自己是在DLL还是在EXE里面运行?

Kevin_qing 2001-05-21 10:45:00
以前知道的,现在忘了···
...全文
313 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
spiritnet 2001-05-25
  • 打赏
  • 举报
回复
我试了,在win9x中不行.在win2000中用这个函数DWORD GetModuleFileNameEx(HANDLE hProcess,MODULE hModule,LPTSTR lpFilename, DWORD nSize );要用汇编语言可行。
Kevin_qing 2001-05-23
  • 打赏
  • 举报
回复
送分了
Kevin_qing 2001-05-23
  • 打赏
  • 举报
回复
噢~~~~~~
哈哈~~~我就是不知道怎么得道那个句柄~
试试先
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
up6
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
up5
spiritnet 2001-05-22
  • 打赏
  • 举报
回复
上铺的兄弟,VirtualQuery第一参数应是地址,而不是函数名(除非这段代码与参数在同一个工程中并一起编译),但您的代码得到结果是函数所在的文件名.
To Kevin_qing:您的问题应该是问“一个函数如何知道它自己是在DLL还是在EXE里面被调用”吧?如果说运行,那应该在函数所在的文件本身里运行!
若要知道在那个文件中调用,可以如下试试:
DWORD addr;
asm{
pop eax
...
/*以上调用pop次数=你的函数的参数,若是高级语言编写可以不用,因为高级语言在编译时会自动把参数传给变量*/
pop ebp /*获取栈中返回地址*/
mov dword ptr addr,ebp
push ebp /*保存返回地址,防止程序出错*/
}
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(addr,&mbi,sizeof(mbi));
HMODULE hmod=(HMODULE)mbi.AllocationBase;
//这是调用该函数所在模块的句柄。
char fn[128];
GetModuleFileName(hmod,fn,128);
//fn是文件名。

Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
up4
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
似乎你的说法有问题啊,VC能看call stack是因为他能知道所有函数的参数,及其类型。
否则不可能回溯到正确的地址啊。

比如
_f2:
push ebp
mov ebp,esp
push 1
push 2
push 3
call _vv
pop ebp
ret 4
_f1:
push ebp
mov ebp,esp
push 1
call f2
pop ebp


你在_vv里面如何得道f2里面esp的值啊~
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
试试~
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
怪事~
我的回复怎么消失了?
noho 2001-05-22
  • 打赏
  • 举报
回复
To Kevin_qing
调用一个函数时,将所有参数压栈后,系统会自动将返回地址(IP)压栈
所以在被调用函数中[ebp+4]永远都是调用者的地址
然后一个函数一个函数的回溯,就能得到完成的调用栈
VC的调试器能看call stack,也是利用这个方法
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
查过了,imagehlp函数不行
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
为什么我不能给分?
NowCan 2001-05-22
  • 打赏
  • 举报
回复
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(函数名,&mbi,sizeof(mbi));
HMODULE hmod=(HMODULE)mbi.AllocationBase;
//这是函数所在模块的句柄。
char fn[128];
GetModuleFileName(hmod,fn,128);
//fn是文件名。
NowCan 2001-05-22
  • 打赏
  • 举报
回复
可能是这样,我没试过。
iBreathe 2001-05-22
  • 打赏
  • 举报
回复
关注
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
up8
Kevin_qing 2001-05-22
  • 打赏
  • 举报
回复
up7
+50
noho 2001-05-21
  • 打赏
  • 举报
回复
我给你一个大概的思路

hInstance中存放的是模块的起始地址

在函数中看回溯调用栈
被调用的函数中[ebp+4](好像是)中放的是调用者的地址
调用栈最后的栈底肯定是某个exe
但是如果其中有个DLL,则一定是在DLL中调用
Kevin_qing 2001-05-21
  • 打赏
  • 举报
回复
up1
加载更多回复(9)

16,548

社区成员

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

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

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