DLL动态加载找不到函数指针

假正经的班长 2011-07-12 02:28:38
HMODULE hModule;
hModule=LoadLibrary("MyDLLTest_1.dll");
if(hModule == NULL)
{
MessageBox("加载动态库失败");
return;
}

typedef void (*FUN)(char *chr);
FUN Welcome_1;
Welcome_1 = (FUN)GetProcAddress(hModule, "Welcome");
if(Welcome_1 == NULL)
{
MessageBox("获得函数指针错误");
DWORD dw = GetLastError();
return;
}

char chr[] = "DLL显示加载成功";
Welcome_1(chr);

FreeLibrary(hModule);

这个DLL文件没问题的,用添加头文件和Lib的方式可以调用里边的一个Welcome函数,原型是:
MYDLLTEST_1_API void Welcome(char *chr)
{
MessageBox(NULL, chr, "Welcome", MB_OK);
}

但是用开头那段代码确实一直输出获得函数指针错误,小弟第一次用DLL,不知道哪里出错了,希望大家指点一下
...全文
278 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在def中写出导出的函数名
frog845 2011-07-12
  • 打赏
  • 举报
回复
支持楼上的。孙鑫 的 VC上有
dfasri 2011-07-12
  • 打赏
  • 举报
回复
没错, 叫DEF...搞错了. 不好意思. DEF添加进去是要在工程属性里面加的, 具体查查网吧
假正经的班长 2011-07-12
  • 打赏
  • 举报
回复
DEF文件如何添加进去,用#include "*.def"吗?
dfasri 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cjqpker 的回复:]

引用 5 楼 dfasri 的回复:
DLL导出的函数, 你采用什么版本编译的? VS2010要手工指明lib文件的, VC6就加入工程会自动弄.


VS2008 啊,那如何让导出文件名不发生改变?DLL原型:
#ifdef MYDLLTEST_1_EXPORTS
#define MYDLLTEST_1_API __declspec(dllexport)
#else
#defi……
[/Quote]
手工写个LIB文件, 然后在工程属性里面指明采用这个LIB文件就可以了. 设置自己Google下, 我忘记了
假正经的班长 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoc1026 的回复:]
引用 4 楼 cjqpker 的回复:
函数名:?Welcome@@YAXPAD@Z
怎么会是这个?那我之前用添加LIB和.h文件怎么就可以用Welcome这个函数啊?


静态调用,有lib文件描述函数的地址,不用通过函数名获取地址。

你可以修改DLL再导出函数前面加上 extern "C"
[/Quote]

我在文件开头改成了
#ifdef MYDLLTEST_1_EXPORTS
#define MYDLLTEST_1_API extern "C" __declspec(dllexport)
#else
#define MYDLLTEST_1_API extern "C" __declspec(dllimport)
#endif

结果出现了class MYDLLTEST_1_API CMyDLLTest_1 如下错误:“class”: 缺少标记名
fangchao918628 2011-07-12
  • 打赏
  • 举报
回复
用def文件导出函数
或者你调用的时候把函数名改成:?Welcome@@YAXPAD@Z
见习学术士 2011-07-12
  • 打赏
  • 举报
回复 1
[Quote=引用 4 楼 cjqpker 的回复:]
函数名:?Welcome@@YAXPAD@Z
怎么会是这个?那我之前用添加LIB和.h文件怎么就可以用Welcome这个函数啊?
[/Quote]

静态调用,有lib文件描述函数的地址,不用通过函数名获取地址。

你可以修改DLL再导出函数前面加上 extern "C"
假正经的班长 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dfasri 的回复:]
DLL导出的函数, 你采用什么版本编译的? VS2010要手工指明lib文件的, VC6就加入工程会自动弄.
[/Quote]

VS2008 啊,那如何让导出文件名不发生改变?DLL原型:
#ifdef MYDLLTEST_1_EXPORTS
#define MYDLLTEST_1_API __declspec(dllexport)
#else
#define MYDLLTEST_1_API __declspec(dllimport)
#endif

// 此类是从 MyDLLTest_1.dll 导出的
class MYDLLTEST_1_API CMyDLLTest_1 {
public:
CMyDLLTest_1(void);
// TODO: 在此添加您的方法。
void MyFun(void);
};

extern MYDLLTEST_1_API int nMyDLLTest_1;

MYDLLTEST_1_API int fnMyDLLTest_1(void);

MYDLLTEST_1_API void Welcome(char* chr); /*CJQ添加的Welcome函数声明*/
dfasri 2011-07-12
  • 打赏
  • 举报
回复
DLL导出的函数, 你采用什么版本编译的? VS2010要手工指明lib文件的, VC6就加入工程会自动弄.
假正经的班长 2011-07-12
  • 打赏
  • 举报
回复
函数名:?Welcome@@YAXPAD@Z
怎么会是这个?那我之前用添加LIB和.h文件怎么就可以用Welcome这个函数啊?
见习学术士 2011-07-12
  • 打赏
  • 举报
回复
代码没问题,可以用DEPENDS工具查看一下这个DLL的导出函数名
fangchao918628 2011-07-12
  • 打赏
  • 举报
回复
MYDLLTEST_1_API是怎么定义的
用depends看下你的导出函数是否是Welcome
lesgo 2011-07-12
  • 打赏
  • 举报
回复
Welcome_1 = (FUN)GetProcAddress(hModule, "_Welcome");
加个下划线看看

15,471

社区成员

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

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