问一个关于 GetProcAddress 函数的参数问题。(150分)

  • 主题发起人 主题发起人 liyinwei
  • 开始时间 开始时间
L

liyinwei

Unregistered / Unconfirmed
GUEST, unregistred user!
我在 Share 单元里面 137 行看到的以下这句:
GetProcAddress(MM,'@Borlndmm@SysGetMem$qqri')
以往我用 GetProcAddress 函数的的时候,第二个参数就是填 DLL 接口函数名,
1.我想高手们解析一下上面那句代码第二个参数是什么意思?
2.相对的 DLL 里面是怎么实现这个接口的?如果有 Borlndmm.dll 的源代码贴出来就最好
了!
 
用eXeScope看了一下Borlndmm.dll

导出, borlndmm.dll
序号 地址 名称
0000000C 00D24BDC @Borlndmm@HeapAddRef$qqrv
0000000B 00D24BE8 @Borlndmm@HeapRelease$qqrv
00000009 00D244F4 @Borlndmm@SysFreeMem$qqrpv
0000000A 00D24360 @Borlndmm@SysGetMem$qqri
00000008 00D2487C @Borlndmm@SysReallocMem$qqrpvi
00000004 00D24C14 DumpBlocks
00000006 00D23100 FreeMemory
00000002 00D24C04 GetAllocMemCount
00000001 00D24C0C GetAllocMemSize
00000003 00D24954 GetHeapStatus
00000007 00D230F0 GetMemory
00000005 00D23118 ReallocMemory
 
这个应该说明'@Borlndmm@SysGetMem$qqri'就是一个函数名而已
 
函数名应该不能包含 @、$ 这些非法字符,这应该不是简单的函数名而已。
 
没人回答,只能自己顶一下了。
 
>>函数名应该不能包含 @、$ 这些非法字符,这应该不是简单的函数名而已。
C++编译出的DLL有时会出现这些字符,确实是函数名
 
嗯,如果该 DLL 不是用 Delphi 编译的,那 @Borlndmm@SysGetMem$qqri 很可能也是函数名了。
我除了 VB 和 Delphi ,其它语言就不太懂了。
不知道用这么特别的函数名究竟有什么意义呢?函数名里面含有 @ $ 这些特殊字符应该也有它的特殊作用吧?
 
这些是修饰名,不同的编译器修饰名可能不同,修饰名包含下列信息
Visual C++ 概念:生成 C/C++ 程序
C++ 修饰名的格式

C++ 函数的修饰名包含下列信息:

函数名。

函数所属的类(如果函数是成员函数)。这可能包括封装函数的类的类,等等。

函数所属的命名空间(如果函数是某个命名空间的组成部分)。

函数的参数类型。

调用约定。

函数的返回类型。

函数名和类名在修饰名中以代码形式存在。修饰名的其余部分是仅对编译器和链接器具有内部意义的代码。下面是未修饰的和修饰的 C++ 名称的示例。


未修饰名 修饰名
int a(char){int i=3;return i;};
?a@@YAHD@Z

void __stdcall b::c(float){};
?c@b@@AAGXM@Z
.

我以前看过一遍关于修饰名格式的文档的, 现在又想不起名称,晕[:(!]
 
找到了几遍关于修饰名格式的文章
http://www.microsoft.com/china/community/program/originalarticles/techdoc/dll.mspx
http://dev.csdn.net/develop/article/25/25143.shtm
http://dev.csdn.net/develop/article/25/25142.shtm

其实一般情况下很少用 一个函数的修饰名来调用一个函数。 不过不排出有操作的人输出了这以 修饰名为函数名的函数
 
谢谢各位!
 
多人接受答案了。
 
后退
顶部