如何直接调用一个已有的DLL,把它封装成com 当前我已经有了一个MFC(dll)工程,其内有很多类,之间又有复杂的继承关系以及很多定义的宏或者结构体,现在我想重新写这个工程以将该工程转为com组件。请问如何做是好啊?有朋友说直接调用一个已有的DLL,把它封装成com,这是怎么回事啊?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果你对com比较熟的话,直接把com的一些必要文件补上就可以不过一般只有新建一个atl的com组件,把你的dll代码文件,添进去,修改下dllmain应该就可以了。注意你要提供的com组件接口就可以了。 建立一个MFC com工程,把代码copy进去 写好IDL,建立新的类对象,然后把逻辑代码相应加上就行了,主要是接口部分要考虑,COM接口和C++数据类型不一样 哪里不清楚,可以发邮件给我[email protected] 举个例子你有个类class CMath{void Add(int a,intb);}如果你要在com中实现Add你可以新建一个atl项目加入一个com接口(用New atl object) 比如叫IMath然后往IMath加入方法,Add该方法的实现,调用你原来代码里面的CMath::Add就可以了 前面我都明白,可是就是最后你说“该方法的实现,调用你原来代码里面的CMath::Add”这个不是很好理解,我就是在实现函数上卡住了,首先如何调用那个add,其次,我原工程还调用其他的dll,有很多集成关系,还有很多结构体和宏,这些都该怎么处理啊??拜托各位了 给我讲讲这个地方该怎么做吧????? 你会不会使用Dll?如果你不会使用DLL的话,就看看怎么使用Dll的。如果你会使用DLL了那就新建一个COM工程,按普通方式使用那个DLL就好了。使用组合处理之。 不是把dll和lib放到com文件夹下,链接上lib,在程序里加上头文件,是这样吧?可是我原来的那个dll还调用了其他的dll,我试过了,出现了200多个错,崩溃了 那就把那些需要的DLL都拿过来就好啦 如果你有原来dll的源码,建议使用源码,把源码加入到你的atl中,如果你没有源码,估计可能会出问题。因为com对于机器的程序是位置无关性,而它如果使用了普通dll,那么那个普通dll要放在系统目录下,否则,这个普通dll怎么变成位置无关性,把普通dll和com dll 放在一起是不是就会解决这个问题我也不确定,没有试过,你需要确认一下。 对于程序而言,别的dll自己的功能都是可以不公开实现的,只有提供接口就可以,只要按照提供的接口就可以使用,至于那个dll的接口如何实现,用了哪些数据结构,用了哪些算法,它一点也不关心,也没必要关心。 我后来使用你这个方法做了,但是新的Add方法的参数要和原add的参数一致才行,而我原add的参数中如果有很多引用,那新方法参数就和原方法参数不一致了,这该怎么办啊? 参数是不是一致需要看你com接口的方法是不是必须使用哪些参数,如果是必须的,那你的方法肯定要提供参数了,缺了参数,方法就不对了如果不是必须有外面提供的输入或输出,这个参数就可以内部提供,就可以不要暴露到外面的方法函数中。正常情况下,如果那个函数要暴露到com里面的话,接口肯定要一致了。当然,com具有语言无关性,参数类型可能要注意下,注意转换就可以了。 我的那些函数不是内部调用的,是对外使用的,但是有的函数的参数里头有引用类型的,可是com貌似要求参数不能是引用,这样该怎么办啊?比如class CMath{void Add(int &a,int &b);}这里参数ab是引用类型的,这样如何转换到com中去啊? #32770和Dialog有何不同? 借个地方 各位大虾,请问如何实现spy++的功能? 一个用REMOTE的添加记录的问题 菜鸟的问题,,如何制作带有图片跟文字的按扭,谢谢! 求教 在16真彩的时候,如何把5x5x5中的颜色转成5x6x5中的颜色呢? 急寻vc++ 如何使SHBrowseForFolder只能选择本地目录,不能选择网络路径 LoadIcon之后必须DestroyIcon吗? 关于自定义控件ListBox被遮挡的问题? VC怎么动态切换视图
不过一般只有新建一个atl的com组件,把你的dll代码文件,添进去,修改下dllmain应该就可以了。
注意你要提供的com组件接口就可以了。
你有个类
class CMath
{
void Add(int a,intb);
}如果你要在com中实现Add
你可以新建一个atl项目
加入一个com接口(用New atl object) 比如叫IMath
然后往IMath加入方法,Add
该方法的实现,调用你原来代码里面的CMath::Add
就可以了
前面我都明白,可是就是最后你说“该方法的实现,调用你原来代码里面的CMath::Add”这个不是很好理解,我就是在实现函数上卡住了,首先如何调用那个add,其次,我原工程还调用其他的dll,有很多集成关系,还有很多结构体和宏,这些都该怎么处理啊??拜托各位了 给我讲讲这个地方该怎么做吧?????
如果你会使用DLL了那就新建一个COM工程,按普通方式使用那个DLL就好了。
使用组合处理之。
不是把dll和lib放到com文件夹下,链接上lib,在程序里加上头文件,是这样吧?可是我原来的那个dll还调用了其他的dll,我试过了,出现了200多个错,崩溃了
那就把那些需要的DLL都拿过来就好啦
如果你有原来dll的源码,建议使用源码,把源码加入到你的atl中,
如果你没有源码,估计可能会出问题。
因为com对于机器的程序是位置无关性,而它如果使用了普通dll,那么那个普通dll要放在系统目录下,否则,这个普通dll怎么变成位置无关性,把普通dll和com dll 放在一起是不是就会解决这个问题我也不确定,没有试过,你需要确认一下。
对于程序而言,别的dll自己的功能都是可以不公开实现的,只有提供接口就可以,只要按照提供的接口就可以使用,至于那个dll的接口如何实现,用了哪些数据结构,用了哪些算法,它一点也不关心,也没必要关心。
我后来使用你这个方法做了,但是新的Add方法的参数要和原add的参数一致才行,而我原add的参数中如果有很多引用,那新方法参数就和原方法参数不一致了,这该怎么办啊?
如果不是必须有外面提供的输入或输出,这个参数就可以内部提供,就可以不要暴露到外面的方法函数中。正常情况下,如果那个函数要暴露到com里面的话,接口肯定要一致了。当然,com具有语言无关性,参数类型可能要注意下,注意转换就可以了。
我的那些函数不是内部调用的,是对外使用的,但是有的函数的参数里头有引用类型的,可是com貌似要求参数不能是引用,这样该怎么办啊?
比如
class CMath
{
void Add(int &a,int &b);
}
这里参数ab是引用类型的,这样如何转换到com中去啊?