-
-
[旧帖]
[求助]关于dll导出函数命名的疑问(已解决)
0.00雪花
-
发表于:
2009-3-23 11:16
4337
-
[旧帖] [求助]关于dll导出函数命名的疑问(已解决)
0.00雪花
在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直播授课