zoukankan      html  css  js  c++  java
  • 新建com组件项目步骤

    一、菜单栏  新建->项目->ATL->ATL项目->动态链接库 后续默认完成
    二、菜单栏  项目->添加类->ATL控件->“写入类的命名如:CeshiMain”下一步->
    1、如果需要连接点事件,勾选连接点
    2、如果需要对话框资源的话 “控件类型”选择“复合控件”,如果不需要选择“标准控件”
    其他的默认就好,然后选择“完成”
    三、在CeshiMain.h文件中找到类继承 public IPersistPropertyBagImpl<CeshiMain>//不然属性函数无法调用
    1、在
    BEGIN_COM_MAP(CeshiMain)
    COM_INTERFACE_ENTRY(IPersistPropertyBag)//在BEGIN_COM_MAP之间加上这句话,不然属性函数无法调用
    END_COM_MAP()
    2、//加上脚本安全属性,不然网页加载的时候无法加载
    BEGIN_CATEGORY_MAP(CeshiMain)
    IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
    IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
    END_CATEGORY_MAP()
    CeshiMain::CeshiMain()
    {
    m_bWindowOnly = TRUE;//在类初始化函数中添加,这句话很重要,不然OnInitDialog函数无法响应
        CalcExtent(m_sizeExtent);//自动添加的函数,不要动
    //CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);//添加这句话可加可不加,跟CoUninitialize函数对应
    }
    ~CeshiMain()
    {
    //CoUninitialize();//添加这句话可加可不加,跟CoInitializeEx函数对应
    }


    四、添加方法
    设类名是CeshiCtrl
    自动添加:
    1、在“类视图”里找到在哪个类里添加属性获取函数ICeshiCtrl(com组件都是以I开头),
    其中选中的那个类下必须是有一个文件夹,名称为“基类型”,选中类->右键->添加->添加方法(半自动添加属性也一样)
    2、填写方法名,设置要调用的函数名
    添加参数,可以选择参数特性(这里就不多说了,跟添加普通函数是一样的)


    手动添加:
    1、在“*.idl”文件中添加(id要唯一)
    [id(3)] HRESULT Play([in] BOOL bFullScreen);
    2、在头文件中添加函数声明
    STDMETHOD(Play)(BOOL bFullScreen);
    3、在对应的cpp文件中添加函数
    STDMETHODIMP COfficeMain::Play(BOOL bFullScreen)
    {
    // TODO: 在此添加实现代码
    return S_OK;
    }

    五、添加属性
    以WebServer为例,如果要获取这个属性需要php与c++配合
    php代码 调用的时候必须是object带属性,例如:
    <object id="CeshiCtrl" classid="CLSID:0C805532-9466-40B5-A723-405CEBD5490A" width="100%" height="100%">
    <param name="WebServer" value="127.0.0.1>">
    <param name="language" value="1">
    </object>

    c++代码 有两种方式:手动添加、VS半自动添加:
    假设类名蔆CeshiCtrll
    自动添加:
    1、在“类视图”里找到在哪个类里添加属性获取函数ICeshiMain(com组件都是以I开头),
    其中选中的那个类下必须是有一个文件夹,名称为“基类型”,选中类->右键->添加->添加属性(半自动添加方法也一样)
    会弹出一个对话框,
    填入属性名“WebServer”(添加后会自动加前缀,Get_WebServer/Put_WebServer)
    填入属性类型(这是要返回 php 中 WebServer 对应的 value 值,可以任选类型,喜欢就好,最后再自己慢慢去转换吧)
    勾选  “Get函数”:c++写入php配置属性值函数
          “Put函数”:从c++获取php的属性值函数
    PropPut:通过值传递数据
    PropPutRef:通过引用传递数据

    还有可以继续添加除了value之外的其他参数,
    最后点击完成即可。

    2、所谓的半自动是自动生成还要手动去处理另外一个任务,
    在程序的“*.idl”文件中找到刚才添加的函数的 id 值,这边是6
    [propget, id(6)] HRESULT WebServer([out, retval] BSTR* pVal);
    [propput, id(6)] HRESULT WebServer([in] BSTR newVal);

    3、然后在函数所在的头文件中添加以下数据
    BEGIN_PROP_MAPCeshiCtrll)
    PROP_ENTRY_TYPE("WebServer", 6, CLSID_NULL,VT_BSTR)
    END_PROP_MAP()

    4、要添加继承属性包
    public IPersistPropertyBagImpl<COpenMstscMain>,

    还要添加
    BEGIN_COM_MAP
    COM_INTERFACE_ENTRY(IPersistPropertyBag)
    END_COM_MAP
    这就真的完成了

    手动添加:
    其实就是纯手动方式,把C++自带的半自动方式操作一般而已
    1、在“*.idl”中添加(id要唯一才可以,但是同一属性id是一样的)
    [propget, id(6)] HRESULT WebServer([out, retval] BSTR* pVal);
    [propput, id(6)] HRESULT WebServer([in] BSTR newVal);

    2、在头文件中添加
    BEGIN_PROP_MAPCeshiCtrll)
    PROP_ENTRY_TYPE("WebServer", 6, CLSID_NULL,VT_BSTR)
    END_PROP_MAP()
    函数声明
    public:
    STDMETHOD(get_WebServer)(BSTR* pVal);
    STDMETHOD(put_WebServer)(BSTR newVal);
    定义一个变量存储获得的属性值 CComBSTR m_bstrWebServer =L"";

    3、在cpp文件中添加
    STDMETHODIMPCeshiCtrll::get_WebServer(BSTR* pVal)
    {
    // TODO: 在此添加实现代码
    *pVal = m_bstrWebServer.Copy();
    return S_OK;
    }
    STDMETHODIMPCeshiCtrll::put_WebServer(BSTR newVal)
    {
    // TODO: 在此添加实现代码
    m_bstrWebServer = newVal;
    return S_OK;
    }

    六、添加连接点事件:自动生成
    第一步、类视图找到程序名加Lib的类,选中CeshiCtrlLib->_ICeshiCtrlEvents右键添加->添加方法
    第二步、类视图找到基础繡eshiCtrll,右键添加->添加连接点->从下列来源选择连接点(项目)、可用的类型库(类lib<1.0>,千万别选嵌入的IDL),源接口的连接点加入实现连接点,
    (注:如果可用类型库选择“嵌入的IDL”就把左侧的连接点加入到右侧,那要把右侧的移除,然后可用类型库选择"CeshiCtrlLib<1.0>",再把左侧连接点加入到右侧。这样生成的_ICeshiCtrlEvents_CP.h才有事件函数生成)
    (注:另外千万别选择 类视图找到基础繡eshiCtrll,右键添加->实现接口 这边进入第二步的操作,不然的话程序就被改变了很多东西,在想改回去就要对比修改会被程序改掉的部分,不然就有问题)

    第一步其实可以手动添加的,直接进入.idl文件中,找到dispinterface _ICeshiCtrlEvents下methods:下写入[id(1)] HRESULT 函数名(参数)即可,再操作自动生成的第二步骤
    ————————————————
    版权声明:本文为CSDN博主「qq_31892777」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_31892777/article/details/80537782

  • 相关阅读:
    Windows身份验证和混合验证的差别
    Codeforces Round #273 (Div. 2) --B Random Teams
    带输出參数的存储过程的定义,以及在aso.net中调用
    数字统计
    UVa10048_Audiophobia(最短路/floyd)(小白书图论专题)
    C语言之基本算法21—可逆素数
    我在CSDN开通博客啦!
    小谈并查集及其算法实现
    C#高级编程五十四天----Lookup类和有序字典
    开发人员调试工具Chrome Workspace
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/11728219.html
Copyright © 2011-2022 走看看