首页
社区
课程
招聘
[旧帖] [求助]关于dll导出函数命名的疑问(已解决) 0.00雪花
发表于: 2009-3-23 11:16 4337

[旧帖] [求助]关于dll导出函数命名的疑问(已解决) 0.00雪花

2009-3-23 11:16
4337
在VC6.0下,建立WIN32动态链接库(File  -> new  ->  project -> Win32 Dynamic-Link Library),再新建一个cpp文件,

输入如下代码(记为代码1):
#include <math.h>

extern "C" 
double __declspec(dllexport) mysqrt (double x)
{
  return sqrt (x);
}

编译,链接后生成一个dll,使用VC自带的工具Dependency Walker查看该dll。发现其导出函数名为mysqrt。

如果输入如下代码(记为代码2):
#include <math.h>

extern "C" 
double __declspec(dllexport) __stdcall mysqrt (double x)
{
  return sqrt (x);
}

发现生成的dll的导出函数名为_mysqrt@8。

两段代码唯一的区别是:代码2比代码1多了__stdcall(代码1默认为__cdecl)。
我又另外建立了一个测试dll的工程(新建控制台应用程序,将上面由代码2生成的dll拷贝到该工程的文件夹下面),再新建

一个cpp文件,输入如下代码(记为代码3):
#include <stdio.h>
#include <windows.h>

typedef double (__stdcall *pfun) (double);//__stdcall等价于WINAPI

int main()
{
  HINSTANCE hdll = LoadLibrary ("mydll.dll");//dll名字可以修改为你的电脑上刚刚生成的dll的名字
  if (hdll != NULL)
  {
    pfun pf = (pfun)GetProcAddress (hdll, "_mysqrt@8");
    if (pf != NULL)
    {
      printf ("%lf\n", pf (2.0));
    }
    else
    {
      printf ("mydll.dll中找不到函数mysqrt!!\n");
    }
    FreeLibrary (hdll);
  }
  else
  {
    printf ("动态加载mydll.dll失败!!\n");
  }
  return 0;
}

编译、链接成功,程序输出
1.414214
Press any key to continue

(说了这么多,有点啰嗦。下面提问哈)
我的疑问:windows下的api大多采用__stdcall,但是它的函数名都没有_@8之类的前后缀。它是怎么做到的呢?或者换个问法,我如何在VC6.0下建立一个dll,该dll的输出函数采用__stdcall调用方式,但是函数名没有_@8之类的前后缀。
(给出示例代码最好,谢谢大家了O(∩_∩)O~)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
mark一下,我也想了解
2009-3-23 11:19
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请使用def文件定义导出函数名。

我用的VC2005,新建一个abc.def
里面写
LIBRARY "abc"

EXPORTS
mysqrt


把abc换成你的工程名字,然后在Project > Properties... > Linker > Input > Module Definition File里面加入你刚才的那个def文件,重新编译就行了。出来的dll函数前面没有下划线,后面没有@8或者@ABCDEF之类的。
2009-3-23 12:14
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
谢谢啊
这个方法可行O(∩_∩)O~
2009-3-23 13:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
dll 文件如何破解?
2009-3-23 15:02
0
游客
登录 | 注册 方可回帖
返回
//