初次写dll,不得要领。写了一个简单的类模块,生成dll,在另一个exe工程中调用,提示错误3001,变量或者数据类型不正确。但是把同样的类模块添加到这个exe中直接使用(和生成dll的工程用的同一个.cls文件),就可以顺利执行。请问问题出在哪里啊?代码片断如下:Private Sub Form_Load()
Dim rs As New ADODB.Recordset
Dim conn As New ADODB.Connection
Dim connStr As String
Dim objSite
txtInfo.Text = ""
conn.Open "driver={SQL SERVER};Server=127.0.0.1;uID=sa;pwd=welcome;database=SubjectSites;"
Set objSiteInfo = CreateObject("dllSubjectSites.SiteInfo")
'Set objSiteInfo = New SiteInfoobjSiteInfo.getSiteList rs, conn
Do While Not rs.EOF
txtInfo = txtInfo & rs.Fields("sitename") & vbCrLf
rs.MoveNext
Loop
Set objSiteInfo = Nothing
Set rs = Nothing
Set conn = Nothing
End Sub这段代码无法执行,如果换成注掉的那句set objSiteInfo=new SiteInfo就没问题了,迷惑ing
Dim rs As New ADODB.Recordset
Dim conn As New ADODB.Connection
Dim connStr As String
Dim objSite
txtInfo.Text = ""
conn.Open "driver={SQL SERVER};Server=127.0.0.1;uID=sa;pwd=welcome;database=SubjectSites;"
Set objSiteInfo = CreateObject("dllSubjectSites.SiteInfo")
'Set objSiteInfo = New SiteInfoobjSiteInfo.getSiteList rs, conn
Do While Not rs.EOF
txtInfo = txtInfo & rs.Fields("sitename") & vbCrLf
rs.MoveNext
Loop
Set objSiteInfo = Nothing
Set rs = Nothing
Set conn = Nothing
End Sub这段代码无法执行,如果换成注掉的那句set objSiteInfo=new SiteInfo就没问题了,迷惑ing
Call encryptDatabase(conn)rs.Open "select version from sitesSystemSet", conn
If Not rs.EOF Then
Version = CInt(rs.Fields("version"))
End If
rs.Closers.CursorLocation = 3
rs.Open "select * from site where status=1 order by orderId,id", conn, adOpenStatic, adLockBatchOptimistic
Do While Not rs.EOF
If Version Mod CInt(rs.Fields("siteGroupId")) <> 0 Then
rs.Delete
End If
rs.MoveNext
Loop
rs.MoveFirst'加密数据表
Call encryptDatabase(conn)End Sub
...
set objSiteInfo =createobject("dll.classname",servername)
试试,应该就可以了,objSiteInfo 先定义为超类
看有没有拼错。
另外,用CreateObject方式创建对象效率是比较低下的,比set Obj = new ClassName的方式多出一个从ProgId->CLSID的转换过程,而且失去了编译时刻类型检查的好处。你可以在调用方的工程里添加引用Dll工程,然后用new关键字来创建对象
问题虽然解决了,但是我还是不明白它的机理,迷惑ing