我用VC ATL作了一组件,没有选中“Support MFC”,在参数输出时,输出数据为空,在方法里面,我写LOG都正常,但是在测试程序里面,返回的就不对了。不知道什么原因。请高手指点!!!方法实现:
STDMETHODIMP cryptcom::DCGetOutdata(BSTR *outdata)
{
BYTE  *data;
if(!(data = (BYTE*)malloc(100)))
{
return -1;
}
memset(data,'3',10); *outdata = SysAllocString((BSTR)data);
memset(logbuf,0,LOG_BUF_LEN);
sprintf(logbuf,"*outdata=[%s].",*outdata);
DEBUG_VAL_LOG(logbuf); return S_OK;
}测试程序部分代码:
void CTestDlg::OnT1() 
{
FILE *fp;
int ret,outdatalen,indatalen,i;
CString outdata;
Icryptcom tcom;
if(!tcom.m_lpDispatch)
{
ret = tcom.CreateDispatch(_T("dcserver.cryptcom"));
if(!ret)
{
AfxMessageBox("dcserver not found");
return;
}
TRACE("dcserver create complete\n");
} outdata = tcom.DCGetOutdata();
outdatalen = tcom.DCGetOutdataLen();

fp = fopen("c:\\1.dat","wb");
if ( fp == NULL )
{
AfxMessageBox("open file to write error");
return;
}
fwrite(outdata,1,outdatalen,fp);
fclose(fp); if(tcom.m_lpDispatch)
tcom.ReleaseDispatch();
}

解决方案 »

  1.   

    原因是SysAllocString调用失败。最根本的原因是你传递给SysAllocString()的参数data不是合法的const OLECHAR *。你应该像这样传参数过去SysAllocString(L"my string");
    WCHAR data[]={L'd', L'\0'};
    SysAllocString(data);
      

  2.   

    没看明白你在DCGetOutdata中干了些什么。但你这儿有错:
    你的BYTE  *data;
    *outdata = SysAllocString((BSTR)data);
    BSTR是双字节字串,data是单字节字串,这样是错误的,你要将char*转化到wchar*,用MultiByteToWideChar还有你的malloc没释放。
      

  3.   


    我的DCGetOutdata是一段测试的代码,为了简单,就这样贴了上去是的,我malloc没释放可是我在
    *outdata = SysAllocString((BSTR)data);
    后写的LOG的内容确实没错啊
    只是好像在函数返回时错了