我是这样做的,建立一个基于对话框的程序
然后将我所需要的函数变量设成全局变量
typedef void (*AddFunc)(int,BYTE);
AddFunc _DlPortWritePortUchar;
在OnInitDialog()中
{
...... hInstLibrary = LoadLibrary("DLPORTIO.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
_DlPortWritePortUchar = (AddFunc)GetProcAddress(hInstLibrary, "DlPortWritePortUchar");
if (_DlPortWritePortUchar == NULL)
{
FreeLibrary(hInstLibrary);
}.........
}hInstLibrary已经被我定义成该对话框的成员变量之后将_DlPortWritePortUchar封装
void CMy111Dlg::DriveCard(int port, BYTE value)
{
_DlPortWritePortUchar(port,0xAA); //start
Sleep(20); _DlPortWritePortUchar(port,0x00); //command: 00->write, 01->read,02->
Sleep(20); _DlPortWritePortUchar(port,0x20); //address: high
Sleep(20); _DlPortWritePortUchar(port,0x00); //address:low
Sleep(20); _DlPortWritePortUchar(port,0x01); //length
Sleep(20);
_DlPortWritePortUchar(port,value);//random(257));
}
经跟踪测试第一次调用就出现内存溢出的错误.
请各位指点,我哪里错了?
然后将我所需要的函数变量设成全局变量
typedef void (*AddFunc)(int,BYTE);
AddFunc _DlPortWritePortUchar;
在OnInitDialog()中
{
...... hInstLibrary = LoadLibrary("DLPORTIO.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
_DlPortWritePortUchar = (AddFunc)GetProcAddress(hInstLibrary, "DlPortWritePortUchar");
if (_DlPortWritePortUchar == NULL)
{
FreeLibrary(hInstLibrary);
}.........
}hInstLibrary已经被我定义成该对话框的成员变量之后将_DlPortWritePortUchar封装
void CMy111Dlg::DriveCard(int port, BYTE value)
{
_DlPortWritePortUchar(port,0xAA); //start
Sleep(20); _DlPortWritePortUchar(port,0x00); //command: 00->write, 01->read,02->
Sleep(20); _DlPortWritePortUchar(port,0x20); //address: high
Sleep(20); _DlPortWritePortUchar(port,0x00); //address:low
Sleep(20); _DlPortWritePortUchar(port,0x01); //length
Sleep(20);
_DlPortWritePortUchar(port,value);//random(257));
}
经跟踪测试第一次调用就出现内存溢出的错误.
请各位指点,我哪里错了?
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
// 这里应该直接return了,因为一旦dll都调用不到,更别提下面的
// 取函数地址了,所以,取函数地址一定会异常
AfxMessageBox("Load library failure!");
return -1;
} _DlPortWritePortUchar = (AddFunc)GetProcAddress(hInstLibrary, "DlPortWritePortUchar");
if (_DlPortWritePortUchar == NULL)
{
FreeLibrary(hInstLibrary);
}
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}?????句柄没得到却要释放句柄????哪有东西叫你释放啊,肯定会发生内存错误了.这个是你自己的逻辑错误.现在应该知道怎么改了吧!!!
/*******************************************************************************************/
如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。 Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h):
#define CALLBACK __stdcall //这就是传说中的回调函数#define WINAPI __stdcall //这就是传说中的WINAPI#define WINAPIV __cdecl#define APIENTRY WINAPI //DllMain的入口就在这里#define APIPRIVATE __stdcall#define PASCAL __stdcall
在lib.h中,应这样声明add函数:
int __stdcall add(int x, int y);
在应用工程中函数指针类型应定义为:
typedef int(__stdcall *lpAddFun)(int, int);
若在lib.h中将函数声明为__stdcall调用,而应用工程中仍使用typedef int (* lpAddFun)(int,int),运行时将发生错误(因为类型不匹配,在应用工程中仍然是缺省的__cdecl调用).
/*******************************************************************************************/
解决方法就是在文章所指位置加上__stdcall
这篇文章也是我前一段时间看到过,收藏在夹子里的,今天一翻竟然找到解决问题的方法了.这不知道我要不是那么随意一翻,我的程序要改到什么时候.强烈大家推荐看一下这篇:"VC++动态链接库(DLL)编程深入浅出 "我也要再看一遍.最后,谢谢大家热心帮助!