调用DLL中函数出错

wangyuyuyu 2006-10-19 03:56:46
本人从MSDN上下载了一个串口通信DLL的,部分函数如下:

CWinThread* m_pThread; // 代表辅助线程
volatile BOOL m_bConnected;//表示连接否,用来标识菜单串口连接和断开连接是否可用
volatile HWND m_hTermWnd;//辅助窗口
volatile HANDLE m_hPostMsgEvent; // 用于WM_COMMNOTIFY消息的事件对象
OVERLAPPED m_osRead, m_osWrite; // 用于重叠读/写

// 串行口句柄
int m_nBaud;//数据传输速率
int m_nDataBits;//数据位
BOOL m_bEcho;//表明本地回显
BOOL m_bNewLine;//表明自动换行
int m_nParity;//校验位
CString m_sPort;//串行端口
int m_nStopBits;//停止位

HANDLE fp; //打印机句并
FILE *hp;

HANDLE _stdcall OpenConnection(int ipt)
{
HANDLE m_hCom;
COMMTIMEOUTS TimeOuts;
DCB dcb;
m_nBaud = 9600;
m_nDataBits = 8;
m_bEcho = FALSE;
m_bNewLine = FALSE;
m_nParity = 0;
m_sPort = "COM1";
m_nStopBits = 0;
。。。。。。
}

DWORD _stdcall ReadComm(HANDLE m_hCom,char* buf, DWORD dwLength)
{

DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
。。。。。。
}

DEF定义函数如下:
OpenConnection

ReadComm

WriteComm

CloseConnection

ClosePalPort

PalPortInit

PrnStr

open_hp

close_hp


我采用显性动态链接的方法调用
typedef void (*lpFun)(void);

HINSTANCE hDll;
hDll = LoadLibrary("port_dll.dll");
if (NULL==hDll)
{
MessageBox("DLL加载失败");
}

lpFun addFun;
lpFun pOpenConnection = (lpFun)GetProcAddress(hDll,"OpenConnection");
if (NULL==pOpenConnection)
{
MessageBox("DLL中函数寻找失败");
}
pOpenConnection();
}

结果出现错误:
The value of ESP was not properly saved across a function call.This is usually a result of calling a funcition decleared wiht one calling convention with a funtion pointer decleared with a different calling convention

高人给说下具体那里应该改改,调用我套用另外一个例子的,但是总出问题,刚开始学VC和MFC,遇到DLL算是头蒙了
...全文
290 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
thisisyjs 2006-10-26
  • 打赏
  • 举报
回复
typedef void (__stdcall *lpFun)(int);
xiahouyi 2006-10-26
  • 打赏
  • 举报
回复
是否标记为导出函数

如果不行就定义一个简单的函数试试
extern "C" __declspec(dllexport) void Fun(void);
那个OpenConnection作为dll内部函数使用
wangyuyuyu 2006-10-23
  • 打赏
  • 举报
回复
彻底头蒙,要么调用出错,要么没反应
wangyuyuyu 2006-10-21
  • 打赏
  • 举报
回复
按照楼上的写法也试过了,还是不行

这个DLL包括源码(名字:串口通信动态链接库)在CSDN的下载频道有,那个大大用VC6帮我写一个小的对话窗按钮调用初始化打开COM1 口的范例程序,感激不尽

wangyuyuyu 2006-10-20
  • 打赏
  • 举报
回复
看了一篇文章把工程设置中/GZ参数去掉,没有这个提示了

何解
DentistryDoctor 2006-10-20
  • 打赏
  • 举报
回复
The value of ESP was not properly saved across a function call.This is usually a result of calling a funcition decleared wiht one calling convention with a funtion pointer decleared with a different calling convention
调用约定的问题

正确的语法是
typedef void (__stdcall *lpFun)(void);
wangyuyuyu 2006-10-20
  • 打赏
  • 举报
回复
调用函数后要么没有反应,要不就是什么都不执行,要不就是系统报错
wangyuyuyu 2006-10-19
  • 打赏
  • 举报
回复
yigx007

照你说的做提示 语法错误 “(”,然后后边肯定跟着一堆语法错误

可以不用管我的调用方法,写一个你认为对的

碧螺春,我用的DLL貌似是RELEASE版本的
碧螺春的马甲 2006-10-19
  • 打赏
  • 举报
回复
另外还要注意 dll debug version and release version 的问题。
yjgx007 2006-10-19
  • 打赏
  • 举报
回复
可能是声明不对,调用失败,
试着改下 typedef void (*lpFun)(void);
变成:
typedef void __stdcall (*lpFun)(void);
如果不行,再试下:
typedef void __cdcel (*lpFun)(void);
碧螺春的马甲 2006-10-19
  • 打赏
  • 举报
回复
typedef void (*lpFun)(void);

是不是也要定义成 _stdcall 的

15,466

社区成员

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

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