如何使编译后的组件(dll或exe)中不包含类型库?
即:通过oleview或#import不能得到组件中的类型信息?谢谢了!

解决方案 »

  1.   

    类型库可以放在EXE或DLL里,也可以存放在独立的TLB/OLB文件中,完全自由决定,但是组件注册之后注册表中就一定会有类型库信息,否则组件也没法被客户端启动。不知道你到底想干什么。
      

  2.   

    >>不知道你到底想干什么。
    只是不想让别人看到组件的接口等信息。只是自己的程序可以调用就可以,别人不可以查看或调用。只将类型库信息放入.tlb中,而不放入dll或exe中。
    这样,发布时只将dll或exe发布出去。其中不含类型库信息。可以做到吗?
      

  3.   

    >>但是组件注册之后注册表中就一定会有类型库信息,否则组件也没法被客户端启动。
    类型库是必需的?!!
      

  4.   


    是必须的,毕竟我们编写的程序要应用在别人已经设计好的系统上,系统没法让你隐藏你就没法隐藏。
    你不想让比人看到接口信息? 接口信息不就是一些函数、事件或者变量名称么?别人看到了又能怎么样?怕别人用你的DLL? 那你可以考虑用算法加密,其实就跟软件生成授权序列号一样。每次分发你的DLL给客户的
    时候要求用户提供硬盘序列号等信息(可以自己写程序发给用户,用户运行后把信息发送给你),另外做一个专
    门的程序来生成序列号,然后将序列号添加到DLL内部(内部运行一个验证程序)去再发送给用户。
    这样就只有经过你授权的用户才能使用你的DLL了。想要完全将类型库隐藏不是好办法,不然那么多大公司开发软件不早就这么做了?
      

  5.   

    能做到,但是没必要,你完全可以添加一些用于扰乱敌人视线的无用的接口和方法,或者胡乱取名,这些名称只有你自己知道哪个才有用。
    例如接口名称叫A、B、C...,方法或属性名称叫abc、def、ghi...,其中只有B接口的ghi方法有用,其他都是用做干扰的。
    当然方法的参数也可以让敌人摸不着头脑,不要用long/BSTR等等类型,而是用VARIANT作为参数类型,因为VARIANT能表示任何类型,别人根本不知道该怎么构造这个VARIANT
      

  6.   

    >>能做到,..有比你说的那些方法更好的方法吗?比较正规一些的:)还是不明白--以前给出dll(非组件)时,谁也不会给出.h文件。为的是尽量保密。
    而组建设计为什么没有考虑这点--非要将类型库公开!?另外,谁给解释以下,为什么客户端调用组建,一定要类型库?
      

  7.   

    >>要么在封一层库,层次越多,信息越少将所有对接口的调用转化成对库的调用?
    具体如何做,能详细介绍一下吗?
      

  8.   

    有比你说的那些方法更好的方法吗?比较正规一些的:)
    =================================================
    正规的做法就是老老实实公开类型库。如果只想自己使用,何必设计成COM组件呢?做成DLL但不公开头文件不得了,只使用导出函数,在参数中要求传入回调函数指针,别人没有头文件,就无法知道函数的参数类型和个数,也无法知道返回类型,也无法知道调用约定,所以很难正确地设计回调函数类型,运行一定会出错。
      

  9.   

    我就做了一个COM组件,但它不需要注册,文件中也没有类型库资源,甚至连一个导出函数都没有,但是这个DLL能被我自己的EXE正常使用,别人都用不了。
      

  10.   

    >>我就做了一个COM组件,但它不需要注册,文件中也没有类型库资源,甚至连一个导出函数都没有,但是这个DLL能被我自己的>>EXE正常使用,别人都用不了。你是如何是实现的?用到ATL了吗?
      

  11.   

    》》何必设计成COM组件呢?做成DLL但不公开头文件不得了,之所以做成组件,还有一个考虑就是--可以通过脚本语言调用和远程调用。
      

  12.   

    google了一下,有人建议将.Rc中的typelib内容屏蔽掉。
    按照做了,是看不到类型库了.但注册时报错:(
      

  13.   

    类型库可以不要,对于高手来说根本不需要知道,直接dll的调用即可,反编译一下什么都看到了,如果那些高手想搞你的话,其实你只要做一些简单的加密即可,只要能防止普通用户即可达到目的,你可以有个初始化的方法,传进取一个字符串加以判断即可我只想说达到目的即可,国内高手太多,没法防住:)
      

  14.   

    因为CoCreateInstance要读取注册表才能找到组件的位置和信息。
      

  15.   

    >>因为CoCreateInstance要读取注册表才能找到组件的位置和信息。
    但这跟类型库有什么关系?
    没有类型库,靠IID_××× 不能定位组件和接口?迷糊中 
      

  16.   

    将tlb信息从资源rc文件中清除即可.
      

  17.   

    >>将tlb信息从资源rc文件中清除即可.试过。这样虽然.dll文件中没有类型库信息了,但当注册组件时,必须使用.tlb文件。
    也就是说,发布时需要.dll + .tlb.这样还是不能隐藏类型库信息。是这样吗?我哪里没作对?
      

  18.   

    可以不使用类型库来编写COM
    类型库是供给其他解释性编程语言使用COM的
    如果不发行类型那些解释行语言根本无法使用这个COM组件,
    类型库的作用就等同于C++里面的使用COM的组件ID和接口声明头文件!
    可以把COM做成不支持调度接口的方式,只要不发布接口的声明文档别人
    是没有办法使用你的COM组件的。如果你编写的COM要提供该给别的解释性语言
    使用的话,没有类型库是不行的。只要使用一些工具读取类库,一些接口信息就出来了。
    最好把接口的函数使用参数,因为参数可以使调用者没有办法清楚知道函数的使用方法,
    无参数的接口函数很容易使用。
      

  19.   


    呵呵 说实在话 没有导出函数,你的程序是怎么加载dll的,除非你做的COM是exe形式的,即进程外的COM组件.
    我还没见过不用导出函数就能实现COM组件(dll形式的)。没有到处函数像没有门的房间,没门你怎么进去。
    虽然说可以不在注册表中注册COM组件,但是这个组件的加载方式就不能使用标准的方式加载。
    这样抛开了COM库提供的安全机制,会不会给系统带来其它问题,这是个问题。这的看你实现的COM
    的代码和运行的环境了。
      

  20.   

    类型库也可以使C++不通过接口ID和接口声明文档来使用这个接口!
    在C++里面可以使用CoCreateInstance和CoGetClassObject来创建
    COM组件,但是需要组件ID和接口声明文档。