COM/COM+远程匿名访问测试成功[转]

详细步骤!
1、首先在VB中写一ActiveX(DLL)组件,工程名为COMTEST。编译后在另一程序中调用,确认组件工作正常。
2、打开“控制面板/管理/组件服务”,在“COM+应用程序”下利用“COM+应用程序安装向导”创建一个空的COM+应用程序,名称为“COMTEST”。
3、在“COMTEST”下,新建“组件”,在“组件安装向导”中,选择“安装新组件”(注意:不要使用“导入已被注册的组件”),然后将生成的dll及tlb都添加进来(两个文件都要!),完成。
4、右击“COM+应用程序”上方的“我的电脑”,选择“属性”,然后在“属性”对话框中的“默认属性”页下,将“默认身份验证级”改为“无”,将“默认模拟级别”改为“匿名”,然后在“默认安全设置”页下的默认启动权限里添加"Everyone",确定。(这里是匿名关键之一)
5、在本地用户管理里启用Guest用户!(这就是有人说权限里设置了Everyone仍然无法访问的原因)
6、右击“COMTEST”,导出客户端的“应用代理”。注意:在导出对话框中,必须选择“应用程序代理”而不是“服务器应用程序”!并将导出的文件在客户机安装!
7、好了!现在就可以在客户端进行调用了,点击运行后第一次运行在数秒弹出希望看到的运行结果,在激活服务器的准备状态以后的运行通常都在半秒内响应完成!(注:VB状态下加垃圾机器)

http://community.csdn.net/Expert/topic/3170/3170015.xml?temp=.4227411


别人写的COM+在VB中的开发与应用例子,我测试过,可以运行。相信大家看了有所启示。

终于试验成功了!
我在原本只有win2000 professional 的机器上又安装了一个win2000 server,并将其配置成主域
控制器,然后在另一台win98机器上用Administrator登录,启动VB,写个小程序试了一下,OK!

为避免大家继续在黑暗中摸索,我现将试验用的具体例子及步骤详述如下(一个最简单的例子):
1、在win2000 server机器上用VB(+SP5.0)创建一个ActiveX(DLL)工程,将工程名字改为“COM_Test”
2、添加一个类模块,名称为“ClsAdd”,并输入如下几行代码:
   Option Explicit
   Public x, y As Integer
   Public Function myAdd() As Integer
     myAdd = x + y
   End Function
3、打开“工程属性”对话框,选择“生成”,选中“自动升级”;选择“部件”,选中“远程服务器文件”(此点很重要,否则编译时不会生成类型库文件COM_Test.TLB)及“二进制兼容”,最后“确定”
4、保存并编译,生成“Com_Test.dll”
5、打开“控制面板/管理/组件服务”,在“COM+应用程序”下利用“COM+应用程序安装向导”创建一个空的COM+应用程序,名称为“MyTest”
6、在“MyTest”下,新建“组件”,在“组件安装向导”中,选择“安装新组件”(注意:不要使用“导入已被注册的组件”),然后将第4步生成的Com_Test.dll及Com_Test.tlb都添加进来(两个文件都要!),完成。
7、右击“COM+应用程序”上方的“我的电脑”,选择“属性”,然后在“属性”对话框中的“默认属性”页下,将“默认身份验证级”改为“无”,确定。
8、右击“MyTest”,导出客户端的“应用代理”。注意:在导出对话框中,必须选择“应用程序代理”而不是“服务器应用程序”!
9、将导出后的两个文件(即应用程序代理)安装到win98机器上,此时它会在注册表中添加几处注册项,并在C:\program files\ComPlus Applications下产生一个以CLISD命名的文件夹,打开来可看到Com_Test.tlb及Apl82.tmp二个文件。
注意:win98机器上是没有Com_Test.dll文件的,该文件在win2000 server机器上!

好了,准备工作至此结束,下面在win98机器上来验证你的COM+配置型组件能否工作。(先用Administrator及口令登录)
10、启动VB(+sp5.0),创建一个exe工程,在窗体上放置一个文本框与一个命令按钮,并在命令按钮的Click事件中加入代码:

Dim ox as object
set ox=createobject("Com_Test.ClsAdd","win2000 server 的IP地址")
ox.x=12
ox.y=13
text1.text=ox.myAdd()

执行程序,win2000 server 机器的硬盘灯一阵闪烁之后,Text1中欢快地跳出“25”
---成功了!

以上经验是在我经过多次痛苦的失败之后摸索出来的,看来靠别人不如靠自己。

后记:

1、此前,我对有关COM+的内容可以说是一片空白,什么都不懂,甚至也没做过有关DCOM的试验。近来空闲,络续看了点CSDN论坛中的提问与回答,可没有一个让人满意的。万不得已,自力更生。
2、个人以为,COM+组件并不一定要配置在主域控制器上,但必须配置在某个域中的某台win 2000 Server上,而不是一般的2000 professional上(可能考虑到安全性)。
3、配置COM+组件不是在win98机器上的,而是在win 2000 Server上。比如,你在win98机器上安装
应用程序代理后,找不到相应的DLL文件,只有TLB文件(类型库),该DLL文件在win 2000 Server上由Dllhost.exe来负责装入内存。
4、若是创建非配置型组件,则第一步中不是创建一个ActiveX(DLL)工程,而是ActiveX(EXE)工程,
因为该exe文件在服务端不是由Dllhost.exe来负责装入内存,而是自行执行。此种情形下,当然也
就不需要第5至9步的操作了。
http://www.vbeach.net/bbs/viewthread.php?tid=147

