读书人

问一个CoCreateInstance()的有关问题

发布时间: 2012-08-15 16:57:16 作者: rapoo

问一个CoCreateInstance()的问题
IKqProjection * CNewProjectedSystem::CreateProjection(void)
{
IKqProjectionPtr spKqProjection;
IKqProjectionParameterPtr spKqProjectionParameter;
HRESULT hr;
hr=spKqProjection.CreateInstance(__uuidof(KqProjection));
ASSERT(SUCCEEDED(hr));

CComboBox *pCombo=static_cast<CComboBox*>(GetDlgItem(IDC_PROJECT_PROJECTION_NAME));
ASSERT(pCombo!=NULL);
CString strKqProjectionName;
//获取椭球的名称
pCombo->GetWindowText(strKqProjectionName);

hr=spKqProjection->Init(strKqProjectionName.AllocSysString());
//添加所有的投影参数
int nItems=0;
CString strParamName,strParamValue;//投影参数名称与投影参数值
double value;
CListCtrl *pListParams=static_cast<CListCtrl*>(GetDlgItem(IDC_PROJ_PARAM));
ASSERT(pListParams!=NULL);
nItems=pListParams->GetItemCount();
//遍历每一个参数,并添加到投影中去
for (int i=0;i<nItems;i++)
{
strParamName=pListParams->GetItemText(i,0);
strParamValue=pListParams->GetItemText(i,1);
#ifdef _UNICODE
value=_wtof(strParamValue.GetBuffer());
#else
value=atof(strParamValue.GetBuffer());
#endif
spKqProjectionParameter=NULL;
hr=spKqProjectionParameter.CreateInstance(__uuidof(KqProjectionParameter));
ASSERT(SUCCEEDED(hr));
hr=spKqProjectionParameter->Init(strParamName.AllocSysString(),value);
ASSERT(SUCCEEDED(hr));
hr=spKqProjection->AddParam(spKqProjectionParameter);
ASSERT(SUCCEEDED(hr));
}
return spKqProjection.Detach();
}

请注意代码中的那个循环:
在每一次循环中的都会创建一个IKqProjectionParameter接口的组件,并且把它们加到IKqProjection中去,但是程序在执行的时候出了个问题:
第一次循环的时候spKqProjectionParameter.CreateInstance(__uuidof(KqProjectionParameter));,创建了一个IKqProjectionParameter对象,在调试时发现它的值为:0x01b3a940,这个是没有问题的,问题出在第二次循环中,当再次调用spKqProjectionParameter.CreateInstance(__uuidof(KqProjectionParameter))的时候却发现了一个奇怪的问题,这句执行完后,spKqProjectionParameter的值还是0x01b3a940,怎么跟第一次是一样的,于是程序导致了后面的AddParam()函数失败!
请问是什么原因造成的?

[解决办法]
难道用了object pooling?
[解决办法]
试试这样吧。
for (int i=0;i<nItems;i++)
{
IKqProjectionParameterPtr spKqProjectionParameter;strParamName=pListParams->GetItemText(i,0);
strParamValue=pListParams->GetItemText(i,1);
#ifdef _UNICODE
value=_wtof(strParamValue.GetBuffer());
#else
value=atof(strParamValue.GetBuffer());
#endif
spKqProjectionParameter=NULL;
hr=spKqProjectionParameter.CreateInstance(__uuidof(KqProjectionParameter));
ASSERT(SUCCEEDED(hr));
hr=spKqProjectionParameter->Init(strParamName.AllocSysString(),value);
ASSERT(SUCCEEDED(hr));
hr=spKqProjection->AddParam(spKqProjectionParameter);
ASSERT(SUCCEEDED(hr));
}
return spKqProjection.Detach();
}


[解决办法]
你得看看《com技术内幕》理解下组件的创建过程。当然,有些东西可能跟那书上的还是有点出入的

读书人网 >VC/MFC

热点推荐