zoukankan      html  css  js  c++  java
  • C++ Com控件调用

    1.假如我们创建的Com组件的工程名叫TestCom,在其中添加了一个接口叫MyCom,接口名会自动命名为IMyCom,在其中添加两个方法,分别为:

    C++代码  收藏代码
    1. HRESULT Add([in] long n1,[in] long n2,[out,retval]long * pVal);  
    2. HRESULT Cat([in] BSTR s1,[in] BSTR s2,[out,retval] BSTR * pVal);  

     
    编绎成功后,会生成TestCom.dll
    注意此时我们生成的Com组件层次即为:TestCom.IMycom.方法;

    2.下面总结出调用该Com的几种方法:

    Cpp代码  收藏代码
    1. #include "stdafx.h"  
    2. #include <atlbase.h>  
    3. #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代码  收藏代码
    1. int impl0()  
    2. {  
    3. CoInitialize(NULL);  
    4. CLSID clsid;  
    5. IID iid;  
    6. HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);  
    7. if(NOERROR != hr){  
    8. MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);  
    9. return -1;  
    10. }  
    11.   
    12. HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);  
    13. if(S_OK != hriid){  
    14. MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);  
    15. return -1;  
    16. }  
    17.   
    18. {  
    19. CComPtr<imycom> pMyCom;  
    20. pMyCom.CoCreateInstance(clsid);  
    21. long ret;  
    22. ret = pMyCom->Add(1,2);  
    23. }  
    24. CoUninitialize();  
    25. return 0;  
    26. }  

    第二种方法:

    Cpp代码  收藏代码
    1. int impl1()  
    2. {  
    3. CoInitialize(NULL);  
    4. CLSID clsid;  
    5. CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid); //"TestCom.MyCom"即为Dll名+Com对象名  
    6. {  
    7. CComPtr<imycom> pMyCom;  
    8. pMyCom.CoCreateInstance(clsid);  
    9. long ret;  
    10. ret = pMyCom->Add(1,2);  
    11. }  
    12. CoUninitialize();  
    13. return 0;  
    14. }  

    第三种方法:

    Cpp代码  收藏代码
    1. int impl2()  
    2. {  
    3. CoInitialize(NULL);  
    4. IMyComPtr Pt ;  
    5. if (!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom))))  
    6. {  
    7. DWORD err;  
    8. err = GetLastError();  
    9. char Msg[128]={0};  
    10. sprintf(Msg,"%d",err);  
    11. MessageBox(NULL,Msg,"Err",MB_OK);  
    12. return -1;  
    13. }  
    14. long ret = Pt->Add(1,2);  
    15. CoUninitialize();  
    16. return 0;  
    17. }  

    第四种方法:

    Cpp代码  收藏代码
    1. int impl3()  
    2. {  
    3. CoInitialize(NULL);  
    4. IMyComPtr Pt(__uuidof(MyCom)) ;  
    5. long ret = Pt->Add(1,2);  
    6. CoUninitialize();  
    7. return 0;  
    8. }  

    第五种方法:

    Cpp代码  收藏代码
    1. int impl4()  
    2. {  
    3.   CoInitialize(NULL);  
    4.   IMyCom * pMyCom=NULL;  
    5.   
    6.   CLSID clsid;  
    7.   IID iid;  
    8.   HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);  
    9.   if(NOERROR != hr){  
    10.   MessageBox    (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);  
    11. return -1;  
    12. }  
    13.   
    14. HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);  
    15. if(S_OK != hriid){  
    16.   MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);  
    17.   return -1;  
    18. }  
    19.   
    20. if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))  
    21. {  
    22.   DWORD err;  
    23.   err = GetLastError();  
    24.   char Msg[128]={0};  
    25.   sprintf(Msg,"%d",err);  
    26.   MessageBox(NULL,Msg,"Err",MB_OK);  
    27.   return -1;  
    28. }  
    29.   
    30. long ret;  
    31. ret = pMyCom->Add(1,2);  
    32.   
    33. CoUninitialize();  
    34. return 0;  
    35. }  

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

  • 相关阅读:
    最小点割集
    哈希链表形式
    poj 1809
    整数的分拆
    Dynamic Rankings
    Error on line 1 of document
    怎么样用JAVA取得系统的路径?
    Richfaces优化,Richfaces为何这么慢?
    null Nested exception: null
    帮助你生成组织结构图的jQuery插件 jOrgChart java程序员
  • 原文地址:https://www.cnblogs.com/guozht/p/10101101.html
Copyright © 2011-2022 走看看