1040534752 发表于 2014-9-7 11:22
请问谁做过apsen与gproms的对接吗?我这边提示solvint,dll加载错误,哪位能帮助解决下?谢谢
你试验一下“ATCOProperties.COPropertySystem.25.0”是否与你调用的Aspen Plus版本是否对应。每个不同的Aspen Plus版本,其后面的数字一般是不同的。
我没有在gproms下调用过Aspen Plus数据库,但是在VC++下成功实现了,代码如下(部分):
wstring error;
CLSID clsid;
CLSIDFromProgID(OLESTR("CO10MaterialObject.COThermo10Material.1"),&clsid);
BSTR b=SysAllocString(_T("ATCOProperties.COPropertySystem.24.0"));
CComPtr<ICOThermo10MaterialObject> pG;
HRESULT hr=pG.CoCreateInstance(clsid);
hr=pG->SetDestinationCO10CLSID(b);
VARIANT pl;
hr=pG->GetPropertyPackageList(&pl);
CVariant v(pl,FALSE);
v.CheckArray(VT_BSTR,error);
hr=pG->GetPPackageInterface(v.GetStringAt(0));
CComPtr<ICapeThermoMaterialTemplate> iCTMT;
hr=pG->QueryInterface(__uuidof(ICapeThermoMaterialTemplate),(LPVOID*)&iCTMT);
CComPtr<ICapeThermoMaterialObject> iCTMO;
hr=iCTMT->CreateMaterialObject((LPDISPATCH*)&iCTMO);
long num;
iCTMO->GetNumComponents(&num);
///
VARIANT e1,v1;
v1.vt=e1.vt=VT_EMPTY;
CVariant v2;
CBSTR overall(L"overall");
CBSTR mole(L"mole");
v2.MakeArray(1,VT_R8);
v2.SetDoubleAt(0,293);
hr=iCTMO->SetPropW(CBSTR(L"temperature"),overall,e1,NULL,NULL,v2);
CVariant v3;
v3.MakeArray(1,VT_R8);
v3.SetDoubleAt(0,101325);
hr=iCTMO->SetPropW(CBSTR(L"pressure"),overall,e1,NULL,NULL,v3);
CVariant v4;
v4.MakeArray(1,VT_R8);
v4.SetDoubleAt(0,5);
hr=iCTMO->SetPropW(CBSTR(L"totalFlow"),overall,e1,NULL,mole,v4);
CVariant v9;
v9.MakeArray(num,VT_R8);
double ss=1/num;
for(int i=0;i<num;i++) v9.SetDoubleAt(i,ss);
hr=iCTMO->SetPropW(CBSTR(L"fraction"),overall,e1,NULL,mole,v9);
hr=iCTMO->CalcEquilibrium(CBSTR(L"TP"),e1);
if(SUCCEEDED(hr)) AfxMessageBox(_T("成功相平衡计算"));
else AfxMessageBox(_T("失败相平衡计算"));
VARIANT v67;
v67.vt=VT_EMPTY;
hr=iCTMO->get_PhaseIds(&v67);
CVariant v34(v67,FALSE);
v34.CheckArray(VT_BSTR,error);
for(int i=0;i<v34.GetCount();i++)
{
CString t(v34.GetStringAt(i));
AfxMessageBox(t);
}
CVariant p;
p.MakeArray(1,VT_BSTR);
for(int i=0;i<v34.GetCount();i++)
{
p.AllocStringAt(0,L"density");
CVariant p2;
p2.MakeArray(1,VT_BSTR);
p2.AllocStringAt(0,v34.GetStringAt(i));
hr=iCTMO->CalcProp(p,p2,CBSTR(L"mixture"));
if(SUCCEEDED(hr)) AfxMessageBox(_T("成功求解属性"));
else AfxMessageBox(_T("失败求解属性"));
}
for(int i=0;i<v34.GetCount();i++)
{
VARIANT v33,compIds33;
v33.vt=VT_EMPTY;
compIds33.vt=VT_EMPTY;
hr=iCTMO->GetProp(CBSTR(L"density"),v34.GetStringAt(i),compIds33,NULL,CBSTR(L"mole"),&v33);
if(SUCCEEDED(hr)) AfxMessageBox(_T("成功获取属性"));
else AfxMessageBox(_T("失败获取属性"));
CVariant v46(v33,FALSE);
v46.CheckArray(VT_R8,error);
for(int i=0;i<v46.GetCount();i++)
{
double c=v46.GetDoubleAt(i);
CString ss;
ss.Format(_T("%f"),c);
AfxMessageBox(ss);
}
}
|