dll初学者第一个dll就没调通

aimsam 2011-10-15 05:24:53
/* 文件名:lib.h */
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x, int y);
#endif
#include "lib.h"
int add(int x, int y)
{
return x + y;
}


然后调用程序

// calldll.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "windows.h"

typedef int(*lpAddFun)(int, int);

int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDll;//dll hwnd
lpAddFun addFun;//
hDll = LoadLibrary(L"unmfcdll.dll");
addFun = (lpAddFun)GetProcAddress(hDll, "add");

addFun(2,3);
printf("ddd=");
FreeLibrary(hDll);
system("pause");
return 0;
}





addFun返回值为0。之后用depends打开unmfcdll.dll里面貌似根本就没有add这个方法。
...全文
102 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kaile 2011-10-18
  • 打赏
  • 举报
回复
LoadLibrary 比较麻烦,可以用lib库静态加载方式来加载DLL
jixiang1983 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 buyong 的回复:]
C/C++ code

//#ifndef LIB_H
//#define LIB_H
extern "C" __declspec(dllexport) int add(int x, int y);
//#endif
[/Quote]
++
使用extern "C" 后应该不存在名字改编的问题。
LZ可在这两句前打断点调试看看hDll、addFun是否为空
hDll = LoadLibrary(L"unmfcdll.dll");
addFun = (lpAddFun)GetProcAddress(hDll, "add");
aimsam 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xintianyou_ 的回复:]

把addFun = (lpAddFun)GetProcAddress(hDll, "add");中的"add"换成"_add"试试,,,
[/Quote]
还是不行呢。。addFun依然为空。
是dll那错了吧。。求破高手些。。。
zhouzhipen 2011-10-17
  • 打赏
  • 举报
回复
如果用打算用LoadLibrary加载DLL,那就用def文件来控制输入函数的名字与真实函数名一致.
def文件模板:

LIBRARY "test"
EXPORTS
//输出函数定义
函数名 序号,可以随意但不要重复
Test1 @1
add @2

如果不是用VC6建立def文件后还需要在项目中设置一下:
[项目属性]->[链接器]->[输入]->[模块定义文件]->输入你的DEF文件名.
saiyaman5 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 buyong 的回复:]

C/C++ code

//#ifndef LIB_H
//#define LIB_H
extern "C" __declspec(dllexport) int add(int x, int y);
//#endif
[/Quote]

是这么写。
buyong 2011-10-17
  • 打赏
  • 举报
回复

//#ifndef LIB_H
//#define LIB_H
extern "C" __declspec(dllexport) int add(int x, int y);
//#endif
zxdyu2009 2011-10-17
  • 打赏
  • 举报
回复

/* 文件名:lib.h */
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x, int y);
#endif

#endif
写到文件尾
龙行天下之Sky 2011-10-17
  • 打赏
  • 举报
回复
名称应该是"_add@8"
你试一下
龙行天下之Sky 2011-10-17
  • 打赏
  • 举报
回复
addFun = (lpAddFun)GetProcAddress(hDll, "add");
这里应该不是add了,你导出的时候如果没有用def文件重新定义,则肯定不是add
你用dumpbin命令查看一下dll导出的具体方法名
用法:dumpbin /exports dll文件名
shiyunqiang 2011-10-17
  • 打赏
  • 举报
回复
add的实现函数使用下面的代码试试:

extern "C" __declspec(dllexport) int add(int x, int y)
{
return x + y;
}
fengbingchun 2011-10-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/fengbingchun/article/details/6082822
xintianyou_ 2011-10-15
  • 打赏
  • 举报
回复
把addFun = (lpAddFun)GetProcAddress(hDll, "add");中的"add"换成"_add"试试,,,

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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