说起COM我首先想起的是在《Inside Com》一书中所讲的,类实际上也是一种结构,用VB的语言来说,类即是Type的扩展。那么类扩展了什么?很简单,类是在结构中加上了函数(方法)和事件。再进一步,函数可以为虚函数,这样,就可以象定义结构那样定义类了。于是,这样的类即是一个空类,又称为父类。有了空类,在VC中通常是用构造函数来对类初始化,使其成为一个对象。而VB则用的是COM的接口委派继承而产生新的对象。于是这又回到了COM这个本质的问题。
    我们现在难以想象,在COM以前究竟是什么方法能使应用程序实现二进制共享。但是,有些事实是记得的。早期的VB控件,其扩展名是VBX。其中的X是同时指16进制与扩展这两个含义,说穿了仍是二进制扩展。为何要扩展,目的是为了成为共享组件。到了VB4.0,那时还不是COM,但己有了OCX,据说原含义是OLE CONTROL EXTENTION。
    而现在我们不妨再看看:VB能用的文件的扩展名有:OCX,DLL,TLB,OLB,EXE,而这些实际并不以扩展名而决定其是否为COM,但是如果我们只要在资源管理器中查看一下文件属性,即可以知道:
    OCX:ActiveX DLL
    DLL: ActiveX DLL
    DLL: 应用程序扩展(当然前者在2000中说明也是这样)
    TLB:Type Libaray
    OLB: Object Libaray
    EXE: ActiveX Exe
    Exe: 应用程序(当然前者在2000中说明也是这样)
    我们可以发现,只要是Libaray则VB即可以使用!!同样,只要带上ActiveX则VB即可以引用或添加为部件。
    另一个很奇怪的是:通常VB中引用的ActiveX以后,常用的方法是:Set或CreateObject,如:
    Dim oSome as fSome.oMenber
    Set oSome = New fSome.oMenber
    或者
    Dim oSome as fSome.oMenber
    Set oSome = CreateObject(fSome.oMenber)
    如果你用过VC,那一定会想到,你可以用类向导新建类,选From Type Libaray, 然后即可选择一个VB的DLL。 这时最简单的则是用CreateObject创建对象后调用。在VBScript中同样也是用这一种方法。我想这三个CreateObject一定存在差别,差别在何处?
    我还想到,一定有很多人不知,在Visual Studio 6.0的第三张安装盘上有这么两个工具:一个是在:
    :\COMMON\TOOLS\VB\IDGEN\
    说明是:
    Both GUIDGEN and UUIDGEN are tools for generating globally unique identifiers known as GUIDs.  GUIDS are commonly used in OLE to identify classes (CLSID) or interfaces (IID.)  These utilities are included with VB for developers who want to generate IDL (Interface Description Language) or ODL (Object Description Language.)  IDL and ODL are used with the MIDL.EXE and MKTYPLIB.EXE tools to generate type libraries that can be used with VB.
    另一个是在:
    :\COMMON\TOOLS\VB\UNSUPPRT\TYPLIB
    这是一个将对象定义语言的文件编译成TLB扩展名的文件以使VB可用。
    这两个工具是在COM之前的,也就是说,COM之前就有了某种模式。由此我在想,那个《Hardcore of Visual Basic 5.0》的作者是不是用这些工具为WIN32 API做了个对象库?好象不是,那么,可能就与MSDN中KB中的Make Type Libaray那个例子有关!
    回过头来,再说COM与VB,一说起COM编程,一定是OCX或DLL,然而,OCX中却很难看出前述基本的COM,实际上应当与Visual FoxPro中的叫法一样——容器类,即控件是通过容器类来继承的。所以,如果你要自定义控件,则有两个途径:创建ActiveX控件工程,或者在你的工程中加上UserControl类。这是一个秘密,VB5界面上有此菜单,VB6.0界面上没有,实际上是可以加进去的。
    那么通过什么才能看出前述基本的COM呢?以下即是一个最简单的例子:
    新建一个ActiveX Dll 工程Project1,
    在Class1中加入以下代码:
Option Explicit
   
Public Function doHello() As String
        doHello = "Hello,world!"
End Function

    编译,然后在另一工程Project2并引用Project1.dll,以下是调用代码:

Private Sub Form_Load()
    Dim ctest As New class1
    MsgBox ctest.doHello

End Sub

   如果将前者看作是Type,则:
Type Class1
    Option Explicit
    Public Function doHello() As String
        doHello = "Hello,world!"
    End Function
End Type
   当然,这样是不可执行的。

posted @ 2005-06-11 15:50  vboy  阅读(1542)  评论(0编辑  收藏  举报