日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我总结的几种简单的调用Com组件的方法

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我总结的几种简单的调用Com组件的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1.假如我們創建的Com組件的工程名叫TestCom,在其中添加了一個接口叫MyCom,接口名會自動命名為IMyCom,在其中添加兩個方法,分別為:

C++代碼 ?
  • HRESULT?Add([in]?long?n1,[in]?long?n2,[out,retval]long?*?pVal);??
  • HRESULT?Cat([in]?BSTR?s1,[in]?BSTR?s2,[out,retval]?BSTR?*?pVal);??
  • HRESULT Add([in] long n1,[in] long n2,[out,retval]long * pVal); HRESULT Cat([in] BSTR s1,[in] BSTR s2,[out,retval] BSTR * pVal);

    ?
    編繹成功后,會生成TestCom.dll
    注意此時我們生成的Com組件層次即為:TestCom.IMycom.方法;

    2.下面總結出調用該Com的幾種方法:

    Cpp代碼 ?
  • #include?"stdafx.h"??
  • #include?<atlbase.h>??
  • #import?"G:\\workspace\\VC_WorkSpace\\TestCom\\Debug\\TestCom.dll"?no_namespace??
  • #include "stdafx.h" #include <atlbase.h> #import "G:\\workspace\\VC_WorkSpace\\TestCom\\Debug\\TestCom.dll" no_namespace

    ?

    /*
    注意:在導入了com的dll后,會在工程的exe目錄下生成兩個文件:TestCom.tlh與TestCom.tli,一個為定義文件,一個為實現文件,打開TestCom.tlh定義文件,會發現有類似這樣幾句:

    _COM_SMARTPTR_TYPEDEF(IMyCom, __uuidof(IMyCom)); //該宏定義了指向接口IMyCom的指針IMyComPtr,以后的程序中可以直接用IMyComPtr這個指針類型。

    struct __declspec(uuid("92e83a37-399a-47b1-bf6c-0ab052650cfe"))
    MyCom; //該句定義了CLSID為"{92e83a37-399a-47b1-bf6c-0ab052650cfe}",通過它我們可以通過CLSIDFromString獲取clsid;

    struct __declspec(uuid("103b4c6e-3d3e-4e38-ab50-b9348465fc13"))
    IMyCom : IDispatch //該句定義了接口ID:IID為"{103b4c6e-3d3e-4e38-ab50-b9348465fc13}",通過它我們可以通過IIDFromString獲取接口iid;

    CoCreateInstance函數就用到了上面兩個做為參數來創建Com對象.
    */


    第一種方法:

    Cpp代碼 ?
  • int?impl0()??
  • {??
  • CoInitialize(NULL);??
  • CLSID?clsid;??
  • IID?iid;??
  • HRESULT?hr?=?CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);??
  • if(NOERROR?!=?hr){??
  • MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);??
  • return?-1;??
  • }??
  • ??
  • HRESULT?hriid?=?IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);??
  • if(S_OK?!=?hriid){??
  • MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);??
  • return?-1;??
  • }??
  • ??
  • {??
  • CComPtr<imycom>?pMyCom;??
  • pMyCom.CoCreateInstance(clsid);??
  • long?ret;??
  • ret?=?pMyCom->Add(1,2);??
  • }??
  • CoUninitialize();??
  • return?0;??
  • }??
  • int impl0() { CoInitialize(NULL); CLSID clsid; IID iid; HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid); if(NOERROR != hr){ MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK); return -1; }HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid); if(S_OK != hriid){ MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK); return -1; }{ CComPtr<imycom> pMyCom; pMyCom.CoCreateInstance(clsid); long ret; ret = pMyCom->Add(1,2); } CoUninitialize(); return 0; }

    ?

    ?

    第二種方法:

    Cpp代碼 ?
  • int?impl1()??
  • {??
  • CoInitialize(NULL);??
  • CLSID?clsid;??
  • CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid);?//"TestCom.MyCom"即為Dll名+Com對象名??
  • {??
  • CComPtr<imycom>?pMyCom;??
  • pMyCom.CoCreateInstance(clsid);??
  • long?ret;??
  • ret?=?pMyCom->Add(1,2);??
  • }??
  • CoUninitialize();??
  • return?0;??
  • }??
  • int impl1() { CoInitialize(NULL); CLSID clsid; CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid); //"TestCom.MyCom"即為Dll名+Com對象名 { CComPtr<imycom> pMyCom; pMyCom.CoCreateInstance(clsid); long ret; ret = pMyCom->Add(1,2); } CoUninitialize(); return 0; }

    ?

    ?

    第三種方法:

    Cpp代碼 ?
  • int?impl2()??
  • {??
  • CoInitialize(NULL);??
  • IMyComPtr?Pt?;??
  • if?(!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom))))??
  • {??
  • DWORD?err;??
  • err?=?GetLastError();??
  • char?Msg[128]={0};??
  • sprintf(Msg,"%d",err);??
  • MessageBox(NULL,Msg,"Err",MB_OK);??
  • return?-1;??
  • }??
  • long?ret?=?Pt->Add(1,2);??
  • CoUninitialize();??
  • return?0;??
  • }??
  • int impl2() { CoInitialize(NULL); IMyComPtr Pt ; if (!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom)))) { DWORD err; err = GetLastError(); char Msg[128]={0}; sprintf(Msg,"%d",err); MessageBox(NULL,Msg,"Err",MB_OK); return -1; } long ret = Pt->Add(1,2); CoUninitialize(); return 0; }

    ?

    ?

    第四種方法:

    Cpp代碼 ?
  • int?impl3()??
  • {??
  • CoInitialize(NULL);??
  • IMyComPtr?Pt(__uuidof(MyCom))?;??
  • long?ret?=?Pt->Add(1,2);??
  • CoUninitialize();??
  • return?0;??
  • }??
  • int impl3() { CoInitialize(NULL); IMyComPtr Pt(__uuidof(MyCom)) ; long ret = Pt->Add(1,2); CoUninitialize(); return 0; }

    ?

    ?

    第五種方法:

    Cpp代碼 ?
  • int?impl4()??
  • {??
  • ??CoInitialize(NULL);??
  • ??IMyCom?*?pMyCom=NULL;??
  • ??
  • ??CLSID?clsid;??
  • ??IID?iid;??
  • ??HRESULT?hr?=?CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);??
  • ??if(NOERROR?!=?hr){??
  • ??MessageBox????(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);??
  • return?-1;??
  • }??
  • ??
  • HRESULT?hriid?=?IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);??
  • if(S_OK?!=?hriid){??
  • ??MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);??
  • ??return?-1;??
  • }??
  • ??
  • if?(!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))??
  • {??
  • ??DWORD?err;??
  • ??err?=?GetLastError();??
  • ??char?Msg[128]={0};??
  • ??sprintf(Msg,"%d",err);??
  • ??MessageBox(NULL,Msg,"Err",MB_OK);??
  • ??return?-1;??
  • }??
  • ??
  • long?ret;??
  • ret?=?pMyCom->Add(1,2);??
  • ??
  • CoUninitialize();??
  • return?0;??
  • }??
  • int impl4() {CoInitialize(NULL);IMyCom * pMyCom=NULL;CLSID clsid;IID iid;HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);if(NOERROR != hr){MessageBox (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK); return -1; }HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid); if(S_OK != hriid){MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);return -1; }if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom))) {DWORD err;err = GetLastError();char Msg[128]={0};sprintf(Msg,"%d",err);MessageBox(NULL,Msg,"Err",MB_OK);return -1; }long ret; ret = pMyCom->Add(1,2);CoUninitialize(); return 0; }

    ?

    ?

    ?

    int main(int argc, char* argv[])
    {
    return impl0();
    }

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的我总结的几种简单的调用Com组件的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。