免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8903 | 回复: 15
打印 上一主题 下一主题

请问我写的DLL怎么看不到导出的函数呢?  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-17 13:43 |只看该作者 |倒序浏览
我创建了一个Func工程,下面是Func.cpp的代码:

// Func.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"

extern   "C" int  WINAPI Add(int,int);

int WINAPI Add(int a, int b)
{
    return a+b;
}

dllmain.cpp的代码:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}


为什么只生成Func.dll,没有Func.lib,并且用depends打开dll看不到Add这个函数,里面都是空的。还请大家帮忙找找原因,谢谢了!
PS:Add的函数必须是WINAPI类型的。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-06-17 13:49 |只看该作者
用dllexport或者def文件等

论坛徽章:
0
3 [报告]
发表于 2010-06-17 13:55 |只看该作者
我创建了一个Func.def文件,内容如下:

LIBRARY  Func   
EXPORTS   
        Add  

不过还是没有效果呢~

论坛徽章:
0
4 [报告]
发表于 2010-06-17 14:06 |只看该作者
我改了一下代码:
extern   "C" _declspec(dllexport)  int WINAPI Add(int,int);
这样倒是也有Func.lib了,也能能看到dll的函数名称了,不过是_Add@8这样的,怎么样才能变成ADD呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2010-06-17 14:19 |只看该作者
link参数增加 /DEF:Func.def,用IDE编译的,把def加到项目中一般就自动会加上这个参数。

不用def文件,增加link参数 /EXPORT:Add

论坛徽章:
0
6 [报告]
发表于 2010-06-17 14:26 |只看该作者
找到原因了,从网上查了一下,VS2008、2005和VC6不同,需要自己制定以下,如下:

VS2005不一样,需要指定DEF文件,方法如下:


例如:
把 sqlite3.def 添加到工程中.

选择 工程 > 属性中的链接器,然后找到"输入"这一项. 在 "模块定义文件" 中输入  sqlite3.def

注意: 你需要在 Debug 和 Release 中都输入该项才行.

论坛徽章:
0
7 [报告]
发表于 2010-06-17 14:28 |只看该作者
本帖最后由 一见穿心 于 2010-06-17 14:32 编辑

// Func.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
//#include "Func.h"

extern   "C" __declspec(dllexport)  int WINAPI Add(int,int);

__declspec(dllexport) int WINAPI Add(int a, int b)
{
    return a+b;
}

奇怪啊?为什么这样就不行呢?查资料说是可以的啊?+_+

还望高人指点。呵呵~我希望能把两种方法都掌握了。呵呵~

论坛徽章:
0
8 [报告]
发表于 2010-06-17 14:35 |只看该作者
用extern "C"或者写def文件

论坛徽章:
0
9 [报告]
发表于 2010-06-17 14:35 |只看该作者
不过貌似那个是vc的名字修饰

论坛徽章:
0
10 [报告]
发表于 2010-06-17 14:41 |只看该作者
我采用def的方法现在是成功了,但是用__declspec(dllexport) 还是不行,网上说def文件就等同于extern   "C" __declspec(dllexport) ,不知道为什么会这样,继续研究……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP