初次写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

解决方案 »

  1.   

    类模块中的getSitelist方法代码如下:Sub getSiteList(ByRef rs As ADODB.Recordset, ByRef conn As ADODB.Connection)'解密数据表
    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
      

  2.   

    dim objSiteInfo as Object
    ...
    set objSiteInfo =createobject("dll.classname",servername)
    试试,应该就可以了,objSiteInfo 先定义为超类
      

  3.   

    dim objsiteinfo as new object
      

  4.   

    呵呵,我也很迷惑。3001好像是一个自定义错误的说,你是不是加了什么自定义的错误处理?如果是替换了创建对象的方式的话,那么应该是createobject方法有问题,检查一下第一个参数ProgId,字符串的格式应该是"类型库名称.类名称",也就是"ActiveX Dll工程名.类名"
    看有没有拼错。
    另外,用CreateObject方式创建对象效率是比较低下的,比set Obj = new ClassName的方式多出一个从ProgId->CLSID的转换过程,而且失去了编译时刻类型检查的好处。你可以在调用方的工程里添加引用Dll工程,然后用new关键字来创建对象
      

  5.   

    我今天上午仔细调试了一下,在getSiteList方法里,调用encryptDatabase(),将conn作为参数传进去,在执行encryptDatabase的方法时候,用这个conn作为参数打开记录集的时候出现了问题。我把参数改为String类型的connStr,然后在encryptDatabase中用传入的connStr作连接字符串打开一个新的连接就没问题了。看来还是在dll中传递对象参数出了问题:P
    问题虽然解决了,但是我还是不明白它的机理,迷惑ing
      

  6.   

    经过我的实验,conn作为exe调用dll的参数传到dll里没有问题,但是在dll中再次将此connection作为参数传递就出问题了。这时候的解决 办法是取得conn.connectionstring,然后将此String作为参数再传递给这个dll中的其他方法。但是我不明白为什么...conn传一次ok,再传就不行了,望高手解答。
      

  7.   

    检查一下那个conn对象是不是被关闭了,或者被释放了
      

  8.   

    不会阿,因为同样的代码作为exe的类模块就可以,生成dll就不行了,如果是连接被关闭,在exe里应该也通不过的吧。
      

  9.   

    是不是在每次调用完之后,要SET NOTHING一次