C#COM对象标记为受限制的VBA功能或接口,或者该功能使用不支持的自动化类型

时间:2014-03-06 14:32:44

标签: c# vba com ms-word

我有以下C#COM对象:

[ComVisible(true), GuidAttribute("FD87D0EA-1D00-4189-801A-987D5F8ABD2C")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IRegistration
{
    string RegisterForm(string server, string database, string username, string password, string catalogId, string date, string AxyaContextFile);
    void RegisterFormAcknowledge(string server, string database, string username, string password, long formId, bool isPrinted, string message);
}

当我从Word 200调用RegisterFormAcknowledge方法时,我得到以下编译异常: 标记为受限制的功能或界面或该功能使用不支持的自动化类型

这是Word宏代码

    Set printer = New MyCOMObject.Registration
    printer.RegisterFormAcknowledge "test", "test", "test", "test", 12345, False, "CatalogWordTemplate Not Found"

有谁知道为什么? VB6不支持长类型? 第一种方法RegisterForm运行良好。

2 个答案:

答案 0 :(得分:4)

  [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

这是一个错误,VB6和VBA需要一个调度接口。 Boilerplate是使用ComInterfaceType.InterfaceIsAutoDual,以便客户端代码可以使用早期绑定和后期绑定。您几乎肯定需要修复实现此接口的类的[ClassInterface]属性,因为您实际上可以进行调用,使用ClassInterfaceType.None

使用 long 作为参数类型不会飞,它不是VB6支持的类型。 VB1以16位工具开始,因此Integer为16位,Long为32位。没有64位积分的类型。如果打算使用VB6 Long,请使用 int 。如果没有,那么你需要考虑Double,最多15位数,或String。

答案 1 :(得分:2)

C#的long是带符号的 64位整数,不是automation-compatible。另一方面,C#的int是一个带符号的 32位整数,它与自动化兼容。

您询问了大整数,例如372036854775807。

这一个特别需要49位来表示。 C#的double是标准double float,它可以表示最多需要53位的整数。

还有C#的decimal,它映射到例如VBA的Decimal(在VARIANT内)。如果您愿意,您可以将其编组为例如VBA的Currency,一个带符号的64位整数,在参数定义之前具有[MarshalAs(UnmanagedType.Currency)]属性。

对于较大的值,使用string可能会更好。也就是说,如果你能在VBA中实际处理它们。