如何使编译后的组件(dll或exe)中不包含类型库? 如何使编译后的组件(dll或exe)中不包含类型库?即:通过oleview或#import不能得到组件中的类型信息?谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 类型库可以放在EXE或DLL里,也可以存放在独立的TLB/OLB文件中,完全自由决定,但是组件注册之后注册表中就一定会有类型库信息,否则组件也没法被客户端启动。不知道你到底想干什么。 >>不知道你到底想干什么。只是不想让别人看到组件的接口等信息。只是自己的程序可以调用就可以,别人不可以查看或调用。只将类型库信息放入.tlb中,而不放入dll或exe中。这样,发布时只将dll或exe发布出去。其中不含类型库信息。可以做到吗? >>但是组件注册之后注册表中就一定会有类型库信息,否则组件也没法被客户端启动。类型库是必需的?!! 是必须的,毕竟我们编写的程序要应用在别人已经设计好的系统上,系统没法让你隐藏你就没法隐藏。你不想让比人看到接口信息? 接口信息不就是一些函数、事件或者变量名称么?别人看到了又能怎么样?怕别人用你的DLL? 那你可以考虑用算法加密,其实就跟软件生成授权序列号一样。每次分发你的DLL给客户的时候要求用户提供硬盘序列号等信息(可以自己写程序发给用户,用户运行后把信息发送给你),另外做一个专门的程序来生成序列号,然后将序列号添加到DLL内部(内部运行一个验证程序)去再发送给用户。这样就只有经过你授权的用户才能使用你的DLL了。想要完全将类型库隐藏不是好办法,不然那么多大公司开发软件不早就这么做了? 能做到,但是没必要,你完全可以添加一些用于扰乱敌人视线的无用的接口和方法,或者胡乱取名,这些名称只有你自己知道哪个才有用。例如接口名称叫A、B、C...,方法或属性名称叫abc、def、ghi...,其中只有B接口的ghi方法有用,其他都是用做干扰的。当然方法的参数也可以让敌人摸不着头脑,不要用long/BSTR等等类型,而是用VARIANT作为参数类型,因为VARIANT能表示任何类型,别人根本不知道该怎么构造这个VARIANT >>能做到,..有比你说的那些方法更好的方法吗?比较正规一些的:)还是不明白--以前给出dll(非组件)时,谁也不会给出.h文件。为的是尽量保密。而组建设计为什么没有考虑这点--非要将类型库公开!?另外,谁给解释以下,为什么客户端调用组建,一定要类型库? >>要么在封一层库,层次越多,信息越少将所有对接口的调用转化成对库的调用?具体如何做,能详细介绍一下吗? 有比你说的那些方法更好的方法吗?比较正规一些的:)=================================================正规的做法就是老老实实公开类型库。如果只想自己使用,何必设计成COM组件呢?做成DLL但不公开头文件不得了,只使用导出函数,在参数中要求传入回调函数指针,别人没有头文件,就无法知道函数的参数类型和个数,也无法知道返回类型,也无法知道调用约定,所以很难正确地设计回调函数类型,运行一定会出错。 我就做了一个COM组件,但它不需要注册,文件中也没有类型库资源,甚至连一个导出函数都没有,但是这个DLL能被我自己的EXE正常使用,别人都用不了。 >>我就做了一个COM组件,但它不需要注册,文件中也没有类型库资源,甚至连一个导出函数都没有,但是这个DLL能被我自己的>>EXE正常使用,别人都用不了。你是如何是实现的?用到ATL了吗? 》》何必设计成COM组件呢?做成DLL但不公开头文件不得了,之所以做成组件,还有一个考虑就是--可以通过脚本语言调用和远程调用。 google了一下,有人建议将.Rc中的typelib内容屏蔽掉。按照做了,是看不到类型库了.但注册时报错:( 类型库可以不要,对于高手来说根本不需要知道,直接dll的调用即可,反编译一下什么都看到了,如果那些高手想搞你的话,其实你只要做一些简单的加密即可,只要能防止普通用户即可达到目的,你可以有个初始化的方法,传进取一个字符串加以判断即可我只想说达到目的即可,国内高手太多,没法防住:) 因为CoCreateInstance要读取注册表才能找到组件的位置和信息。 >>因为CoCreateInstance要读取注册表才能找到组件的位置和信息。但这跟类型库有什么关系?没有类型库,靠IID_××× 不能定位组件和接口?迷糊中 将tlb信息从资源rc文件中清除即可. >>将tlb信息从资源rc文件中清除即可.试过。这样虽然.dll文件中没有类型库信息了,但当注册组件时,必须使用.tlb文件。也就是说,发布时需要.dll + .tlb.这样还是不能隐藏类型库信息。是这样吗?我哪里没作对? 可以不使用类型库来编写COM类型库是供给其他解释性编程语言使用COM的如果不发行类型那些解释行语言根本无法使用这个COM组件,类型库的作用就等同于C++里面的使用COM的组件ID和接口声明头文件!可以把COM做成不支持调度接口的方式,只要不发布接口的声明文档别人是没有办法使用你的COM组件的。如果你编写的COM要提供该给别的解释性语言使用的话,没有类型库是不行的。只要使用一些工具读取类库,一些接口信息就出来了。最好把接口的函数使用参数,因为参数可以使调用者没有办法清楚知道函数的使用方法,无参数的接口函数很容易使用。 呵呵 说实在话 没有导出函数,你的程序是怎么加载dll的,除非你做的COM是exe形式的,即进程外的COM组件.我还没见过不用导出函数就能实现COM组件(dll形式的)。没有到处函数像没有门的房间,没门你怎么进去。虽然说可以不在注册表中注册COM组件,但是这个组件的加载方式就不能使用标准的方式加载。这样抛开了COM库提供的安全机制,会不会给系统带来其它问题,这是个问题。这的看你实现的COM的代码和运行的环境了。 类型库也可以使C++不通过接口ID和接口声明文档来使用这个接口!在C++里面可以使用CoCreateInstance和CoGetClassObject来创建COM组件,但是需要组件ID和接口声明文档。 100分,请问一个目录监控问题 ClistBox会内存溢出吗? 谁有只用SDK写的FTP客户端软件的例子呢? 本人要做一款音频软件,求各位帮忙! 大家都进来说说VC的快捷键有哪些?有哪些方便之处:) 写注册表实现自动注册数据源的函数写出来了,放在哪个地方好呢? VC在编译上出的错 请问在Visual C++6里面怎么用SQLDMO 来备份数据库啊? VC中怎么在屏幕中查找指定的图片 怎样给一个新建的CWnd对象赋予一个新的ID号? 如何应用com接口扩展程序功能? 专家们,关于调用adobe reader activex控件的问题,急!!!
只是不想让别人看到组件的接口等信息。只是自己的程序可以调用就可以,别人不可以查看或调用。只将类型库信息放入.tlb中,而不放入dll或exe中。
这样,发布时只将dll或exe发布出去。其中不含类型库信息。可以做到吗?
类型库是必需的?!!
是必须的,毕竟我们编写的程序要应用在别人已经设计好的系统上,系统没法让你隐藏你就没法隐藏。
你不想让比人看到接口信息? 接口信息不就是一些函数、事件或者变量名称么?别人看到了又能怎么样?怕别人用你的DLL? 那你可以考虑用算法加密,其实就跟软件生成授权序列号一样。每次分发你的DLL给客户的
时候要求用户提供硬盘序列号等信息(可以自己写程序发给用户,用户运行后把信息发送给你),另外做一个专
门的程序来生成序列号,然后将序列号添加到DLL内部(内部运行一个验证程序)去再发送给用户。
这样就只有经过你授权的用户才能使用你的DLL了。想要完全将类型库隐藏不是好办法,不然那么多大公司开发软件不早就这么做了?
例如接口名称叫A、B、C...,方法或属性名称叫abc、def、ghi...,其中只有B接口的ghi方法有用,其他都是用做干扰的。
当然方法的参数也可以让敌人摸不着头脑,不要用long/BSTR等等类型,而是用VARIANT作为参数类型,因为VARIANT能表示任何类型,别人根本不知道该怎么构造这个VARIANT
而组建设计为什么没有考虑这点--非要将类型库公开!?另外,谁给解释以下,为什么客户端调用组建,一定要类型库?
具体如何做,能详细介绍一下吗?
=================================================
正规的做法就是老老实实公开类型库。如果只想自己使用,何必设计成COM组件呢?做成DLL但不公开头文件不得了,只使用导出函数,在参数中要求传入回调函数指针,别人没有头文件,就无法知道函数的参数类型和个数,也无法知道返回类型,也无法知道调用约定,所以很难正确地设计回调函数类型,运行一定会出错。
按照做了,是看不到类型库了.但注册时报错:(
但这跟类型库有什么关系?
没有类型库,靠IID_××× 不能定位组件和接口?迷糊中
也就是说,发布时需要.dll + .tlb.这样还是不能隐藏类型库信息。是这样吗?我哪里没作对?
类型库是供给其他解释性编程语言使用COM的
如果不发行类型那些解释行语言根本无法使用这个COM组件,
类型库的作用就等同于C++里面的使用COM的组件ID和接口声明头文件!
可以把COM做成不支持调度接口的方式,只要不发布接口的声明文档别人
是没有办法使用你的COM组件的。如果你编写的COM要提供该给别的解释性语言
使用的话,没有类型库是不行的。只要使用一些工具读取类库,一些接口信息就出来了。
最好把接口的函数使用参数,因为参数可以使调用者没有办法清楚知道函数的使用方法,
无参数的接口函数很容易使用。
呵呵 说实在话 没有导出函数,你的程序是怎么加载dll的,除非你做的COM是exe形式的,即进程外的COM组件.
我还没见过不用导出函数就能实现COM组件(dll形式的)。没有到处函数像没有门的房间,没门你怎么进去。
虽然说可以不在注册表中注册COM组件,但是这个组件的加载方式就不能使用标准的方式加载。
这样抛开了COM库提供的安全机制,会不会给系统带来其它问题,这是个问题。这的看你实现的COM
的代码和运行的环境了。
在C++里面可以使用CoCreateInstance和CoGetClassObject来创建
COM组件,但是需要组件ID和接口声明文档。