有关DDE服务器内存泄漏的问题

dalishuishougx 2003-10-18 09:20:16
我的程序在DDE服务器端有内存泄漏问题.
只能用如下连接方式.
如何修改DDE服务器程序?
////////////////////////////////////////////
DDE服务器
////////////////////////////////////////////
CDdeServer2Dlg *s_DlgPtr;
DWORD m_lpServiceIdinst=0;
float s_pOutArray;

void CDdeServer2Dlg::DdeServerInit()
{
if(DMLERR_NO_ERROR==DdeInitialize(&m_lpServiceIdinst,DdeCallBack2,APPCMD_FILTERINITS,0))
{
HSZ hszService;
hszService=DdeCreateStringHandle(m_lpServiceIdinst,"NServer",CP_WINANSI);

DdeNameService(m_lpServiceIdinst,hszService,NULL,DNS_REGISTER);
DdeFreeStringHandle(m_lpServiceIdinst,hszService);

}
}

BOOL CDdeServer2Dlg::OnInitDialog()
{
............

m_lpServiceIdinst=0;
DdeServerInit();
.................
return TRUE;
}
void CDdeServer2Dlg::OnClose()
{
...............
DDeClose(); //终止服务
..............
CDialog::OnClose();
}
void CDdeServer2Dlg::FloatToTCHAR(float fValue, int nCount, int *pDataLength)
{

char *pBuffer;
int i,j=0;
_gcvt(fValue,10,s_Out);
s_Out[10]='\0';
pBuffer=s_Out;
for( i=0;i<10;i++)
{
j++;
if(*(pBuffer+i)=='.')
break;
}
j=j+nCount;
*pDataLength=j;
s_Out[j]='\0';
}
void CDdeServer2Dlg::SendData()
{
FloatToTCHAR(s_pOutArray,4,&m_nDataLength);
s_Out1[0]='1';
s_Out1[1]='\0';

}

void CDdeServer2Dlg::DDeClose()
{
DdeUninitialize(m_lpServiceIdinst);
m_lpServiceIdinst=0;
}

void CDdeServer2Dlg::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 0:
{
SendData();
break;
}

}
CDialog::OnTimer(nIDEvent);
}

HDDEDATA CALLBACK DdeCallBack2(....)
{
switch(uType)
{
case XTYP_CONNECT:
{
char szBuffer[16];
DdeQueryString(::s_DlgPtr->m_lpServiceIdinst,hsz2,szBuffer,sizeof(szBuffer),0);
if(strcmp(szBuffer,"NServer")!=0)
return FALSE;

DdeQueryString(::s_DlgPtr->m_lpServiceIdinst,hsz1,szBuffer,sizeof(szBuffer),0);
if(strcmp(szBuffer,"NTopic1")!=0)
return FALSE;

return (HDDEDATA)TRUE;
}
case XTYP_POKE:
{
char szInBuffer[16],szInBuffer1[16];
BYTE s_Byte[10];

DdeQueryString(::s_DlgPtr->m_lpServiceIdinst,hsz1,szInBuffer,sizeof(szInBuffer),0);
DdeQueryString(::s_DlgPtr->m_lpServiceIdinst,hsz2,szInBuffer1,sizeof(szInBuffer1),0);
if(strcmp(szInBuffer,"NTopic1")==0)
{
if(strcmp(szInBuffer1,"ToServerItem1")==0)
{
DdeGetData(hData,s_Byte,10,0);
memcpy(::s_DlgPtr->s_In,s_Byte,8);
DdeFreeDataHandle(hData);
return (HDDEDATA)DDE_FACK;
}

}
else return (HDDEDATA) DDE_FNOTPROCESSED;
}
case XTYP_REQUEST:
{

HDDEDATA s_Data,s_Data1;
char szBuffer[16],szBuffer1[16];

DdeQueryString(::s_DlgPtr->m_lpServiceIdinst,hsz2,szBuffer1,sizeof(szBuffer1),0);

if(strcmp(szBuffer1,"OutItem1")==0)
{
HSZ hszServiceItem;
hszServiceItem=DdeCreateStringHandle(::s_DlgPtr->m_lpServiceIdinst,"OutItem1",CP_WINANSI);
memcpy(szBuffer,(LPTSTR)::s_DlgPtr->s_Out,::s_DlgPtr->m_nDataLength);
szBuffer[::s_DlgPtr->m_nDataLength]='\0';
s_Data=DdeCreateDataHandle(::s_DlgPtr->m_lpServiceIdinst,(LPBYTE)szBuffer,::s_DlgPtr->m_nDataLength,0,hszServiceItem,CF_TEXT,0);
if(s_Data==0L)
{
DdeFreeStringHandle(::s_DlgPtr->m_lpServiceIdinst,hszServiceItem);
return NULL;
}
else
{
HSZ hszServiceTopic;
hszServiceTopic=DdeCreateStringHandle(::s_DlgPtr->m_lpServiceIdinst,"NTopic1",CP_WINANSI);
DdePostAdvise(::s_DlgPtr->m_lpServiceIdinst,hszServiceTopic,hszServiceItem);
DdeFreeStringHandle(::s_DlgPtr->m_lpServiceIdinst,hszServiceTopic);
DdeFreeStringHandle(::s_DlgPtr->m_lpServiceIdinst,hszServiceItem);
return s_Data;
}
}


break;
}
case XTYP_DISCONNECT:
{
break;
}
case XTYP_CONNECT_CONFIRM:
{
break;
}
case XTYP_ADVSTART:
return (HDDEDATA)TRUE;
}
return NULL;
}
/////////////////////////////////////////////////////////////////////////
DDE客户端
///////////////////////////////////
HCONV m_nClientHconv;
DWORD m_lpClientIdinst;

