一个控件,注册码输入后,随着被发布的软件到处“安家”,却无任何限制。但在安装此软件的机器上,其它软件想使用此控件,则会弹出请注册的提示。请问,它的原理是怎么样的?--谢谢!

解决方案 »

  1.   

    二楼的兄弟的方法,只适用于单个控件或控件使用次数较少的场合。但现在的需求是,一个控件组(包含近20个控件)中所有的控件都是通用控件。即,几乎每个窗口中,都将有10-100个控件的实例。因此,我觉得使用一个控件的注册窗口来一次性注册比较方便(不然,使用一次,注册码输入一次,这样的控件组别人打死都不会想用的^_^)。现在的关键是,如果是在第60个控件被拖到Form上时,触发的注册窗口中输入了正确的注册信息,那么如何去改变前59个控件的状态?如果只是简单的让控件去读一下注册表(或其它注册地点)的注册信息,那么这里还有一个问题,就是发布时的注册需求控制。即:如何使该控件只在发布的软件中可用,而其它软件中,该控件又会弹出需要注册的信息!
      

  2.   

    Visual Basic 的许可证支持可以保护投资。如果为控件部件添加许可证支持,一个许可证键会被编译到控件之中。这个键覆盖了部件中的所有控件。运行安装程序后,该许可证键将被传递到另一台计算机的注册表,从而允许用您的控件进行开发。如果只是简单把 .ocx 文件复制到另一台计算机并注册它,那么许可证键没有被传递,因此该控件就不能被使用。要为控件工程添加许可证支持,请 在“工程”菜单上,单击“<MyProject> 属性”打开“工程属性”对话框。选择“通用”选项卡,选定“要求许可证关键字”复选项,然后单击“确定”。 
    在生成 .ocx 文件时,Visual Basic 会创建含有注册键的 .vbl 文件,用来为控件部件提供许可证功能。在用Package and Deployment 向导为 .ocx 创建安装程序时,.vbl 文件会被自动地包含在安装过程中。许可证如何工作
    当某个开发者购买了控件部件并运行安装程序时,该许可证键将被添加到他的计算机上的注册表中。这样,每当这个开发者把您的控件的实例放置到窗体上时,Visual Basic(或其它任何开发工具)会使用该注册表键告诉该控件创建自己。如果某个开发者获得了控件部件的副本,但没有注册表键,该控件就不能在开发环境中创建其实例。当开发者发布应用程序时
    当开发者编译使用您的某个控件的程序时,部件的许可证键会被编译到其中。当他为此程序创建安装程序时,您的 .ocx 将被包含进去。然后用户就可以购买编译好的程序并运行安装程序。您的控件被安装到每个用户的机器上,但是您的许可证键未被添加到注册表中。每当用户运行该程序时,Visual Basic 的运行时 DLL 会请求您的控件创建一个运行实例,并把编译到程序中的那个键传递给它。控件不必检查注册表,因为 Visual Basic 会把键传给它。这样用户就可以运行编译过的应用程序,而不必在注册表中拥有该控件部件的许可证键。许可证和用户
    假设用户后来得到了一份 Visual Basic 副本。注意到您的控件部件已被安装到他的机器上,他在一个工程中添加了您的 .ocx 文件。第一次他试图将您的某个控件的实例放到窗体上时,Visual Basic 会告诉该控件使用注册表键创建其自身。但键不在那里,所以该控件部件就不能被用于开发环境中。许可证和一般用途的用户应用程序
    当 Microsoft Word 和 Microsoft Excel 等桌面应用程序在文档或用户窗体上创建控件实例时,它们会告诉控件使用注册表中的许可证键创建自己的实例。这意味着许可证控件不能被最终用户使用,除非这个用户购买并安装了您的控件部件。用户文档不能把许可证键编译进去。假设某个桌面应用程序的用户把一份您的控件部件副本和包含您的控件的文档给了合作者。当该文档被打开时,控件会被要求创建其运行时实例-使用注册表键。也就是说,此合作者也必须购买并安装了您的控件部件。否则,当该文档被打开时,控件实例是不能创建的。如果公司开发者制作的 ActiveX 控件是用于公司内部的最终用户,那么省略许可证支持可能会更加方便。这可以使最终用户更加容易地发布含有该控件的文档。许可证与控件制作者
    现在假定有人购买了您的控件部件,并决定用其中的某个控件来编写自己的新控件。正如其它程序一样,当用户编译自己的控件部件时,您的许可证键会被编译进去。安装向导会为新的控件创建一个许可证键,但不把您的许可证键添加到安装程序中。当开发者安装这个新的代码部件时,其许可证键被放到注册表中。开发者然后运行 Visual Basic,并试图在窗体上放置该控件的实例。该控件会被要求用其注册表键创建自己。接着,它要求子控件用其注册表键创建自己。您的控件不能在注册表中找到它们的许可证键,所以控件创建要失败。发布使用许可证控件的控件
    如果控件制作者想发布新控件,他使用了您制作的控件,那么就必须告诉购买者:为了使用他的控件,顾客的计算机必须安装您的控件部件。另外一种方法是,控件制作者与您协商,您允许在他的控件的安装程序中发布您的许可证键。在以上任何一种情况下,两个许可证键都会被安装到开发者的机器上,因此开发者可以创建第二个制作者的控件的设计时实例。当这些控件被编译到可执行程序中时,两个许可证键都将被编译进去。后来,当用户安装并运行此程序时,会要求第二个制作者的控件创建其自身。也会要求它的子控件创建自身,并且传递他们的许可证键。(以此类推,如果您的控件使用了带有许可证键的子控件。)注意 Visual Basic 专业版提供的 ActiveX 控件中,只有 DBGrid 控件在开发人员的计算机上要求许可键。例如,如果用 TreeView 控件作为子控件,则任何获准使用 TreeView 控件的人员都被允许将 TreeView 作为您的控件的部分来用。但要记住, Microsoft License Agreement 要求您对可重分配的 TreeView 添加有意义的主要功能,以将它作为所开发软件的部分合法分配。详细信息 关于子控件,包括与 Professional Edition of Visual Basic 一起提供的子控件,的许可证和发布的内容,请参阅本章前面的“可作为子控件使用的控件”。许可证与 Internet
    与支持控件许可证的浏览器结合,许可证控件可以用于 World Wide Web 页面上。这要求控件部件和许可证键都应该能够被访问 Web 页面的计算机下载。被下载的许可证键未被加到注册表中。相反,浏览器要求控件创建自己的运行时实例,并将下载的许可证键传给它。为了能够提供控件和许可证,使用您的控件的 Web 服务器的所有者必须购买并安装了您的控件,正如开发者需要做的那样。如果不能得到许可证,则控件创建会失败,而且浏览器会收到标准的控件创建错误。浏览器是把此错误信息传递给访问 Web 页面的人,还是简单地忽略它,这取决于浏览器的开发者。
      

  3.   

    许可证制度是个办法,但不是个安全的办法,因为只要将许可证的注册表键导入到任机器中,那么都可以使用。如果想自己加密,则楼主考虑的问题是个关键问题,就是让控件在任何机器上都可以运行,但未注册的机器却不可以在设计模式时使用,这就要借助于UserControl.Ambient.UserMode,如:
    Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
       If Not UserControl.Ambient.UserMode Then
       '' 如果在设计模式下运行,则检查是否注册
          If 未注册 then
               弹出窗口
          End If
       End IF
    End Sub第二个问题是一个窗口中多个控件只弹一次可只检查一次的问题可以通过设置公共变量来解决,在模块中设置一个Public bolShowAbout as Boolean变量,这个变量是可以被程序中所有控件共享的。所以如果显示了一次弹出窗口就将其设置为True,下次要弹出时可以检查此变决定是否再次弹出。
      

  4.   

    songyaowu兄弟,你的意思我基本明白的。只是有一点不清楚,如果软件开发者发布软件的时候,他仍然没有注册。按上面的方法,运行状态下的控件是不检查注册状态的,那他发布的软件不就相当于注册过了吗?当然,这个假设还有前提,就是控件限制期(次数)没有到 或 只是弹出要求注册提示,并无强制性的措施。讨论一下,别动气啊 ^_^
      

  5.   

    回exiong(悠扬) :
    你说的问题是存在的,但前提是,如果软件的设计者没有注册,那么他是不能使用此控件进行开发的。这样也就不存在你说的问题了。即使他愿意这样做,那他就得在程序调试期间对弹出的对话框进行N次点击。不累死它才怪。另外还有一个办法,就是做演示版和注册版两个版本的OCX,注册版发现未注册就不允许其放置在窗体上或直接退出。而演示版就永远是演示版,总有对话框弹出的。
    放心吧,只要是诚心实意地讨论,我就不会动气的 ^_^
      

  6.   

    其实,我一直想把注册信息设计成为控件的一个属性(Private的,这样属性就不能手动修改了)。
    作为属性,软件发布的时候,是可以带走的,而且相对来说很安全。这种设计最需解决的问题:
    如果,一个控件的实例是在该控件注册后被创建的,某个属性被初始化没有任何问题。问题是,在注册之前被创建的实例的注册属性如何修改?即,如何让控件实例自己修改自己的属性。我发现在设计模式下,每次修改控件的某个属性都会触发UserControl_WriteProperties(PropBag As PropertyBag)事件。那么我想,现在要做的就是控件的实例自己去触发它了。我观察了一下,这个事件只有在下面情况时触发:
    ·属性修改;
    ·保存;
    ·窗口打开/关闭(设计时);
    时才会触发。......该怎么设计?