我有以下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运行良好。
答案 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中实际处理它们。