当前我已经有了一个MFC(dll)工程,其内有很多类,之间又有复杂的继承关系以及很多定义的宏或者结构体,现在我想重新写这个工程以将该工程转为com组件。请问如何做是好啊?有朋友说直接调用一个已有的DLL,把它封装成com,这是怎么回事啊??

解决方案 »

  1.   

    如果你对com比较熟的话,直接把com的一些必要文件补上就可以
    不过一般只有新建一个atl的com组件,把你的dll代码文件,添进去,修改下dllmain应该就可以了。
    注意你要提供的com组件接口就可以了。
      

  2.   

    建立一个MFC com工程,把代码copy进去
      

  3.   

    写好IDL,建立新的类对象,然后把逻辑代码相应加上就行了,主要是接口部分要考虑,COM接口和C++数据类型不一样
      

  4.   

    哪里不清楚,可以发邮件给我[email protected]
      

  5.   

    举个例子
    你有个类
    class CMath
    {
    void Add(int a,intb);
    }如果你要在com中实现Add
    你可以新建一个atl项目
    加入一个com接口(用New atl object) 比如叫IMath
    然后往IMath加入方法,Add
    该方法的实现,调用你原来代码里面的CMath::Add
    就可以了
      

  6.   


    前面我都明白,可是就是最后你说“该方法的实现,调用你原来代码里面的CMath::Add”这个不是很好理解,我就是在实现函数上卡住了,首先如何调用那个add,其次,我原工程还调用其他的dll,有很多集成关系,还有很多结构体和宏,这些都该怎么处理啊??拜托各位了 给我讲讲这个地方该怎么做吧?????
      

  7.   

    你会不会使用Dll?如果你不会使用DLL的话,就看看怎么使用Dll的。
    如果你会使用DLL了那就新建一个COM工程,按普通方式使用那个DLL就好了。
    使用组合处理之。
      

  8.   


    不是把dll和lib放到com文件夹下,链接上lib,在程序里加上头文件,是这样吧?可是我原来的那个dll还调用了其他的dll,我试过了,出现了200多个错,崩溃了
      

  9.   


    那就把那些需要的DLL都拿过来就好啦
      

  10.   


    如果你有原来dll的源码,建议使用源码,把源码加入到你的atl中,
    如果你没有源码,估计可能会出问题。
    因为com对于机器的程序是位置无关性,而它如果使用了普通dll,那么那个普通dll要放在系统目录下,否则,这个普通dll怎么变成位置无关性,把普通dll和com dll 放在一起是不是就会解决这个问题我也不确定,没有试过,你需要确认一下。
      

  11.   


    对于程序而言,别的dll自己的功能都是可以不公开实现的,只有提供接口就可以,只要按照提供的接口就可以使用,至于那个dll的接口如何实现,用了哪些数据结构,用了哪些算法,它一点也不关心,也没必要关心。
      

  12.   


    我后来使用你这个方法做了,但是新的Add方法的参数要和原add的参数一致才行,而我原add的参数中如果有很多引用,那新方法参数就和原方法参数不一致了,这该怎么办啊?
      

  13.   

    参数是不是一致需要看你com接口的方法是不是必须使用哪些参数,如果是必须的,那你的方法肯定要提供参数了,缺了参数,方法就不对了
    如果不是必须有外面提供的输入或输出,这个参数就可以内部提供,就可以不要暴露到外面的方法函数中。正常情况下,如果那个函数要暴露到com里面的话,接口肯定要一致了。当然,com具有语言无关性,参数类型可能要注意下,注意转换就可以了。
      

  14.   


    我的那些函数不是内部调用的,是对外使用的,但是有的函数的参数里头有引用类型的,可是com貌似要求参数不能是引用,这样该怎么办啊?
    比如
    class CMath
    {
    void Add(int &a,int &b);
    }
    这里参数ab是引用类型的,这样如何转换到com中去啊?