2 josen hong Josen_Hong 于 2015.05.27 14:26 提问

VS2005调用matlab2007a生成的com组件接口返回E_FAIL

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时接口调用会失败?

5个回答

caozhy
caozhy   Ds   Rxr 2015.05.27 14:32

检查下你的com对象中有没有读取数据或者文件的逻辑,直接运行和ide运行的相对目录不同。
就你的错误,只能看出是com组件调用的时候丢出了异常。

Josen_Hong
Josen_Hong 但这个com对象是由matlab的deploytool产生的,如何检查。
大约 3 年之前 回复
Josen_Hong
Josen_Hong   2015.05.27 14:38

但这个com对象是由matlab的deploytool产生的,如何检查。

baidu_28526591
baidu_28526591   2015.05.27 14:42

检查下你的com对象中有没有读取数据或者文件的逻辑,直接运行和ide运行的相对目录不同。
就你的错误,只能看出是com组件调用的时候丢出了异常。

oyljerry
oyljerry   Ds   Rxr 2015.05.27 15:28

一般是调试的目录跟运行的目录不同,你是不是有一些依赖的文件等,两个目录有区别

qq_16794101
qq_16794101   2015.05.27 23:29

检查下你的com对象中有没有读取数据或者文件的逻辑,直接运行和ide运行的相对目录不同。
就你的错误,只能看出是com组件调用的时候丢出了异常。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!