这方面是个重点,更是个难点,也可能是某些人的看见本领。这个年度里,有多少成功案例,又有多少失败苦果。年底了,做个总结吧。

解决方案 »

  1.   

    //COM+ 常见问题解答//http://support.microsoft.com/default.aspx?scid=FH;ZH-CN;complusfaq#4
    如何解决COM+/MTS 4097 错误事件?
     当COM/COM+应用程序发生违例时, 会在操作系统事件日志中产生4097事件。当发生这个错误时,可以按照下列步骤检查:
    (1)升级MDAC到最高版本
    (2)如果应用程序存取第三方数据库软件,确保客户端软件与COM+/MTS兼容
    (3)使用OleView.exe确认组件能够被实例化
    (4)升级操作系统到最新的Service Pack
    (5)如果程序由VB编写,在编译前, "Unattended Execution" 和"Retained in Memory"选项需要使能
    (6)服务器端使用最新的VB运行时文件
    (7)具有强健的出错处理程序
    不支持事务的组件是否能放入COM+应用程序中? 
     事务处理和对象请求代理是COM+/MTS 编程模型的两个重要的组成部分。 不包含事务处理的组件仍可以利用分布式组件对象模型和COM+/MTS的进程级安全系统。这样, COM+/MTS 被用来管理对象实例和对象生命周期。
    如何在安装完COM+ Application Proxy之后, 修改远端服务器名?
     
    首先要安装Windows 2000 Service Pack 1 或以上版本。 然后在应用程序属性中选择Activation对话框, 在里面填入远端服务器的IP地址或机器名。
    VB在COM+和MTS中创建对象有何异同点?
     在MTS中,必须在根对象中用ObjectContext.CreateInstance来创建子对象。 这种方法在COM+仍然可行, 但不是必需的。 COM+可以使用VB标准的CreateObject函数, 正确将事务转移到子对象。
    需要开启哪些端口以使MSMQ能够透过防火墙存取?
     只发消息: TCP 1801
    发消息和活动目录存取: TCP 1801, RPC 135, 2101
    收发消息和活动目录存取: TCP 1801, RPC 135, 2101, 2103, 2105。
    把COM+ 应用程序导出为Application Proxy后, 安装到Windows NT 或 Windows 98上时, 为什么CreateObject()会产生”class not registered”错误? 
     在客户端用regedit观察, 发现组件CLSID并没有注册。 这个问题将在安装Windows 2000 SP3之后解决。
    如果COM+应用程序中的组件依赖于其他的组件或动态链接库,将COM+应用程序导出为Application Proxy并试图安装在Windows 2000上时, 会出现下列错误:Error registering COM+ Application. Contact your support personnel for more information。
     这个现象只发生于安装Application Proxy到Windows 2000客户端时。即使安装的是Application Proxy,Windows Installer也会试图对所依赖的动态链接库等调用LoadLibrary()。因此,如果LoadLibrary()找不到相应的动态链接库, 就会出现此错误。有下列方法可以解决此问题:
    §先将所依赖的动态链接库拷贝到客户机的winnt\system32目录, 再安装Application Proxy。
    §生成自己的安装程序,写入DCOM所需的注册表项目。
      

  2.   

    //MTS开发多层数据库应用系统 //出处不详
      1. 创建MTS组件 
      本例中我们将编写一个MTS组件,运行于中间层的应用服务器上,由它建立与数据库服务器的连接,完成对某课程的授课教师信息的查询。 
      启动Visual Basic,新建一ActiveX DLL项目。选择工程选单,在引用窗口中选中Microsoft ActiveX Object Library 和Microsoft Transaction Sever Type Library。按“确定”将这两项加到项目中。 
      从工程选单中选择工程属性,在通用选项中将项目名称改为MtsDemo。线程模块选择分部线程DLL,将类模块名称改为Course,将下列程序加入类模块的通用声明中: 
      Option Explicit 
      Public Function ListCourses( ByVal mcourse as String) As ADODB.Recordset 
       On Error GoTo ErrorHandle 
       Dim strSQL As String 
       Dim objContext As.ObjectContext 
       Set objContext = GetObjectContext() 
       ' 建立事务性组件 
       Dim objADOConn As ADODB.Connection 
       ' 利用ADO访问数据库 
       Dim objRS As ADODB.Recordset 
       Set objADOConn = New ADODB.Connection 
       With objADOConn 
       .connectiontimeout=10 
       .connectionstring="Provider=SQLOLEDB.1;UserID=sa;Initial Catalog=DBcourse" 
      ' 通过OLEDB建立与数据库的连接 
       .Open 
       End with 
       Set ObjRS = New ADODB.Recordset 
       StrSQL="SELECT 
      Teacher.name,Teacher.sex,Techer.age,Teacher.edu_level,Teacher.tiltle" 
       strSQL=strSQL&&" From Teacher,TeacherCourse,Courses " 
       strSQL=strSQL&& "Where Teacher.teacher_NO=TeacherCourse.teacher_no 
       and TeacherCourse.course_no=Courses.course_no 
       and Courses.course like'" && mCourse && "'" 
      '“like”关键字可实现模糊查询 
       ObjRS.Open strSQL, ObjADOConn 
       ' 进行数据库查询 
       Set ListCourses = ObjRS 
       ObjContext.SetComplte 
       ' 若事务成功完成,则提交该事务 
       objADOConn.Close 
       Set objADOConn = Nothing 
       Set objRS=Nothing 
       strSQL = "" 
       '关闭数据库连接,释放所有对象 
       Exit Function 
      ErrorHandle: 
      ObjContext. SetAbort 
      Set ListCourses=Nothing 
       ' 若事务失败,则回滚事务 
      End Function 
      2. 注册MTS组件 
      所有运行于服务器端的ActiveX DLL都应在MTS中注册,这是通过Transaction Server Explorer完成的。其过程如下: 
      (1)创建软件包 
      软件包是在同一进程中运行的组件集合,不同软件包中的组件以进程隔离的方式运行在隔离的进程中。在创建软件包时,开发者应尽量把共享资源的组件分配在同一软件包内;考虑到软件包中各个组件所共享的资源类型,可以把那些共享“昂贵”资源(如对某个特定数据库的连接)的组件编为一组。 
      (2)向软件包添加组件 
      在想安装组件的包中选择Component文件夹,单击Install New Component(s) 按钮,当提示添加文件时找到新生成的MtsDemo.dll文件将其加入。 
      3. 编写客户端程序 
      创建一个标准EXE项目。选择工程选单,接着选择引用,在引用窗口中选中刚才创建的MtsDemo,加入到项目中。 
      向窗体中添加如下内容: 
            名称     标题 
      标签     label1   请输入课程名: 
      文本框   txtcourse   
      命令按扭   cmdok    查询 
      数据网格   dgresult   
      再将下列程序加入通用声明中: 
      Private Sub cmdOK_Click() 
       Dim rsResult As ADODB.Recordset 
       Dim objMts As Object 
       Dim mCourse As String 
       mCourse = Trim(txtCourse.Text) 
     Set objMts = CreateObject(mtsDemo.Course) 
     Set rsResult = objCourse.ListCourses(mCourse) 
     If rsResult.EOF Then 
     MsgBox ("无满足条件的记录!") 
     Exit Sub 
     End If 
     Set dgResult.DataSource = rsResult 
     Dgresult.Columns(0).Caption = "姓名" 
     Dgresult.Columns(1).Caption = "性别" 
     DgResult.Columns(2).Caption = "年龄" 
     Dgresult.Columns(3).Caption = "学历" 
     DgResult.Columns(4).Caption = "职称" 
     DgResult.Refresh 
     Set objMts = Nothing 
      End Sub 
      4. 运行客户端 
      首先将编写好的客户端程序进行编译发布,然后在Microsoft Management Console中找到新的软件包,击右键选择导出,将它导出到c:\Program File\Packages中,在该文件夹的Client下自动生成了MtsDemo的客户端安装程序。在客户机上运行Client文件夹下的Setup.exe文件,再安装客户端程序即可运行。
      

  3.   

    //将COM+ Events进行到底//http://dev.csdn.net/article/14/14343.shtm
    //关于事件问题,没有读懂,MSDN里的都是英文的更看不懂。大家自己看。
      

  4.   

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

  5.   

    //COM+应用程序//http://www.9466.com/web/html/2004/1088.htm
    //原文是图片格式,拷不过来,哈!
      

  6.   

    谁做过控制服务器的COM+啊? 我都找了好久了!可以控制FTP 虚拟空间等操作的
      

  7.   

    http://blog.csdn.net/online/category/9936.aspx
      

  8.   

    谁做过控制服务器的COM+啊? 我都找了好久了!可以控制FTP 虚拟空间等操作的
    以下转自网上
    Option ExplicitPrivate Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
                    (ByVal lpBuffer As String, ByVal nSize As Long) As LongPublic Function CreateFTPDirectory(ByVal VirtrueName As String, ByVal LocalPath As String) As Boolean
        Dim ExistFTP As Boolean
        Dim ServerObj As Object
        Dim VirtrueDirObj As Object
        Dim MyVirtrueDir As Object
        
        ExistFTP = False
        CreateFTPDirectory = False
        
        On Error GoTo ErrFTP
        If CheckExistIIS Then
            Set ServerObj = GetObject("IIS://LocalHost/MSFTPSVC/1/ROOT")
            For Each MyVirtrueDir In ServerObj
                If UCase(MyVirtrueDir.Class) = UCase("IIsFtpVirtualDir") Then
                    If UCase(MyVirtrueDir.Name) = UCase(Trim(VirtrueName)) Then
                        ExistFTP = True
                    End If
                End If
            Next
            
            If ExistFTP Then
                Set VirtrueDirObj = ServerObj.GetObject("IIsFtpVirtualDir", VirtrueName)
            Else
                Set VirtrueDirObj = ServerObj.Create("IIsFtpVirtualDir", VirtrueName)
            End If
            
            VirtrueDirObj.Path = LocalPath
            VirtrueDirObj.AccessRead = True
            VirtrueDirObj.AccessWrite = True
            VirtrueDirObj.SetInfo
            Set ServerObj = Nothing
            Set VirtrueDirObj = Nothing
        End If
        CreateFTPDirectory = True
        Exit Function
        
    ErrFTP:
        Call WriteLog("clsServer", "CreateFTPDirectory", Err.Description)
        MsgBox "Error: " & Err.Description, vbCritical, "Create FTP Directory Error"
        Err.Clear
    End FunctionPublic Function DeleteFTPDirectory(ByVal VirtrueName As String) As Boolean
        Dim ServerObj As Object
        Dim MyVirtrueDir As Object
        
        DeleteFTPDirectory = False
        
        On Error GoTo ErrFTP
        If CheckExistIIS Then
            Set ServerObj = GetObject("IIS://LocalHost/MSFTPSVC/1/ROOT")
            For Each MyVirtrueDir In ServerObj
                If UCase(MyVirtrueDir.Class) = UCase("IIsFtpVirtualDir") Then
                    If UCase(MyVirtrueDir.Name) = UCase(Trim(VirtrueName)) Then
                        ServerObj.Delete "IIsObject", VirtrueName
                    End If
                End If
            Next
            Set ServerObj = Nothing
        End If
        DeleteFTPDirectory = True
        Exit FunctionErrFTP:
        Call WriteLog("clsServer", "DeleteFTPDirectory", Err.Description)
        MsgBox "Error: " & Err.Description, vbCritical, "Delete FTP Directory Error"
        Err.Clear
    End FunctionPrivate Function CheckExistIIS() As Boolean
        Dim SysDir As String, IISStartPath As String
        Dim FTP As Object, WWW As Object
        
        On Error GoTo CheckErr
        
        Set WWW = GetObject("IIS://LocalHost/W3SVC")
        Set FTP = GetObject("IIS://LocalHost/MSFTPSVC")
        If Not (IsObject(FTP) And IsObject(WWW)) Then
            MsgBox "Not exist the service of WEB.", vbInformation, "Information"
            CheckExistIIS = False
        Else
            SysDir = Space(127)
            GetSystemDirectory SysDir, Len(SysDir)
            SysDir = Left(SysDir, InStr(1, SysDir, Chr(0)) - 1)
            IISStartPath = SysDir & "\iisreset.exe /start"
            If Shell(IISStartPath, vbHide) = 0 Then
                CheckExistIIS = False
                MsgBox "Can not start the service."
            Else
                CheckExistIIS = True
            End If
        End If
        Set FTP = Nothing
        Set WWW = Nothing
        Exit Function
        
    CheckErr:
        Call WriteLog("clsServer", "CheckExistIIS", Err.Description)
        MsgBox Err.Description
        CheckExistIIS = False
        Err.Clear
    End Function
      

  9.   

    //我的组件使用了COM+的构造字段用来设置数据库连接,我想在自己做的组件配置向导程序中把构造字//段也一起加上,但微软好像把构造字段设成了只读,如果不是只读希望有高手能够指出用哪个方法//可以/写入,最好给个例子。这个用得多一些
    bdhh(Silent) ( ) 信誉:111  2004-12-06 23:34:00  得分: 0  
     
     
       引用COM + 1.0 Admin Type Library,然后:
        Dim cac As COMAdmin.COMAdminCatalog
        Dim caccApp As COMAdmin.COMAdminCatalogCollection
        Dim caccCOM As COMAdmin.COMAdminCatalogCollection
        Dim cacoApp As COMAdmin.COMAdminCatalogObject
        Dim cacoCOM As COMAdmin.COMAdminCatalogObject
        Dim i As Long
        
        '获取应用程序集合
        Set cac = New COMAdmin.COMAdminCatalog
        Set caccApp = cac.GetCollection("Applications")
        Set cac = Nothing
        
        '找到应用程序
        caccApp.Populate
        For i = 0 To caccApp.Count - 1
            Set cacoApp = caccApp.Item(i)
            If cacoApp.Name = "应用程序名称" Then
                Exit For
            Else
                Set cacoApp = Nothing
            End If
        Next i
        If cacoApp Is Nothing Then
            '没有找到应用程序
            '错误处理
        End If
        
        '获取组件集合
        Set caccCOM = caccApp.GetCollection("Components", cacoApp.Key)
        Set cacoApp = Nothing
        Set caccApp = Nothing
        
        '找到组件
        caccCOM.Populate
        For i = 0 To caccCOM.Count - 1
            Set cacoCOM = caccCOM.Item(i)
            If cacoCOM.Name = "组件名称" Then
                Exit For
            Else
                Set cacoCOM = Nothing
            End If
        Next i
        If cacoCOM Is Nothing Then
            '没有找到组件
            '错误处理
        End If
        
        '设置属性
        cacoCOM.Value("ConstructionEnabled") = True
        cacoCOM.Value("ConstructorString") = "构造字符串"
        Call caccCOM.SaveChanges
        Set cacoCOM = Nothing
        Set caccCOM = Nothing
      
     
      

  10.   

    http://www.vbeach.net/bbs/viewthread.php?tid=147有关COM/DCOM/COM+理论以及在VB中的应用