获取DLL函数地址问题

smdszgzh 2009-07-24 03:13:55

HINSTANCE hDll;
hDll=LoadLibrary("socket.dll");
if(NULL==hDll)
{
ShowMessage("加载DLL失败……");
}
typedef int (*lpDll)(long _overtime,AnsiString Params,AnsiString *message);
lpDll lpSocketData=(lpDll)GetProcAddress(hDll,"SocketData");
if(NULL==lpSocketData)//加载没问题,获取这个函数地址是老失败
{
ShowMessage("获取函数地址失败……");
return;
}
//Dll 文件里的函数声明和定义如下





extern "C" __declspec(dllexport) int __stdcall SocketData(long _overtime,AnsiString Params,AnsiString *message);


int __stdcall SocketData(long _overtime,AnsiString Params,AnsiString *message)
{
do something;
}
...全文
311 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaohongbo83 2009-07-28
  • 打赏
  • 举报
回复
应该是函数的导出有问题吧!但是函数的调用方式要保持一致 要加上 _stdcall
fandouC 2009-07-27
  • 打赏
  • 举报
回复
hDll=LoadLibrary("socket.dll");
写上"socket.dll"的绝对路径看
yyunffu 2009-07-27
  • 打赏
  • 举报
回复
上面有个错:
函数指针这么定义:
typedef int (__stdcall *lpDll)(long _overtime,AnsiString Params,AnsiString *message);

注意你的DLL中的函数一定要用模块定义文件导出。否则调用约定仍然会影响名字改编。
yyunffu 2009-07-27
  • 打赏
  • 举报
回复

你应该用模块定义文件导出函数,以免调用约定影响你的调用。
yyunffu 2009-07-27
  • 打赏
  • 举报
回复
调用约定问题。
把函数指针改为:
typedef int __stdcall (*lpDll)(long _overtime,AnsiString Params,AnsiString *message);
cyldf 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 stivenjia 的回复:]
extern "C" __declspec(dllexport) int __stdcall SocketData(long _overtime,AnsiString Params,AnsiString *message);

就算这么写导出符号也不是SocketData,而是SocketData@16类似这种东西。所以需要用def描述一下。
[/Quote]
写.def文件是一种方式
stivenjia 2009-07-24
  • 打赏
  • 举报
回复
extern "C" __declspec(dllexport) int __stdcall SocketData(long _overtime,AnsiString Params,AnsiString *message);

就算这么写导出符号也不是SocketData,而是SocketData@16类似这种东西。所以需要用def描述一下。
cyldf 2009-07-24
  • 打赏
  • 举报
回复

int __stdcall __declspec(dllexport)SocketData(long _overtime,AnsiString Params,AnsiString *message)
{
do something;
}

wltg2001 2009-07-24
  • 打赏
  • 举报
回复
关键的问题是DLL中是不是导出了相关的函数,你自己用工具看一下DLL中SocketData是不是导出了。
marrco2005 2009-07-24
  • 打赏
  • 举报
回复
有3个地方需要改:
1.
HINSTANCE hDll;
hDll=LoadLibrary("socket.dll");
if(NULL==hDll)
{
ShowMessage("加载DLL失败……");
}
typedef int (__stdcall *lpDll)(long _overtime,AnsiString Params,AnsiString *message);
lpDll lpSocketData=(lpDll)GetProcAddress(hDll,"SocketData");
if(NULL==lpSocketData)//加载没问题,获取这个函数地址是老失败
{
ShowMessage("获取函数地址失败……");
return;
}
//Dll 文件里的函数声明和定义如下


2.
在dll的工程里找到 .def 文件
加上红色字体的部分
; dlltest.def : Declares the module parameters for the DLL.

LIBRARY "dlltest"

EXPORTS
; Explicit exports can go here

SocketData

3 这个可能需要改,改了肯定没问题
dll 导出函数
extern "C" __declspec(dllexport) int __stdcall SocketData(long _overtime,AnsiString Params,AnsiString *message)
{
do something;
}
smdszgzh 2009-07-24
  • 打赏
  • 举报
回复
楼上不可行!
jeremyxuzz 2009-07-24
  • 打赏
  • 举报
回复
typedef int (*lpDll)(long _overtime,AnsiString Params,AnsiString *message);
lpDll lpSocketData=(lpDll)GetProcAddress(hDll,"SocketData");

把 typedef 这个词去掉。
或者 :
lpDll tempLpDll;
tempLpDll lpSocketData=(lpDll)GetProcAddress(hDll,"SocketData");

15,471

社区成员

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

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