一、菜单栏  新建->项目->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

新建com组件项目步骤的更多相关文章

  1. 利用eclipse新建一个maven项目步骤:

    1.打开eclipse,左键点击左上角File,选中New,左键点击选中Maven Project,出现下面界面: 2.把打钩的去掉,选择自己项目所在的工作空间,如下图,我建在我的工作空间worksp ...

  2. 新建React Native项目步骤

    根据官方环境 https://reactnative.cn/docs/getting-started/ 搭建好之后 1.新建项目 打开React Native 命令行工具,并输入 react-nati ...

  3. 新建vue3.0 项目—步骤详细介绍

    一.环境搭建 1.安装node环境(版本≥ 8.9) 2.安装vue-cli3.0 npm install @vue/cli -g 此处省略安装步骤截图了,相信各位都已装好了,下图为查看版本结果: 二 ...

  4. myeclipse 2014新建maven web 项目步骤

    首先在myeclipse中配置maven的安装路径: 在pom.xml中加上: 1 2 3 4 5 6 7 8 9 10  <plugins>           <plugin&g ...

  5. 【记录】VS2012新建MVC3/MVC4项目时,报:此模板尝试加载组件程序集“NuGet.VisualStudio.Interop...”

    最近电脑装了 VisualStudio "14" CTP,由于把其他版本的 VS 卸掉,由高到低版本安装,当时安装完 VisualStudio "14" CTP ...

  6. Labview新建项目步骤

    打开Labview软件,点击工具栏中文件选项卡,如图所示. 2 点击新建一个空白项目. 3 此时为未命名项目,按下Ctrl+S保存项目到自己指定的目录并完成命名. 4 如图示在我的电脑上点击右键,新建 ...

  7. VisualEffectGraph基础操作 --创建VEG项目步骤讲解

    一:建立VEG项目步骤 首先打开Unity Hub,  使用unity2020.1 新建项目(本技术博客,默认使用unity2020.1 版本演示),选择HDRP 高清渲染管线,确定项目目录与名称. ...

  8. IntelliJ IDEA新建JAVA WEB项目(转载)

    IntelliJ IDEA是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本控制工具(git.svn ...

  9. Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!

    Android Widget小组件开发(一)--Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的! PS:学习自某网站(不打广告) 这个小组件相信大家都很熟悉吧,以前的墨迹天气 ...

随机推荐

  1. 安装opencv3.3.0碰到的问题及解决方法

    出处:http://osask.cn/front/ask/view/258965 CMakeError.log Compilation failed: source file: '/home/jhro ...

  2. Apache编译安装及LAMP架构

    1.apache三种工作模式 1)prefork工作模式 一个进程处理一个用户请求 稳定但是不适合高并发的生产环境 2)worker工作模式 一个进程生成多个线程 合适高并发环境但是需要考虑到线程的安 ...

  3. 学习Linux第一周记

    2019/11/25 服务器硬件详述1) CPU                         作用:运算/控制      关注信息 :路数 服务器中CPU的颗数   一般有  (单路    双路  ...

  4. 100+ Python挑战性编程练习(1)

    目前,这个项目已经获得了7.1k  Stars,4.1k Forks. 初级水平是指刚刚通过Python入门课程的人.他可以用1或2个Python类或函数来解决一些问题.通常,答案可以直接在教科书中找 ...

  5. 用ansible修改用户密码并给予挂载点

    --- - hosts: myjob gather_facts: false tasks: - name: chage user passwd user: name={{ item.name }} p ...

  6. CF1142B Lynyrd Skynyrd

    题目 有两种做法: 第一种是\(O(nlog\ n)\)的. 我们预处理两个数组: \(pre_i\)表示\(p\)中\(i\)前面的那个数是\(pre_i\). \(lst_i\)表示\(a\)中\ ...

  7. C++中的异常处理(上)

    1,C++ 内置了异常处理的语法元素 try ... catch ...: 1,try 语句处理正常代码逻辑: 2,catch 语句处理异常情况: 3,try 语句中的异常由对应的 catch 语句处 ...

  8. python-day15(正式学习)

    目录 递归 函数自我嵌套 调用 直接调用 间接调用 为什么要用递归呢 如何使用递归 内置函数 掌握 了解 面向对象方法 面向过程编程 注册 分层实现功能 递归 递归的本质就是函数调用自身,当然也会有一 ...

  9. Python自学笔记之计算机基础

    osi七层协议应用层-表示层-会话层-传输层-网络层-数据链路层-物理层 无线网协议 ethernet 物理层:网线,光纤 数据链路层:arp协议 mac地址,广播 在广播域内传播 网络层:ip地址标 ...

  10. windows 2008 创建域服务器问题 账户密码不符合要求

    windows 2008新建域时,本地administrator账户将成域Administrator账户.无法新建域,因为本地administrator账户密码不符合要求.*解决办法:很多人都会想到在 ...