2011-03-28 51 views
0

我发现了很多其他引用此错误使用谷歌,但我有麻烦弄明白它们如何适用于我在做什么。错误使用对象数组.NET COM互操作DLL

这里的VBA错误我在编译时得到:“函数或接口标记为受限制,或该函数使用Visual Basic中不支持自动化类型。”导致错误

VBA代码:

'ftp is also a com object created in code not posted here 
Dim f() As wooxter.FTPFile 
f = ftp.GetFileList 'Returns an object array of type FTPFile 
Dim i As Integer 
For i = 1 To (UBound(f) - 1) 
    If fFileExists(stg.LocalPicDir & "\" & f(i).FileName) = True Then 
     If fGetFileSize(stg.LocalPicDir & "\" & f(i).FileName) = f(i).FileSize Then 
     'Error occurs on the above line at compile time 
      'The error occurs specifically on f(i).FileSize, but not on f(i).FileName 
      'fGetFileSize returns a VBA Long. f(i).FileSize is a VB.NET Long 
    End If 
    End If 
Next 

这里是我的相关.NET代码:

Public Interface IFTPFile 
    ReadOnly Property FileSize() As Long 
    ReadOnly Property FileName() As String 
End Interface 

<ClassInterface(ClassInterfaceType.None)> _ 
Public Class FTPFile : Implements IFTPFile 
    Private sFileName As String = "" 
    Private lFileSize As Long 

    Public Sub New(ByVal FName As String, ByVal FSize As Long) 
     sFileName = FName 
     lFileSize = FSize 
    End Sub 
End Class 

'Fragment of a different class 
Public Function GetFileList() As FTPFile() Implements IFTP.GetFileList 
    Dim ftpfiles() As EnterpriseDT.Net.Ftp.FTPFile 
    ftpfiles = fCon.GetFileInfos 
    Dim result(ftpfiles.Length - 1) As FTPFile 
    For i As Integer = 0 To ftpfiles.Length - 1 
     result(i) = New FTPFile(ftpfiles(i).Name, ftpfiles(i).Size) 
    Next 
    Return result 
End Function 

回答

1

COM有没有构造函数的概念。或者更重要的是,带参数的构造函数。如果你为你的类声明了任何构造函数,那么它必须包含一个无参数的构造函数。客户端代码将始终使用的那个。您需要创建FileName和FileSize属性。

接下来的问题是,VBA不具有64位的积分数据类型。将FileSize属性从Long更改为,例如Integer或Double。避免Single,它没有足够的有效数字来准确存储文件大小。它不能存储16777217.

+0

尽可能靠近我可以告诉我的VBA代码应该永远不会触发类的构造函数。此外,我改变了我的代码,所以它不使用任何东西,只是一个空的构造函数,我仍然在同一个地方得到相同的错误信息。 – HK1 2011-03-28 18:39:13

+0

还有一个问题,VBA没有原生的64位整数类型。检查将FileSize重新定义为整数或双精度时会发生什么。 – 2011-03-28 18:45:10

+0

您对数据类型的评论是对问题的回答。事实上,我正如上面列出的那样使用构造函数,因为我在VBA中的代码永远不会初始化构造函数。唯一的区别是我已经将FileSize更改为Single。谨慎编辑你的答案?我并不是说你目前的答案是错误的信息,只是它不是我遇到的问题的答案。 – HK1 2011-03-28 19:00:22