现急需一个控件提供给客户,要求将不分不公开属性和函数为不可见,经过搜索了解COM是一个优秀的解决方案,但本人不曾使用过,看技术文档似乎比较复杂,一时难以掌控,求各位帮忙,转换成源代码发到我E-Mail,成功则立刻结贴给分。谢谢!实现类可用MFC架构创建一基于Dialog对话框项目,然后创建一个控件类CMyButton,将该类封装成com则可,最好做个简单的调用demo,嘻嘻,估计对熟悉的朋友只需几分钟,客户急。可参考以下类:class CMyButton : public CButton
{
public:
CMyButton();
virtual ~CMyButton();// Operations
public:     
void SetWidth(void);                        //接口1
void SetHidth(void);                        //接口2                     
void SetBkColor(void);                      //接口3//以下属性在com接口中不可见
// Implementation
protected:
void MyDraw(void);                       
void Resize(void);// Attributes
protected:
     int m_clrBack;
 int m_nWidth;
 int m_nHight; DECLARE_MESSAGE_MAP()
};
封装成的COM接口只有上述3个接口,其他操作和属性皆不可见,谢谢!E-mail: [email protected]发送例程代码同时也可以在本贴回复,我好帮忙理解或者知晓。无所为报,分不够可开贴再续

解决方案 »

  1.   

    其实也很简单。
    1.在codeproject上找一篇com的文章
      照着改。
    2.生成的com控件注册到注册表。
    3.应用程序包含com的头文件。
      

  2.   

    别把窗口和COM搞混了,根本就是两回事,就算提供了COM接口,它并不是一个窗口封装类,所以无法直接应用在你的应用程序中。楼主到底想隐藏什么?如果想隐藏实现代码,实现成一个扩展DLL就可以了;如果想只提供3个方法给使用者,把其它方法全部设置成private就行了。如果这些信息不想别人看到,你在这个导出类中只提供这3个方法,其它方法不要放在类里面定义,放在cpp文件里定义成全局变量全局函数,或者定义在另一个不公开的类里面。
      

  3.   

    我们甚至需要隐藏类的具体定义,因为不必要和用户无关性和保密性,如果定义在其他类,则需要include其定义,其实还是暴露了类原型,我就是看了com的一些文章,好像比较复杂,所以一时难以弄出来,所以有朋友帮忙弄上面需求的类接口,基本就可以了。我尝试用其他方法模拟com的实现,但是似乎是不可行的,因为他是窗口,就像4楼说的,它实例化就有问题了,不知道com作出来,支持动态创建这个如CMyButton这样的控件,
    然后在其项目中使用。
    这段时间头痛得厉害,连看屏幕都是争取时间看完,打完字,然后就离开,其他时间先用笔草图规划好,伤身体了。艾。。但是业务又急,帮个忙,不胜感激!
      

  4.   

    4楼有点忽悠人。
    我就做了视频控件,直接嵌入到dialog里的
    不需要包含com的头文件。
    在工程里插入activex控件时,ide会生成wrapper class
      

  5.   

    楼主的类是从CButton继承的,做成com后会失去MFC的特性,比如动态创建、DDX。
    反正自己看着办吧。
      

  6.   

    楼主的类是从CButton继承的,做成com后会失去MFC的特性,比如动态创建、DDX。 
    反正自己看着办吧。
    -------------------------
    没有做过COM经验,不知道是否属实,如若如此,那如何处理?有没有人指教一下?
      

  7.   

    不用com的做法(实现成扩展DLL):
    // 可公开的头文件
    class AFX_EXT_CLASS CMyButton : public CButton
    {
    public:
        CMyButton();
        virtual ~CMyButton();// Operations
    public:     
        void SetWidth(void);                        //接口1
        void SetHidth(void);                        //接口2                     
        void SetBkColor(void);                      //接口3    DECLARE_MESSAGE_MAP()
    };// CPP文件
    // 全局变量和全局函数会被隐藏
         int m_clrBack;
         int m_nWidth;
         int m_nHight;
        void MyDraw(CMyButton* pThis) { /* your code is here. */ }                       
        void Resize(CMyButton* pThis) { /* your code is here. */ }void CMyButton::SetWidth() { ... }
    void CMyButton::SetHeight() { ... }
    void CMyButton::SetBkColor() { ... }com实现:让7楼的教你吧
      

  8.   

    >>如果定义在其他类,则需要include其定义,其实还是暴露了类原型, 
    建议提供几个api,做成dll,
    用户只要知道几个api就行了,具体的CButton用户就不必知道了,
    /**** api.h ******/
    SetWidth();
    ......
    /*end *****//*api.c*/
    class CMyButton : public CButton
    {
      ...........
    };
    void SetWidth()
    {
      CMyButton::SetWidth();
    }不知道这样行不。
      

  9.   

    问题是,我的客户使用的开发语言未必是c/c++,所以还得考虑兼容,上述的DLL方式导出类,还有个问题,好像导出类只能是MFC才能实现,所以很可能需要COM,但是COM是不是导出后没有MFC窗体的属性,如动态创建什么的,晕。简单的函数接口方式,估计不可行,从设计理念上,还要给予用户类对象的观念,还有其他等。谢谢大家的帮助。就算解决不了也要送分啊,冲着大家的热情
      

  10.   

    activex组件也可以有属性页,也能动态创建,也可以有边框等。
    windows上有很多现有的activex组件,弄几个出来,试试效果,对决策有帮助的
      

  11.   

    如果客户不用MFC,上述方案全推倒,只能选择com或者从DLL导出API的方案。另,导出类不是MFC的专利,不用MFC也可以导出类,但是这种DLL只能被C++使用,其它语言不能用,而且DLL只能使用隐式链接,不能使用LoadLibrary
      

  12.   

    activex组件方案应该暂时不会考虑,可能COM方案还是最后的选择,不过不知道上面描述说会是去MFC的特性,那就不好办了,~~~
      

  13.   

    DLL能处理我就用DLL了,但是不然,因为我也需要将类定义的某些属性和操作都要隐藏,非公开部分为不可见,并且从理解上需要有类的概念,所以应该必须是导出类,而且,这个控件可以理解为CMyButon基于MFC机制的,目标是有人帮我做成COM接口,(原因是我没有熟悉COM,需求也紧张,看了一些文档感觉没有那么快熟悉它),想不到一个看似简单的需求,成为了一个技术难点,嘿嘿头,下午又没有那么晕了,
    又有点倡狂的看资料, 希望能持续一阵子 ^_*
      

  14.   

    其实没那么难的。
    照着教程做,一个下午就会熟悉比较简单的activex控件
      

  15.   

    http://www.vckbase.com/document/viewdoc/?id=593这个对楼主有用
      

  16.   

    说过了,不用ActiveX,不能以这种方式存在,而且需要支持多种开发语言,有COM实现的,就给我个例程吧,我似乎都绝望了。呜呜~~
      

  17.   

    楼主没弄清楚概念。
    activex可以由com实现,而且activex本身是一个控件
      

  18.   

    楼主的接口真的要支持多种开发语言?需要是要输出写什么给别人调用?如果只是C或C++使用
    普通DLL已经足够