小弟菜鸟,刚刚上手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);
*************************************************************************
现要编写一个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);
*************************************************************************
{
char *Pnt;
Pnt = new char; // 你在这里分配了内存,你可能没有释放他。
strcpy(Pnt,DataChans); return Pnt;
}
{
char *Pnt;
Pnt = new char;此处错误,需要申请空间的大小,如:Pnt=new char[100];
strcpy(Pnt,DataChans);此处DataChans的大小不能超过Pnt申请的大小 return Pnt;//在返回后需要delete[] Pnt;
}
{
char Pnt[SIZE];
strcpy(Pnt,DataChans);此处DataChans的大小不能超过SIZE return Pnt;
}
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;
}