我是这样做的,建立一个基于对话框的程序
然后将我所需要的函数变量设成全局变量 
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));
}
经跟踪测试第一次调用就出现内存溢出的错误.
请各位指点,我哪里错了?

解决方案 »

  1.   

    hInstLibrary = LoadLibrary("DLPORTIO.dll");
    if (hInstLibrary == NULL) 
    {   
    FreeLibrary(hInstLibrary); 
                     // 这里应该直接return了,因为一旦dll都调用不到,更别提下面的
                     // 取函数地址了,所以,取函数地址一定会异常
                     AfxMessageBox("Load library failure!");
                     return -1;
    } _DlPortWritePortUchar = (AddFunc)GetProcAddress(hInstLibrary, "DlPortWritePortUchar");
    if (_DlPortWritePortUchar == NULL) 
    {   
    FreeLibrary(hInstLibrary); 
    }
      

  2.   

    试过了,没有弹出Load library failure!
      

  3.   

    有没有搞错啊!楼主写的程序怎么是这样的??
    if (hInstLibrary == NULL) 
    {   
    FreeLibrary(hInstLibrary); 
    }?????句柄没得到却要释放句柄????哪有东西叫你释放啊,肯定会发生内存错误了.这个是你自己的逻辑错误.现在应该知道怎么改了吧!!!
      

  4.   

    虽然有点逻辑问题,但是我想如果掉dll能调成功的话,这个问题是不会影响我的吧?
      

  5.   

    错误找到了,是从一文章里找到的,截取关键部分如下:
    /*******************************************************************************************/
    如果通过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)编程深入浅出 "我也要再看一遍.最后,谢谢大家热心帮助!