Run document macros via API if Desktop is hidden

Creating a macro - Writing a Script - Using the API (OpenOffice Basic, Python, BeanShell, JavaScript)
Post Reply
Zubr
Posts: 1
Joined: Thu Jul 01, 2010 1:24 pm

Run document macros via API if Desktop is hidden

Post by Zubr »

I would like to run macro (written with star basic) via API. Macros is stored in document. API is called from IBM Lotus Notes lotus script.
The problem is that operation is performed in backgorund (document must not be visible), but ExecuteDispatch does not work in that case (there is no any changes in test2.ods). As for GetScriptProvider().getScript(ScriptURI$), it returns an error “Instance member GETSCRIPT does not exist”.

Please, give me a clue how to run macro from document.

1.ExecuteDispatch, document is visible

Code: Select all

	Set OOServiceManager = CreateObject("com.sun.star.ServiceManager")
	Set OODispatcher = OOServiceManager.CreateInstance("com.sun.star.frame.DispatchHelper")
	Set OODesktop = OOServiceManager.CreateInstance("com.sun.star.frame.Desktop")

	MacroName$ = {standard.module1.test}

	ReDim args(1)
	Set PropertyValue = OOServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
	PropertyValue.Name = "MacroExecutionMode"
	PropertyValue.Value = 4
	Set args(0) = PropertyValue
	PropertyValue.Name = "Hidden"
	PropertyValue.Value = False
	Set args(1) = PropertyValue
	
	Set OOSpreadSheet = OODesktop.loadComponentFromURL("file:///d:\test.ods", "_default", 0, args)

	ReDim args(0)
	Set PropertyValue = OOServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
	PropertyValue.Name = ""
	PropertyValue.Value = ""
	Set args(0) = PropertyValue 
	Call OODispatcher.ExecuteDispatch(OOSpreadSheet.CurrentController.Frame, "macro://./" & MacroName, "", 0, args)
	
	ReDim args(0)
	PropertyValue.Name = "Overwrite"
	PropertyValue.Value = True
	Set args(0) = PropertyValue
	
	Call OOSpreadSheet.StoreToURL("file:///d:/test2.ods", args())
	Call OOSpreadSheet.Close(False)
2.ExecuteDispatch, document is not visible.
The code is almost the same. Changes in property value

Code: Select all

	ReDim args(1)
	Set PropertyValue = OOServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
	PropertyValue.Name = "MacroExecutionMode"
	PropertyValue.Value = 4
	Set args(0) = PropertyValue
	PropertyValue.Name = "Hidden"
	[b]PropertyValue.Value = True[/b]
	Set args(1) = PropertyValue

3.GetScriptProvider().getScript(ScriptURI$)

Code: Select all

	Set OOScriptProvider= OOSpreadSheet.GetScriptProvider()
	Set OOScript = OOScriptProvider.getScript("")
	Call OOScript.invoke(aa, aa, aa)
Document – it is default Calc document. Macros was created with Tools – Macros – Macros... Selecet Untitled – Standard – New. Name is “Module1”.

Code: Select all

Sub test
ThisComponent.Sheets.GetByIndex(0).getCellByPosition(2, 2).SetString("OK1")
End Sub
OpenOffice 3.2.0 on Windows XP SP3
User avatar
Charlie Young
Volunteer
Posts: 1559
Joined: Fri May 14, 2010 1:07 am

Re: Run document macros via API if Desktop is hidden

Post by Charlie Young »

I haven't found a way to run the macro in a hidden component, and this workaround may not be acceptable because the document will be (very) briefly visible. But I find that if the documents containerWindow is made invisible, the macro still runs, and the component is hidden while that is happening. With this in mind, your code would look something like

Code: Select all

       Dim contWindow As Object

       .....

       Set OOServiceManager = CreateObject("com.sun.star.ServiceManager")
       Set OODispatcher = OOServiceManager.CreateInstance("com.sun.star.frame.DispatchHelper")
       Set OODesktop = OOServiceManager.CreateInstance("com.sun.star.frame.Desktop")

       MacroName$ = {standard.module1.test}

       ReDim args(1)
       Set PropertyValue = OOServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
       PropertyValue.Name = "MacroExecutionMode"
       PropertyValue.Value = 4
       Set args(0) = PropertyValue
       'Component NOT hidden
       
       Set OOSpreadSheet = OODesktop.loadComponentFromURL("file:///d:\test.ods", "_default", 0, args)

       contWindow= OOSpreadSheet.CurrentController.Frame.getContainerWindow()
       contWindow.setVisible(False)
       ReDim args(0)
       Set PropertyValue = OOServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
       PropertyValue.Name = ""
       PropertyValue.Value = ""
       Set args(0) = PropertyValue
       Call OODispatcher.ExecuteDispatch(OOSpreadSheet.CurrentController.Frame, "macro://./" & MacroName, "", 0, args)
       
       ReDim args(0)
       PropertyValue.Name = "Overwrite"
       PropertyValue.Value = True
       Set args(0) = PropertyValue
       
       Call OOSpreadSheet.StoreToURL("file:///d:/test2.ods", args())
       Call OOSpreadSheet.Close(False)
Apache OpenOffice 4.1.1
Windows XP
hanya
Volunteer
Posts: 885
Joined: Fri Nov 23, 2007 9:27 am
Location: Japan

Re: Run document macros via API if Desktop is hidden

Post by hanya »

As for GetScriptProvider().getScript(ScriptURI$), it returns an error “Instance member GETSCRIPT does not exist”.
I can call it through introspected object in VB Script but I don't know it works in Lotus script:

Code: Select all

Set scriptProvider = doc.getScriptProvider()

Set introspection = mcf.createInstance("com.sun.star.beans.Introspection")
Set inspected = introspection.inspect(scriptProvider)
Set m = inspected.getMethod("getScript", -1)
Set s = m.invoke(scriptProvider, array("vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document"))

Call s.invoke(array(), array(), array())
Please, edit this thread's initial post and add "[Solved]" to the subject line if your problem has been solved.
Apache OpenOffice 4-dev on Xubuntu 14.04
Post Reply