⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 activeformimpl1.cpp

📁 这个是调用com组件自动调用,可以动态调用com组件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  {
    const DISPID dispid = -501;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->Color = (TColor)(Value);
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_Cursor(short Value)
{
  try
  {
    const DISPID dispid = 15;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->Cursor = (TCursor)(Value);
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_DoubleBuffered(TOLEBOOL Value)
{
  try
  {
    const DISPID dispid = 13;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->DoubleBuffered = Value;
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_DropTarget(TOLEBOOL Value)
{
  try
  {
    const DISPID dispid = 11;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->DropTarget = Value;
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_Enabled(TOLEBOOL Value)
{
  try
  {
    const DISPID dispid = -514;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->Enabled = Value;
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_Font(IFontDispPtr Value)
{
  try
  {
    const DISPID dispid = -512;
    if (FireOnRequestEdit(dispid) == S_FALSE)
      return S_FALSE;
    SetVclCtlProp(m_VclCtl->Font, Value);
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_HelpFile(BSTR Value)
{
  try
  {
    const DISPID dispid = 12;
    if (FireOnRequestEdit(dispid) == S_FALSE)
      return S_FALSE;
    m_VclCtl->HelpFile = AnsiString(Value);
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_KeyPreview(TOLEBOOL Value)
{
  try
  {
    const DISPID dispid = 6;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->KeyPreview = Value;
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_PixelsPerInch(long Value)
{
  try
  {
    const DISPID dispid = 7;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->PixelsPerInch = (int)(Value);
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_PrintScale(TxPrintScale Value)
{
  try
  {
    const DISPID dispid = 8;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->PrintScale = (TPrintScale)(Value);
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_Scaled(TOLEBOOL Value)
{
  try
  {
    const DISPID dispid = 9;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->Scaled = Value;
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};


STDMETHODIMP TActiveFormXImpl::set_Visible(TOLEBOOL Value)
{
  try
  {
    const DISPID dispid = 1;
    if (FireOnRequestEdit(dispid) == S_FALSE)
     return S_FALSE;
    m_VclCtl->Visible = Value;
    FireOnChanged(dispid);
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IActiveFormX);
  }
  return S_OK;
};



void __fastcall TActiveFormXImpl::ActivateEvent(TObject *Sender)
{
  Fire_OnActivate();
}


void __fastcall TActiveFormXImpl::ClickEvent(TObject *Sender)
{
  Fire_OnClick();
}


void __fastcall TActiveFormXImpl::CreateEvent(TObject *Sender)
{
  Fire_OnCreate();
}


void __fastcall TActiveFormXImpl::DblClickEvent(TObject *Sender)
{
  Fire_OnDblClick();
}


void __fastcall TActiveFormXImpl::DeactivateEvent(TObject *Sender)
{
  Fire_OnDeactivate();
}


void __fastcall TActiveFormXImpl::DestroyEvent(TObject *Sender)
{
  Fire_OnDestroy();
}


void __fastcall TActiveFormXImpl::KeyPressEvent(TObject *Sender, char &Key)
{
  short TempKey;
  TempKey = (short)Key;
  Fire_OnKeyPress(&TempKey);
  Key = (short)TempKey;
}


void __fastcall TActiveFormXImpl::PaintEvent(TObject *Sender)
{
  Fire_OnPaint();
}


void __fastcall TActiveFormX::Button4Click(TObject *Sender)
{
    ::ActiveFormX->Caption = "Test " ;
    Status->Panels->Items[0]->Text="test";
    CComVariant* pvars=new CComVariant[1];
    pvars[0].vt=VT_BYREF|VT_I4;
    long temp = (long)this->Handle;
    pvars[0].lVal=(long)this->Handle;
    //pvars[0].lVal=(long)::ActiveFormX->Handle;
    // CComVariant* dispparams;
    //pvars = (CComVariant*)::ActiveFormX->Handle;
        //pvars[0].vt=VT_BSTR;
    // pvars.bstrVal=SysAllocString(Msg);
    /*
    memset(&dispparams,   0,   sizeof   dispparams);
    dispparams.cNamedArgs=0;
    dispparams.cArgs=2;
    dispparams.rgvarg=new   VARIANT[2];   
    
    dispparams.rgvarg[0].vt=VT_BYREF|VT_I4;   
    dispparams.rgvarg[0].plVal=(long*)&m_hPluginWnd;   


    dispparams.rgvarg[1].lVal=(long)::ActiveFormX->Handle;
    CComVariant pvars("test");    */
    // pvars = "test and test";
    //pvars = "test and test";
    //CComVariant pvars(long*));
    //pvars[0].vt=VT_BSTR;
    // pvars.bstrVal=SysAllocString(Msg);
    DISPPARAMS   dpNoArgs   =   {pvars,   NULL,   0,   0};
    //DISPPARAMS   dpNoArgs   =   {::ActiveFormX->Handle};
    VARIANT   vResult;
    OLECHAR   FAR*   szFunction   =   OLESTR("Create");
    BSTR   bstrTemp;
    IDispatch*   classes;
    DISPID   dispid_method;
    try{
        int i = 0;
        ::CoInitialize(NULL);
        CLSID   clsid;
        ::CLSIDFromProgID(L"dll.ComDll",   &clsid);
        IUnknown* pUnk;
        HRESULT hr=::CoCreateInstance(clsid,NULL,CLSCTX_SERVER,IID_IUnknown,(void**)&pUnk);
        if(FAILED(hr)){
            i = 2;
        }else{
            hr   =   pUnk->QueryInterface(IID_IDispatch,   (void**)&classes);
        }


        if(FAILED(hr)){
            i = 1;
            pUnk->Release();
            ::CoUninitialize();
            return;
        }else{
            hr=classes->GetIDsOfNames(IID_NULL,&szFunction,1,LOCALE_USER_DEFAULT,&dispid_method);
            hr=classes->Invoke(dispid_method,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dpNoArgs,&vResult,NULL,NULL);
        }
        classes->Release();
        pUnk->Release();
        ::CoUninitialize();
    }catch(Exception &e)
    {
    }
    return; 

}
//---------------------------------------------------------------------------

void __fastcall TActiveFormX::ActiveFormActivate(TObject *Sender)
{
this->Align = alClient;
}
//---------------------------------------------------------------------------



void __fastcall TActiveFormX::Button7Click(TObject *Sender)
{
// 初始化COM库
    CoInitialize(NULL);
    // 根据ProgID创建组件
    CLSID clsid;				// 通过 ProgID 得到 CLSID
    VARIANT   vtOut;
    HRESULT hr=CLSIDFromProgID(L"dll.ComDll",&clsid);

    DISPID   dispid_method;
    IDispatch * pDisp = NULL;	// 由 CLSID 启动组件,并得到 IDispatch 指针
	hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&pDisp );
    OLECHAR   FAR*   szFunction   =   OLESTR("Create");
    if(SUCCEEDED(hr))
    {
        // 获取Add函数的DISPID
        hr = pDisp->GetIDsOfNames(IID_NULL, &szFunction, 1, LOCALE_USER_DEFAULT, &dispid_method);
        if(hr == S_OK)
        {
            CComVariant*  pvarsIn = new CComVariant[2];
            pvarsIn[0].vt = VT_I4;
            pvarsIn[0].intVal = 2;
            pvarsIn[1].vt = VT_I4;
            pvarsIn[1].intVal = 4;
            DISPPARAMS dispParam = {pvarsIn, NULL, 2, 0 };
            // 调用Add函数
            VariantInit(&vtOut);
            //hr = pDisp->Invoke(pDisp, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParam, &vtOut, NULL, NULL);
            if(SUCCEEDED(hr))
            {
                printf("%d", vtOut.intVal);
            }
            VariantClear(&vtOut);
            //delete[] pvarsIn;
            pvarsIn = NULL;
        }
        // 其实如果我们知道接口方法或者属性的DISPID,可以直接通过DISPID来调用
        VariantInit(&vtOut);
        DISPPARAMS dispParam = {NULL, NULL, 0, 0 };
        hr = pDisp->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParam, &vtOut, NULL, NULL);
        if(SUCCEEDED(hr))
        {
            printf("%d", vtOut.intVal);
        }
        VariantClear(&vtOut);
    }
    // 在CoUninitialize之前释放COM组件,否则导致COM库卸载后释放组件会出问题
    pDisp = NULL;
    // 释放COM库
    CoUninitialize();    
}
//---------------------------------------------------------------------------


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -