32位XP系统中,使用matlab2007a的deploytool生成的com组件,在VS2005中编译并运行,能获得正确的结果。但release后在本地直接运行exe,在调用组件的函数接口时HRESULT返回了E_FAIL。
m文件代码:
function [ c ] = fun( a,b )
c = a + b;
MFC调用COM接口代码:
void Ctest_com2Dlg::OnBnClickedButton1()
{
CoInitialize(NULL);
HRESULT hresult;
CLSID clsid;
hresult=::CLSIDFromProgID(OLESTR("test.testclass.1_0"), &clsid);
if (!(FAILED(hresult)))
{
Itestclass *pItest;
hresult=::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER, __uuidof(Itestclass),(LPVOID *) &pItest);
if (!(FAILED(hresult)))
{
//声明COM组件接口函数所需的VARIANT类型的输入输出变量
VARIANT var, var2, varRes;
var.vt = VT_R8;//An 8-byte IEEE real value is stored in dblVal.
var.dblVal = -4;//初始值
var2.vt = VT_R8;
var2.dblVal = 15;//初始值
HRESULT rtmp;
rtmp = pItest->fun(1, &varRes, var, var2);
if(!(FAILED(rtmp)))
{
CString str;
str.Format(_T("%f"), varRes.dblVal);
MessageBox(str, _T("Hint"), MB_OK);
}
else
AfxMessageBox(_T("fun failed"));
//清除变量
VariantClear(&var);
VariantClear(&var2);
VariantClear(&varRes);
SafeArrayDestroy(var.parray);
SafeArrayDestroy(var2.parray);
SafeArrayDestroy(varRes.parray);
}
else
AfxMessageBox(_T("CoCreateInstance failed"));
}
else
AfxMessageBox(_T("CLSIDFromProgID failed"));
CoUninitialize();
}
在IDE中运行结果正常,但独立运行exe弹出"fun failed"的对话框。在生成com组件的distrib文件夹下,把test_mcr文件夹删除,不论是在IDE中运行还是独立运行exe,都能重新生成test_mcr文件夹,这表明即使独立运行exe,也是有调用到生成的com组件dll的。
但为什么在IDE中调用exe就正常,独立运行exe时接口调用会失败?