atl开发的COM组件隐藏方法

时间:2020-12-19 23:16:04
我使用ATL开发了一个COM控件,我想把定义的一些方法隐藏起来,在些处看到了以前的一个提问
http://topic.csdn.net/t/20040725/12/3207820.html

我使用的是VS2005,里面好像没有BEGIN_OBJECT_MAP(ObjectMap)这个东西
使用QueryInterface方法查找到接口,如果我不把IID公布出去不就达到了隐藏接口的目的,请高手指点该怎么做

16 个解决方案

#2


可以实现为不可创建类,atl 8的一般的是OBJECT_ENTRY_AUTO(__uuidof(xxxx), xxxx)可以改为OBJECT_ENTRY_NON_CREATEABLE不可创建,仅供内部使用。

#3


引用 2 楼 yxz_lp 的回复:
可以实现为不可创建类,atl 8的一般的是OBJECT_ENTRY_AUTO(__uuidof(xxxx), xxxx)可以改为OBJECT_ENTRY_NON_CREATEABLE不可创建,仅供内部使用。

请问一下,你说的这个公供内部使用是什么意思?还是只能在创建的这个工程里面使用吗?

如果我想拿这个控件在别的应用程序中使用该怎么调用?

#4


mark

#5


ATL从7.0开始就取消了BEGIN_OBJECT_MAP这个宏的使用,因为它把类厂映射需要的信息都放到一个独立的ATL段中去了,在每个组件最后的OBJECT_ENTRY_AUTO宏中实现了映射的添加。

这样隐藏接口是没用的,除非去掉此接口的注册信息,否则oleview都能看到接口定义。不注册的方法是在组件类中添加一句 DECLARE_NO_REGISTRY()

#6


隐藏注册信息.或者去掉注册的函数.

然后自己调用相关的函数创建出对象.

#7


兄弟要隐藏方法你在非COM的dll可以这么做,COM的dll你只能说去把Interface中的方法取掉,别无它法。
不知道你的目的,如果你不想让用户看到方法名字的话你就只能在interface中取掉,如果你只是不想让
用户用,那你可以在方法中判断做一些简单的加密:)

#8


引用 5 楼 jameshooo 的回复:
ATL从7.0开始就取消了BEGIN_OBJECT_MAP这个宏的使用,因为它把类厂映射需要的信息都放到一个独立的ATL段中去了,在每个组件最后的OBJECT_ENTRY_AUTO宏中实现了映射的添加。 

这样隐藏接口是没用的,除非去掉此接口的注册信息,否则oleview都能看到接口定义。不注册的方法是在组件类中添加一句 DECLARE_NO_REGISTRY() 

DECLARE_NO_REGISTRY()这个是放在类中任意一个地方吗?如果去掉了注册信息我自己用的时候应该是不可以直接调那些方法了吧,我应该怎么调用那些方法呢?

#9


去掉类型库注册信息

#10


问题是我还刚接触COM编程,大家都说去掉类型库注册信息、隐藏注册信息.或者去掉注册的函数不知道这几个是不是说的同一个意思,
是不是像 jameshooo 说的组件类中添加一句 DECLARE_NO_REGISTRY() 
如果是这样的话我试了一下,在MFC窗口里添加一个ActiveX 控件,结果在列表找不到那个类,我应该怎么使用它呢?

#11


隐藏注册信息之后不能再通过向导添加控件了,因为它要读取注册表。你可以直接包含需要的头文件,比如IID/CLSID定义已经接口定义,直接用CoCreateInstance来创建组件,注意接口注册信息可以隐藏,但是类厂注册信息不能隐藏。

#12


如果我要我要把这个DLL放到IE上用,我测试了一下用不了,把DECLARE_NO_REGISTRY()加进以后怎样才能在IE下使用呢,
另外如果我要在MFC窗口上把这个界面显示上去,又怎么显示呢?

#13


如果我要我要把这个DLL放到IE上用,我测试了一下用不了,把DECLARE_NO_REGISTRY()加进以后怎样才能在IE下使用呢, 
另外如果我要在MFC窗口上把这个界面显示到Dialog上面,又怎么显示呢?

#14


你已经在钻牛角尖了,不按规则来玩,就别玩COM游戏。IE都不认识你,怎么跟你玩?

#15


使用atl向导生成的COM组件想隐藏其方法是几乎不可能的,也不现实的。
我可以教你个方法,不使用atl创建COM组件。使用原始的方法通过定义
一些类来实现COM组件,只要你不对外发布你的接口声明文档别人是不会
看得到你的接口信息的,就无从要使用你的COM组件了。不要使用类型库,
在C++编写的程序没必要使用类型库,使用调度接口实现COM组件,在C++看来
是没有必要的,调度接口太高级了,效率低。因为是C++所以可以使用QueryInterface
的方法来获取接口。

