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()函数失败!
请问是什么原因造成的?

解决方案 »

  1.   

    试试这样吧。
    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();
     }
      

  2.   

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