This Weekend I had some time to investigate why it was not possible with some OleObject code in Xojo to open a Libreoffice / OpenOffice document in Read Only mode. I found out, the issue is how the Boolean data type is represented as True (1) or False (0) in Xojo and the differences in VBScript. In Xojo the Boolean size is one byte and in vbscript the boolean size is 2 bytes, and True is -1 in VBScript. So the Boolean data type will never be passed on to LibreOffice Through the “Bridge Service” as it expect 2 bytes and True is -1.
To solve this issue LibreOffice / OpenOffice has what they call “The automation object” the details you can find here: ( objServiceManager.Bridge_GetValueObject() )
Below you will find an example how to represent Boolean value True:
// This code open a Libreoffice Document in Read Only Mode
Try
Dim objServiceManager As OLEObject
Dim objCoreReflection As OLEObject
Dim objDesktop As OLEObject
Dim objDocument As OLEObject
Dim Aargs() As Variant
Dim FileBP as OLEObject
objServiceManager = New OLEObject("com.sun.star.ServiceManager", True)
'Create the CoreReflection service that is later used to create structs
objCoreReflection = objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
'Create the Desktop
objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
// More info can be found here https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Bridge/Value_Objects
Dim MyBooleanTrue As Oleobject
MyBooleanTrue = objServiceManager.Bridge_GetValueObject()
MyBooleanTrue.Set("boolean", -1)
FileBP=objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
FileBP.Name = "ReadOnly" // Case Sensitive
FileBP.Value = MyBooleanTrue
Aargs.Append(FileBP)
// Make sure you already have created a test docoument in c:/temp/test.odt
objDocument= objDesktop.loadComponentFromURL("file:///c:/temp/test.odt", "_blank", 0, Aargs)
objServiceManager = nil
MyBooleanTrue = nil
Catch E as OLEException
MsgBox "open office error"
End