如何调用com中的事件?

解决方案 »

  1.   

    _ATL_FUNC_INFO OnErrorInfo = {CC_STDCALL, VT_EMPTY, 2, {VT_VARIANT,VT_DISPATCH}};
    class ATL_NO_VTABLE CEventSink : IDispEventSimpleImpl<1, CEventSink,&__uuidof(Ti30ComLib::EventInterface)> 
    {
    SINK_ENTRY_INFO(1, __uuidof(EventInterface),1, OnError, &OnErrorInfo)
    void __stdcall OnError(VARIANT sender, ErrorEventArgs* e);
    }
    怎么处理OnError事件中的ErrorEventArgs参数?这个参数中有两个属性,ErrorCode和ErrorMessage.
    这里ErrorEventArgs已经转换为IDispatch了,不能直接用ErrorEventArgs.
      

  2.   

    在VC中和VB中调用方式不一样的.
    VC的调用方法是:
        #include <Atlbase.h>
        #import "c:\\winnt\\mycom.dll" no_namespace
        void CTTTDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    ::CoInitialize(NULL);
    CLSID clsid;
    HRESULT hresult;
    IMyCom* pMyCom;
    hresult = CLSIDFromProgID( OLESTR( "MyCom.MyCom" ), &clsid);    //retrieve CLSID of component
    if ( FAILED(hresult) )
    {
    MessageBox("hr Failed!!!"); //失败
    }
    else
    {
    hresult = CoCreateInstance( clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(ICustomer), (LPVOID *)&pCustomer );
    if ( FAILED(hresult) )
    {
    MessageBox("Create Failed!!!");//失败
    ::CoUninitialize();
    return;
    }
    else
    MessageBox("Load Success!" ); //成功
    } BSTR Info_In;
    BSTR ErrInfo;
    BSTR Serial;
    BSTR CustNo;
    LONG ErrNo; ErrNo = pMyCom->MyComFunction( Info_In, &ErrInfo, &Serial, &CustNo );
    CString strErrInfo;
    CString strSerial;
    CString strCustNo;
    strErrInfo.Format( "%s%s", _com_util::ConvertBSTRToString( ErrInfo ) , _com_util::ConvertBSTRToString( CustNo ) );
    strSerial.Format( "%s__%ld",_com_util::ConvertBSTRToString( Serial ), ErrNo ); MessageBox( strErrInfo, strSerial );
    ::CoUninitialize();
    }
      

  3.   

    VB的调用方法简单一点.
    在工程的Refrence里边增加Mycom.dll库
    在代码里面
    Dim obj As MYComLib.MYCom
    Set obj = CreateObject("mycom.mycom")
    Dim szRet As String
    Dim szSrc As String
    szSrc = Text1.Text
    szRet = obj.MyFunc1(szSrc)
    Text2.Text = szRet
    MsgBox szRet, vbOKOnly
      

  4.   

    还有一个简单的调用方法:
    IMyComInterfacePtr com(__uuidof(MyCom));
    MyCom 类继承自 IMyComInterface
    com.MyMethod();楼上的兄弟,我问的是怎么处理事件及事件中的参数,而不是属性和方法的调用。
      

  5.   

    我也遇到这种问题,顶
    用ActiveX写的东西放到一个窗口之后,添加一个variable,会生成这个接口的类,可以在类里面实现COM接口定义的事件就可以
    而一个COM接口用import方法后,不知道怎么去实现这个事件
      

  6.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcrefatleventhandlingsample.asp
      

  7.   

    两篇介绍COM的好文章。。
    http://www.vckbase.com/document/viewdoc/?id=212
    http://www.vckbase.com/document/viewdoc/?id=213
      

  8.   

    我看过这个例子。
    现在的问题是事件中的参数怎么处理?
    例如:OnMyEvent(object sender, MyCustomEventArgs e)
          {}
    vc:__Stdcall OnMyEvent(VARIANT sender, IDispatch* e)
    以前就可以直接用e.xx访问MyCustomEventArgs的属性。
    现在的IDispatch怎么访问?
      

  9.   

    你是在COM接口中出的问题还是客户端的问题
    看你的代码似乎是COM接口中的
    COM接口可以用ConnectionPoint去做事件
    先在idl中定义事件,再在接口类中Add Connection Point
    自动在事件代理类中把事件的东西全都生成了
    在其他地方直接调用事件函数就可以。
      

  10.   

    呵呵,我的只是一个COM接口,没有做成控件。
      

  11.   

    是客户端的问题。接口中的事件都已经定义好了。
    这是事件的接口idl:
    [
      uuid(7C59B515-E90A-3EB9-8CF3-F0C48DBCA390),
      version(1.0),
        custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "Ti30ComLib.EventInterface")]
    dispinterface EventInterface {
        properties:
        methods:
            [id(0x00000001)]
            void Error(
                            [in] VARIANT sender, 
                            [in] _SessionErrorEventArgs* e);
            [id(0x00000002)]
            void Connect(
                            [in] VARIANT sender, 
                            [in] _ConnectEventArgs* e);
            [id(0x00000003)]
            void StartAutoDownload(
                            [in] VARIANT sender, 
                            [in] _EventArgs* e);
            [id(0x00000004)]
            void DownLoad(
                            [in] VARIANT sender, 
                            [in] _TransferEventArgs* e);
            [id(0x00000005)]
            void UpLoad(
                            [in] VARIANT sender, 
                            [in] _TransferEventArgs* e);
            [id(0x00000006)]
            void DownloadProgress(
                            [in] VARIANT sender, 
                            [in] _ProgressEventArgs* e);
            [id(0x00000007)]
            void UploadProgress(
                            [in] VARIANT sender, 
                            [in] _ProgressEventArgs* e);
    };
    这是包含事件的类的idl:
    [
      uuid(A3C6916D-358E-3AC9-949A-BF23A38AD45A),
      version(1.0),
        custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "Ti30ComLib.Communication")
    ]
    coclass Communication {
        interface _Object;
        [default] interface ITi30ComLib;
        [default, source] dispinterface EventInterface;
    };
    现在就要在vc写个调用com事件的程序。困难的是怎么处理事件中的参数_SessionErrorEventArgs.....等。
    这是参数的idl:
    [
      uuid(56600F03-6082-3DFD-921C-9441F849AB14),
      hidden,
      dual,
        custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "IRCommunication.SessionErrorEventArgs")]
    dispinterface _SessionErrorEventArgs {
        properties:
        methods:
    };