本帖最后由 noodles1860 于 2014-07-01 16:14:29 编辑

解决方案 »

  1.   

    需要将ctest所在dll放置到com dll所在文件夹下
      

  2.   


    多谢版主回复啊!
    只是有点不明白的是放在一个文件夹是指什么?因为我的test.cpp 和 Interface.cpp都是在同一个项目下的,只生成一个dll文件:test.dll。
      

  3.   


    多谢版主回复啊!
    只是有点不明白的是放在一个文件夹是指什么?因为我的test.cpp 和 Interface.cpp都是在同一个项目下的,只生成一个dll文件:test.dll。
    你这种情况下,都不知道Ctest 对象是什么,这两个都是在一个工程里面的吗,还是Ctest 单独放在一个dll中,如果在一个工程中,需要引用test头文件,
    HRESULT FinalConstruct()
    {
    //这里创建Ctest实例    
    pObject=new Ctext();
    return S_OK;
    }
    在下边释放对象
    void FinalRelease()
    {
     delete  pObject;
    pObject=NULL;
    }
      

  4.   


    test头文件是引用了的,这里是我完整的Interface.h:
    // Interface.h : Declaration of the CInterface
    #pragma once
    #include "resource.h"       // main symbols
    #include "test_i.h"
    #include "test.h"#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
    #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
    #endifusing namespace ATL;// CInterface
    class ATL_NO_VTABLE CInterface :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CInterface, &CLSID_Interface>,
    public IDispatchImpl<IInterface, &IID_IInterface, &LIBID_testLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
    {
    public:
    STDMETHOD(OLT)();
    CInterface() {}
    DECLARE_REGISTRY_RESOURCEID(IDR_INTERFACE)
    BEGIN_COM_MAP(CInterface)
    COM_INTERFACE_ENTRY(IInterface)
    COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()
    DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
    {
    pObject = new Ctest();
    return S_OK;
    } void FinalRelease()
    {
    delete pObject;
    pObject = NULL;
    }
    private:
    Ctest *pObject;
    };OBJECT_ENTRY_AUTO(__uuidof(Interface), CInterface)下面是完整的Interface.cpp:
    // Interface.cpp : Implementation of CInterface
    #include "stdafx.h"
    #include "Interface.h"
    // CInterface
    STDMETHODIMP CInterface::OLT()
    {
    MessageBox(NULL, _T("Connect!"), _T("Information"), MB_OK);
    return pObject->connect() ? S_OK : E_FAIL;
    }完整的test.h:
    #pragma once
    class Ctest
    {
    public:
    virtual int connect();
    };test.cpp(DllCanUnloadNow...等函数不贴出来了):
    // test.cpp : Implementation of DLL Exports.
    #include "stdafx.h"
    #include "resource.h"
    #include "test_i.h"
    #include "dllmain.h"
    #include "xdlldata.h"
    #include "test.h"
    int Ctest::connect()
    {
    return 0;
    }所有的文件都在一个工程里面,最终生成一个test.dll的文件。我在matlab中用一个mex函数来调用这个OLT(),现在不会强制退出了,只是提示:
    ??? Unexpected unknown exception from MEX file.这个Mex函数已经成功调用了dll中的OLT(),因为MessageBox已经出来了,所以mex函数应该没什么问题,错误应该还是在这个指针上。
      

  5.   

    从你的描述看就是connect函数的问题啊,自己调试定位下哪行出错不就行了么
      

  6.   


    调试了一下,发现加入以上语句就可以调用test中的OLT函数,但调用之后提示错误找不到test.tli文件。我尝试加入语句#import "C:\Proj\Debug\test.tlb" 但提示找不到头文件test.tlh,所以matlab还是会自动退出。请问这个.tli文件需要怎么生成?