VBA使用的VBE7.dll类型库,其Conversion
模块具有以下MIDL:
[
dllname("VBE7.DLL"),
uuid(36785f40-2bcc-1069-82d6-00dd010edfaa),
helpcontext(0x000f6ebe)
]
module Conversion {
[helpcontext(0x000f6ea2)]
BSTR _stdcall _B_str_Hex([in] VARIANT* Number);
[helpcontext(0x000f652a)]
VARIANT _stdcall _B_var_Hex([in] VARIANT* Number);
[helpcontext(0x000f6ea4)]
BSTR _stdcall _B_str_Oct([in] VARIANT* Number);
[helpcontext(0x000f6557)]
VARIANT _stdcall _B_var_Oct([in] VARIANT* Number);
[hidden, helpcontext(0x000f6859)]
long _stdcall MacID([in] BSTR Constant);
[helpcontext(0x000f6ea9)]
BSTR _stdcall _B_str_Str([in] VARIANT* Number);
[helpcontext(0x000f658a)]
VARIANT _stdcall _B_var_Str([in] VARIANT* Number);
[helpcontext(0x000f659f)]
double _stdcall Val([in] BSTR String);
[helpcontext(0x000f64c8)]
BSTR _stdcall CStr([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
BYTE _stdcall CByte([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
VARIANT_BOOL _stdcall CBool([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
CY _stdcall CCur([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
DATE _stdcall CDate([in] VARIANT* Expression);
[helpcontext(0x000f6e7a)]
VARIANT _stdcall CVDate([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
short _stdcall CInt([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
long _stdcall CLng([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
int64 _stdcall CLngLng([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
LONG_PTR#i _stdcall CLngPtr([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
float _stdcall CSng([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
double _stdcall CDbl([in] VARIANT* Expression);
[helpcontext(0x000f64c8)]
VARIANT _stdcall CVar([in] VARIANT* Expression);
[helpcontext(0x000f64b5)]
VARIANT _stdcall CVErr([in] VARIANT* Expression);
[helpcontext(0x000f6c6d)]
BSTR _stdcall _B_str_Error([in, optional] VARIANT* ErrorNumber);
[helpcontext(0x000f6c6d)]
VARIANT _stdcall _B_var_Error([in, optional] VARIANT* ErrorNumber);
[helpcontext(0x000f649b)]
VARIANT _stdcall Fix([in] VARIANT* Number);
[helpcontext(0x000f6533)]
VARIANT _stdcall Int([in] VARIANT* Number);
[helpcontext(0x000f64c8)]
HRESULT _stdcall CDec(
[in] VARIANT* Expression,
[out, retval] VARIANT* pvar
);
};
我特别感兴趣的是VBA如何解释返回CDec
函数(MIDL中最后一个函数)的HRESULT
,从而使得在VBA内部,CDec
函数具有下列签名:
Function CDec(Expression)
似乎VBA正在隐藏返回HRESULT的TLB定义,为了测试这个理论,我想创建自己的TLB,在一个模块中定义一个返回HRESULT的函数,然后看看VBA如何处理该函数。
我不认为C#或VB.NET可以做到这一点,在VB6中尝试在标准模块中定义函数时,该模块在dll中不可见。
使用C++是否可能实现这一点?我需要创建哪种类型的项目?有什么特别之处需要注意吗?我需要手动编辑MIDL吗?
注意:我特意没有将此问题标记为VBA,因为我正在尝试从C#解释TLB。为了测试VBA主机如何解释TLB,我想在支持它的任何语言中创建一个合适的TLB。我可以使用Visual Studio 6、2003、2013和2015。
CDec
函数,或者它是否以相同方式处理所有类似定义的函数。 - ThunderFrameCDec "123"
(无返回值分配)是有效的,而Fix "123"
则无法编译 - 奇怪!此外,Fix
可能会在无效输入时引发错误,尽管没有HRESULT在视线中。此外,VARIANT
是一个巨大的结构体,用于返回值,因此C/C++编译器会隐式地为其创建输出参数,该参数位于参数列表中的第一位。 - wqw