如何在LibreOffice中区分内置对象与用户自定义对象?
区分LibreOffice内置对象与用户自定义类对象的方法
要区分LibreOffice中的内置对象与用户类模块定义的对象,可以结合类型名称匹配、通用属性/方法检查以及错误捕获来实现。以下是完善后的IsIntrinsicObject函数及相关说明:
核心思路
- 先排除已识别的UNO对象(通过
IsUNOObject函数) - 检查对象的类型名称是否属于LibreOffice内置对象的已知列表
- 尝试调用内置对象普遍支持的属性(如
Name、Parent),若调用成功则判定为内置对象 - 结合多重检查降低误判概率
完善后的代码
Function IsIntrinsicObject(ByRef rvarObject As Variant) As Boolean Dim objTypeName As String Dim blnIsIntrinsic As Boolean ' 先获取对象的类型名称 objTypeName = TypeName(rvarObject) ' 第一步:匹配已知的内置对象类型名称 Select Case objTypeName Case "GlobalScope", "ScriptRuntime", "Dialog", "Control", _ "Form", "Frame", "Desktop", "Dispatcher" blnIsIntrinsic = True Case Else blnIsIntrinsic = False End Select ' 第二步:如果第一步未匹配,检查通用内置属性 If Not blnIsIntrinsic Then On Error Resume Next ' 尝试访问内置对象常见的属性,无错误则判定为内置对象 Dim dummy As Variant dummy = rvarObject.Name If Err.Number = 0 Then blnIsIntrinsic = True Else ' 再尝试Parent属性 Err.Clear dummy = rvarObject.Parent If Err.Number = 0 Then blnIsIntrinsic = True End If End If On Error GoTo 0 End If IsIntrinsicObject = blnIsIntrinsic End Function 'IsIntrinsicObject ' 以下是原代码中其他函数(保持不变,仅作为完整示例) Function IsUNOObject(ByRef rvarObject As Variant) As Boolean Dim varDummy As Variant On Error Goto ErrorHandler varDummy= rvarObject.Dbg_Properties varDummy = rvarObject.Dbg_Methods varDummy = rvarObject.queryInterface(0) IsUNOObject = True On Error Goto 0 Exit Function ErrorHandler: Select Case Err Case 423, 438 Resume Next Case 91, Else IsUNOObject = False End Select On Error Goto 0 End Function Function ObjectType(ByRef rvarObject As Variant) As String Dim strRet As String If IsUNOObject(rvarObject) Then strRet = "Object-UNO" Else On Error Goto ErrorHandler strRet = "Object-" & rvarObject.MyClass On Error Goto 0 End If ObjectType = strRet Exit Function ErrorHandler: On Error Goto 0 If IsIntrinsicObject(rvarObject) Then ObjectType = "Object-Intrinsic" Else ObjectType = "Object-UnknownUserClass" End If End Function Function TypeNameEx(ByRef rvarVariable As Variant) As String Dim lngType As Long Dim strRet As String lngType = VarType(rvarVariable) Select Case lngType Case 0: strRet = "Empty" Case 1: strRet = "Null" Case 2: strRet = "Integer" Case 3: strRet = "Long" Case 4: strRet = "Single" Case 5: strRet = "Double" Case 6: strRet = "Currency" Case 7: strRet = "Date" Case 8: strRet = "String" Case 9: strRet = ObjectType(rvarVariable) Case Else: strRet = "Unknown" End Select TypeNameEx = strRet End Function
说明
- 内置对象类型名称列表可以根据LibreOffice的实际对象类型进行扩展,比如添加
Spreadsheet、TextDocument等(若需覆盖更多UNO对象,可调整IsUNOObject与本函数的分工) - 通用属性检查通过错误捕获实现,多重检查可降低用户类同名属性导致的误判概率
- 对于无法识别的用户类对象,会返回
Object-UnknownUserClass,符合需求场景
内容的提问来源于stack exchange,提问作者SVCooper
相关产品推荐
相关产品推荐

