小弟菜鸟,刚刚上手vc
现要编写一个DLL,用于调用IC卡访问的DLL,调用完成需返回一个char指针,请教各位大侠应该怎么写。
下面是我的源代码,但编译后在其他环境中调用时发生内存泄漏,不知如何解决!
40分是基本,解决得好再加!!*******************************************************************
.h
#ifdef ICCARD_EXPORTS
#define ICCARD_API __declspec(dllexport)
#else
#define ICCARD_API __declspec(dllimport)
#endifextern "C" char* __stdcall CallCard(__int16 AccessPort,unsigned long AccessBaud,unsigned char *Password);char *TransStr(char *DataChans)
{
char *Pnt;

Pnt = new char;
strcpy(Pnt,DataChans); return Pnt;
}*********************************************************************
*********************************************************************
.cpp
#include "stdafx.h"
#include "ICCard.h"BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
    }
    return TRUE;
}
char* __stdcall CallCard (__int16 AccessPort,unsigned long AccessBaud,unsigned char *Password)
{ HANDLE   ICDev;
__int16   RetValue;
const long   Length = 3;
const __int16 HexLength = 3,AscLength = 6;
unsigned char HexPassword[50];
char* DataA = NULL;
unsigned char DataB[100];
char* OutValue = NULL; HexPassword[0] = 0xff;
    HexPassword[1] = 0xff;
HexPassword[2] = 0xff; typedef HANDLE  (__stdcall *FUNCINIT)(__int16 port,unsigned long baud);
typedef __int16 (__stdcall *FUNCEXIT)(HANDLE icdev);
typedef __int32 (__stdcall *FUNCCHKBAUD)(__int16 port);
typedef __int16 (__stdcall *FUNCCHKCARD)(HANDLE icdev);
typedef __int16 (__stdcall *FUNCBEEP)(HANDLE icdev, __int16 time);
typedef __int16 (__stdcall *FUNCASCTOHEX)(unsigned char *asc, unsigned char *hex, long pair_len);
typedef __int16 (__stdcall *FUNCHEXTOASC)(unsigned char *hex,unsigned char *asc,long pair_len);
typedef __int16 (__stdcall *FUNCCHKPWD4442)(HANDLE icdev,__int16 len,unsigned char *hexpassword);
typedef __int16 (__stdcall *FUNCRDCARD4442)(HANDLE icdev,__int16 len,unsigned char *data_buffer); HINSTANCE hDLL;

FUNCINIT    FuncInit;
FUNCEXIT    FuncExit;
FUNCCHKBAUD    FuncChkBaud;
FUNCCHKCARD    FuncChkCard;
FUNCBEEP    FuncBeep;
FUNCASCTOHEX   FuncAscToHex;
FUNCHEXTOASC   FuncHexToAsc;
FUNCCHKPWD4442 FuncChkPwd4442;
FUNCRDCARD4442 FuncRdCard4442; hDLL = LoadLibrary("MWIC_32.DLL"); FuncInit    = (FUNCINIT)GetProcAddress(hDLL,"auto_init");
FuncExit    = (FUNCEXIT)GetProcAddress(hDLL,"ic_exit");
FuncChkBaud    = (FUNCCHKBAUD)GetProcAddress(hDLL,"chk_baud");
FuncChkCard    = (FUNCCHKCARD)GetProcAddress(hDLL,"chk_card");
FuncBeep    = (FUNCBEEP)GetProcAddress(hDLL,"dv_beep");
FuncAscToHex   = (FUNCASCTOHEX)GetProcAddress(hDLL,"asc_hex");
FuncHexToAsc   = (FUNCHEXTOASC)GetProcAddress(hDLL,"hex_asc");
FuncChkPwd4442 = (FUNCCHKPWD4442)GetProcAddress(hDLL,"csc_4442");
FuncRdCard4442 = (FUNCRDCARD4442)GetProcAddress(hDLL,"rsc_4442"); ICDev = FuncInit(AccessPort,AccessBaud); if (ICDev < 0)
{
FuncBeep(ICDev,1);
FuncBeep(ICDev,1);
FuncBeep(ICDev,10); return "-1";
}

FuncChkCard(ICDev);
*************************************************************************

解决方案 »

  1.   

    char *TransStr(char *DataChans)
    {
    char *Pnt;

    Pnt = new char; // 你在这里分配了内存,你可能没有释放他。
    strcpy(Pnt,DataChans); return Pnt;
    }
      

  2.   

    char *TransStr(char *DataChans)
    {
    char *Pnt;

    Pnt = new char;此处错误,需要申请空间的大小,如:Pnt=new char[100];
    strcpy(Pnt,DataChans);此处DataChans的大小不能超过Pnt申请的大小 return Pnt;//在返回后需要delete[] Pnt;
    }
      

  3.   

    把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL
      

  4.   

    如果事先知道大小或者知道最大值,则可以如下使用,在许多嵌入式编程中都不提倡这种小内存分配char *TransStr(char *DataChans)
    {
    char Pnt[SIZE];

    strcpy(Pnt,DataChans);此处DataChans的大小不能超过SIZE return Pnt;
    }
      

  5.   

    把函数改成这样应该好些
    char *TransStr(char *DataChans,int Size/*DataChans的大小*/)
    {
    char *Pnt;

    Pnt = new char[Size];
    strcpy(Pnt,DataChans); return Pnt;
    }int main()
    {
      char *a = new char[100];
      strcpy(a,"asdf");
      char *b = TransStr(a,101);
      //...
      delete[] b;
    }