#16


看不懂啊

#1


#2


可以实现为不可创建类,atl 8的一般的是OBJECT_ENTRY_AUTO(__uuidof(xxxx), xxxx)可以改为OBJECT_ENTRY_NON_CREATEABLE不可创建,仅供内部使用。

#3


引用 2 楼 yxz_lp 的回复:
可以实现为不可创建类,atl 8的一般的是OBJECT_ENTRY_AUTO(__uuidof(xxxx), xxxx)可以改为OBJECT_ENTRY_NON_CREATEABLE不可创建,仅供内部使用。

请问一下,你说的这个公供内部使用是什么意思?还是只能在创建的这个工程里面使用吗?

如果我想拿这个控件在别的应用程序中使用该怎么调用?

#4


mark

#5


ATL从7.0开始就取消了BEGIN_OBJECT_MAP这个宏的使用,因为它把类厂映射需要的信息都放到一个独立的ATL段中去了,在每个组件最后的OBJECT_ENTRY_AUTO宏中实现了映射的添加。

这样隐藏接口是没用的,除非去掉此接口的注册信息,否则oleview都能看到接口定义。不注册的方法是在组件类中添加一句 DECLARE_NO_REGISTRY()

#6


隐藏注册信息.或者去掉注册的函数.

然后自己调用相关的函数创建出对象.

#7


兄弟要隐藏方法你在非COM的dll可以这么做,COM的dll你只能说去把Interface中的方法取掉,别无它法。
不知道你的目的,如果你不想让用户看到方法名字的话你就只能在interface中取掉,如果你只是不想让
用户用,那你可以在方法中判断做一些简单的加密:)

#8


引用 5 楼 jameshooo 的回复:
ATL从7.0开始就取消了BEGIN_OBJECT_MAP这个宏的使用,因为它把类厂映射需要的信息都放到一个独立的ATL段中去了,在每个组件最后的OBJECT_ENTRY_AUTO宏中实现了映射的添加。 

这样隐藏接口是没用的,除非去掉此接口的注册信息,否则oleview都能看到接口定义。不注册的方法是在组件类中添加一句 DECLARE_NO_REGISTRY() 

DECLARE_NO_REGISTRY()这个是放在类中任意一个地方吗?如果去掉了注册信息我自己用的时候应该是不可以直接调那些方法了吧,我应该怎么调用那些方法呢?

#9


去掉类型库注册信息

#10


问题是我还刚接触COM编程,大家都说去掉类型库注册信息、隐藏注册信息.或者去掉注册的函数不知道这几个是不是说的同一个意思,
是不是像 jameshooo 说的组件类中添加一句 DECLARE_NO_REGISTRY() 
如果是这样的话我试了一下,在MFC窗口里添加一个ActiveX 控件,结果在列表找不到那个类,我应该怎么使用它呢?

#11


隐藏注册信息之后不能再通过向导添加控件了,因为它要读取注册表。你可以直接包含需要的头文件,比如IID/CLSID定义已经接口定义,直接用CoCreateInstance来创建组件,注意接口注册信息可以隐藏,但是类厂注册信息不能隐藏。

#12


如果我要我要把这个DLL放到IE上用,我测试了一下用不了,把DECLARE_NO_REGISTRY()加进以后怎样才能在IE下使用呢,
另外如果我要在MFC窗口上把这个界面显示上去,又怎么显示呢?

#13


如果我要我要把这个DLL放到IE上用,我测试了一下用不了,把DECLARE_NO_REGISTRY()加进以后怎样才能在IE下使用呢, 
另外如果我要在MFC窗口上把这个界面显示到Dialog上面,又怎么显示呢?

#14


你已经在钻牛角尖了,不按规则来玩,就别玩COM游戏。IE都不认识你,怎么跟你玩?

#15


使用atl向导生成的COM组件想隐藏其方法是几乎不可能的,也不现实的。
我可以教你个方法,不使用atl创建COM组件。使用原始的方法通过定义
一些类来实现COM组件,只要你不对外发布你的接口声明文档别人是不会
看得到你的接口信息的,就无从要使用你的COM组件了。不要使用类型库,
在C++编写的程序没必要使用类型库,使用调度接口实现COM组件,在C++看来
是没有必要的,调度接口太高级了,效率低。因为是C++所以可以使用QueryInterface
的方法来获取接口。

#16


看不懂啊