none
VB6 ActiveX EXE与ADO Connection问题 RRS feed

  • 问题

  •  

    建了一个ActiveX EXE来监控SQL中某个表的变化,引用ADO,类中有一个ActiveConnection属性用于获取应用程序传递来的Connection,然后在get_data方法中用ADO Command对象执行存储过程,问题就在,给类的ActiveConnection对象赋值时没问题,但在get_data中,把这个ActiveConnection赋值给执行存储过程的Command.ActiveConnection总是出错,传递过来的Connection对象是没问题的,然后我把这个ActiveX Exe修改一下成ActiveX DLL,执行起来却没问题,怎么回事?
    下面是ActiveX EXE类中简化的代码(换成ActiveX DLL就没问题了)

     


    Option Explicit
    Private CONN As New ADODB.Connection
    Public Property Get ActiveConnection() As ADODB.Connection
       
    Set ActiveConnection = CONN
    End Property
    Public Property Set ActiveConnection(vCONN As ADODB.Connection)
       
    Set CONN = vCONN
    End Property
    Public Sub getData()
       
    Dim TEMPCMD As New ADODB.Command
       
    On Error GoTo ErrorHand
       
    With TEMPCMD
            Set .ActiveConnection = CONN   '调试到这行出错
            MsgBox "设置连接成功"
            .CommandType
    = 4
            .CommandText
    = "test"
            .Execute
       
    End With
       
    Exit Sub
    ErrorHand:
        MsgBox Err.Number, Err.Description
    End Sub

    不能给Recordset与Command对象的Connection属性赋值,提示类型不匹配或其他错误.

    但是可以用Connection对象的Execute方法执行语句

    这是为什么呢?

    2008年12月27日 4:14

答案

  •  

    这要从activex exe 和activex dll 的本质不同讲起

     

    我们首先知道  activex dll是一个类库    最典型的是 ado  msxml  等等

    这些类库是功能相对单一的库   作为程序进程的一部分  在主exe运行的时候  就加载在主程序中的.

    被称为进程内组件

     

    但是activex exe不太一样  它是在调用组件的时候  创建一个新进程  主程序调用接口,然后由进程外的服务进程处理后传回来数据。

    所以这种方式叫做进程外组件  又叫做ole 自动化服务器

    这是一种功能非常大的程序常用的方式  比如word  excel 等  我们可能只需要我们的进程有他们一小部分功能  开启了一小部分接口的引用  但是在这个主进程外的引用进程中  可能整套的office都在协同工作。

     

    你现在的问题就出在 

    你尝试进程间传递一个ado connection

    这是一个带有连接状态的敏感对象

    这在activex exe进程间传递是非常危险且消耗巨大 而被禁止的。 

    但是在activex dll  传递 是在同一个进程中就绝对没问题。

     

    所以 建议传递 CONNECTION STRING的值类型 而不是一个具有状态的对象

     

     

    或者  把主程序的  和activex exe的公用逻辑部分 做成一公共的 activex dll  分别由两个工程饮用它

     

     

    2008年12月27日 5:57

全部回复

  •  

    这要从activex exe 和activex dll 的本质不同讲起

     

    我们首先知道  activex dll是一个类库    最典型的是 ado  msxml  等等

    这些类库是功能相对单一的库   作为程序进程的一部分  在主exe运行的时候  就加载在主程序中的.

    被称为进程内组件

     

    但是activex exe不太一样  它是在调用组件的时候  创建一个新进程  主程序调用接口,然后由进程外的服务进程处理后传回来数据。

    所以这种方式叫做进程外组件  又叫做ole 自动化服务器

    这是一种功能非常大的程序常用的方式  比如word  excel 等  我们可能只需要我们的进程有他们一小部分功能  开启了一小部分接口的引用  但是在这个主进程外的引用进程中  可能整套的office都在协同工作。

     

    你现在的问题就出在 

    你尝试进程间传递一个ado connection

    这是一个带有连接状态的敏感对象

    这在activex exe进程间传递是非常危险且消耗巨大 而被禁止的。 

    但是在activex dll  传递 是在同一个进程中就绝对没问题。

     

    所以 建议传递 CONNECTION STRING的值类型 而不是一个具有状态的对象

     

     

    或者  把主程序的  和activex exe的公用逻辑部分 做成一公共的 activex dll  分别由两个工程饮用它

     

     

    2008年12月27日 5:57
  • 非常感谢韦恩卑鄙的回答.

    在经过多次调试之后我就是采用的传递ConnectionString,只是一直不明白为什么为什么其他对象可以垮进程传递而Connection对象不可以,现在明白了,非常感谢!

    2008年12月27日 6:38