积极答复者
VB6 ActiveX EXE与ADO Connection问题

问题
-
建了一个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方法执行语句
这是为什么呢?
答案
-
这要从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 分别由两个工程饮用它
全部回复
-
这要从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 分别由两个工程饮用它