HCONV CDDETestDlg::DDEInitiate(char *pServerName,char *pTopicName)
{
HCONV nClientHconv;
HSZ hszClient,hszClientTopic;
if(DMLERR_NO_ERROR==DdeInitialize(&m_lpClientIdinst,DdeCallBack1,APPCMD_CLIENTONLY,0))
{
hszClient=DdeCreateStringHandle(m_lpClientIdinst,pServerName,CP_WINANSI);
hszClientTopic=DdeCreateStringHandle(m_lpClientIdinst,pTopicName,CP_WINANSI);

nClientHconv=DdeConnect(m_lpClientIdinst,hszClient,hszClientTopic,NULL);

if(nClientHconv!=0)
{
DdeFreeStringHandle(m_lpClientIdinst,hszClientTopic);
DdeFreeStringHandle(m_lpClientIdinst,hszClient);
return nClientHconv;
}
else
return 0;
}
else
return 0;
}

void CDDETestDlg::DDEPoke(HCONV hConv, char *pItem, char *pValue)
{
BYTE lpOutData[16];
HSZ hszClientOutItem;
memcpy(lpOutData,pValue,8);
lpOutData[8]='\0';
hszClientOutItem=DdeCreateStringHandle(m_lpClientIdinst,pItem,CP_WINANSI);
DdeClientTransaction(lpOutData,8L,hConv,hszClientOutItem,CF_TEXT,XTYP_POKE,20,NULL);
DdeFreeStringHandle(m_lpClientIdinst,hszClientOutItem);
}

char * CDDETestDlg::DDERequest(HCONV hConv, char *pItem)
{
BYTE s_Byte[16];
char buffer[10];
HDDEDATA DdeClientData;
HSZ hszClientItem;

hszClientItem=DdeCreateStringHandle(m_lpClientIdinst,pItem,CP_WINANSI);
DdeClientData=DdeClientTransaction(NULL,NULL,hConv,hszClientItem,CF_TEXT,XTYP_REQUEST,20,NULL);
if(DdeClientData!=0)
{
DdeGetData(DdeClientData,s_Byte,16,0);
memcpy(buffer,s_Byte,8);
buffer[8]='\0';
DdeFreeDataHandle(DdeClientData);
DdeFreeStringHandle(m_lpClientIdinst,hszClientItem);
return buffer;
}
else
{
DdeFreeDataHandle(DdeClientData);
DdeFreeStringHandle(m_lpClientIdinst,hszClientItem);
return NULL;
}
}

void CDDETestDlg::DDETerminate(HCONV hConv)
{
DdeDisconnect(hConv);
DdeUninitialize(m_lpClientIdinst);
m_lpClientIdinst=0;
}



void CDDETestDlg::OnTimer(UINT nIDEvent)
{
m_nClientHconv=DDEInitiate("NServer","NTopic1");
if(m_nClientHconv!=0)
{

SendData();
ReceiveData();

DDETerminate(m_nClientHconv);
}
CDialog::OnTimer(nIDEvent);
}

void CDDETestDlg::SendData()
{
char buffer[10];
//float m_fAp已赋值
_gcvt(m_fAp,8,buffer);
buffer[8]='\0';
DDEPoke(m_nClientHconv,"ToServerItem1", buffer);

}

void CDDETestDlg::ReceiveData()
{
char *buffer,buffer2[10];
buffer=DDERequest(m_nClientHconv, "OutItem1");
memcpy(buffer2,buffer,8);
m_fop=(float)atof(buffer2);

}

HDDEDATA CALLBACK DdeCallBack1(...)
{
return NULL;
}
...全文
46 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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