Page 1 of 1
COMatePLUS and Outlook
Posted: Fri Aug 26, 2011 12:38 pm
by schneider_ms
I want to read some appointments from outlook using the COMatePlus api.
In VB the following code works:
Code: Select all
Set myOlApp = CreateObject("Outlook.Application")
Set olNameSpace = myOlApp.GetNamespace("MAPI")
Set myAppointments = olNameSpace.GetDefaultFolder(olFolderCalendar).Items
Find$ = "[Start] >= '" & tdystart & "'"
Set currentAppointment = myAppointments.Find(Find$)
In PureBasic I tried:
Code: Select all
OutlookObject = COMate_CreateObject("Outlook.Application")
str_kommando$ = "GetNamespace(" + Chr(39) + "MAPI" + Chr(39) + ")"
ns = OutlookObject\GetObjectProperty(str_kommando$)
myfolder = ns\GetObjectProperty ("GetDefaultFolder(9)") ; olFolderCalendar
If Not myfolder
MessageRequester("Error", COMate_GetLastErrorDescription())
EndIf
items = myfolder\getObjectProperty("Items")
If Not items
MessageRequester("Error Automation Outlook", COMate_GetLastErrorDescription())
EndIf
DateToCheck$ = "Find([Start] >= '08/26/2011' AS DATE)"
item = items\GetObjectProperty(DateToCheck$)
If Not item
Debug COMate_GetLastErrorDescription()
EndIf
Debug item\getStringProperty("Subject")
The debug window show the following error:
"One or more arguments are invalid. Possibly a numerical overflow or too many nested objects, -if so, try splitting your method call into two or more subcalls."
What can I do?
best regards
Markus
Re: COMatePLUS and Outlook
Posted: Fri Aug 26, 2011 6:36 pm
by spikey
The start property needs to be expressed as a string value not a date object. See
http://msdn.microsoft.com/en-us/library/ff869662.aspx
Having said that I
still can't get the Find method to work even using the correct syntax!
Re: COMatePLUS and Outlook
Posted: Fri Aug 26, 2011 6:51 pm
by schneider_ms
That is also my problem. No matter what I try it doesn't work.
I think the problem is that I have to pass a function call to comate.
In vb you can call
obj.find "[start] = ..."
Or
obj.restrict "[start] = ..."
How can I do this with comate?
Obj = Obj\getobjectproperty ("restrict " + find$ )
Does comate know that this should be a function call?
Re: COMatePLUS and Outlook
Posted: Fri Aug 26, 2011 9:05 pm
by IdeasVacuum
Re: COMatePLUS and Outlook
Posted: Sat Aug 27, 2011 6:25 am
by schneider_ms
There are some hints I followed but without success.
It is not a problem of invoke or setProperty or getProperty,
it is a problem of creating the command string:
Code: Select all
find$ = "Restrict(Start = '26/8/2011')"
str_kommando = find$
hStatement = COMate_PrepareStatement(str_kommando)
If hStatement = 0
MessageRequester("COMatePLUS!", "Couldn't create the statement!" + #CRLF$ + #CRLF$ + "COMatePLUS error : " + COMate_GetLastErrorDescription())
EndIf
Why doesnt this work?
Re: COMatePLUS and Outlook
Posted: Sat Aug 27, 2011 9:53 am
by srod
No COMatePLUS will not like that statement in any kind of form!
I don't know anything about Outlook, but my guess would be that you might need to use an enumeration object to do what you are after.
Re: COMatePLUS and Outlook
Posted: Sat Aug 27, 2011 11:36 am
by schneider_ms
srod wrote:No COMatePLUS will not like that statement in any kind of form!
I don't know anything about Outlook, but my guess would be that you might need to use an enumeration object to do what you are after.
I don't understand how enumeration would help me with my problem. I need to find all appointments from outlook for a specific day.
I can find all appointments but if I find an appointment witch is recurrent than I have to do a complicate calculation if it belongs to the specific day.
To solve this, outlook vb provides the functions restrict and find. But I don't know how to bring these functions in comateplus.
Re: COMatePLUS and Outlook
Posted: Sat Aug 27, 2011 1:21 pm
by spikey
@srod
Yes I've been playing with an enumeration but I'm having the same trouble with that too, which is why I haven't posted anything more detailed yet.
I think the problem is that there is a two tier enumeration kicking around. According to the documentation the Find method applies to a collection object and returns a collection. However I can't seem to apply the CreateEnumeration method to a previously obtained enumeration, but you don't appear to be able to use the GetObjectProperty result object either...
This is what I've got to so far - but both approaches fail, and I haven't come up with any good alternatives so far either - because of the issue with recurring appointments that Markus identifies...
Code: Select all
IncludePath "C:\Documents and Settings\david\My Documents\Development Projects\PureBasic Projects\Common\"
IncludeFile "COMatePLUS.pbi"
EnableExplicit
Define Outlook.COMateObject, NameSpace.COMateObject, Calendar.COMateObject, Item.COMateObject
; Define AllItems.COMateEnumObject
Define AllItems.COMateObject
Define FindItems.COMateEnumObject
Define Command.S
CallDebugger
Outlook = COMate_CreateObject("Outlook.Application")
If Not Outlook
Debug "Outlook:"
Debug COMate_GetLastErrorDescription()
EndIf
Command = "GetNamespace(" + Chr(39) + "MAPI" + Chr(39) + ")"
NameSpace = Outlook\GetObjectProperty(Command)
If Not NameSpace
Debug "NameSpace:"
Debug COMate_GetLastErrorDescription()
EndIf
Calendar = NameSpace\GetObjectProperty ("GetDefaultFolder(9)") ; olFolderCalendar
If Not Calendar
Debug "Calendar:"
Debug COMate_GetLastErrorDescription()
EndIf
;AllItems = Calendar\CreateEnumeration("Items")
AllItems = Calendar\GetObjectProperty("Items")
If Not AllItems
Debug "AllItems:"
Debug COMate_GetLastErrorDescription()
EndIf
Command = "Find(" + Chr(34) + "[Start] >= '01/01/2011'" + Chr(34) + ")"
FindItems = AllItems\CreateEnumeration(Command)
If FindItems
Repeat
Item = FindItems\GetNextObject()
If Item
Debug Item\GetStringProperty("Subject")
EndIf
Until Not(Item)
Else
Debug "FindItems:"
Debug COMate_GetLastErrorDescription()
EndIf
; Tidy up.
If Item
Item\Release()
EndIf
If FindItems
FindItems\Release()
EndIf
If AllItems
AllItems\Release()
EndIf
If Calendar
Calendar\Release()
EndIf
If NameSpace
NameSpace\Release()
EndIf
If Outlook
Outlook\Release()
EndIf
Re: COMatePLUS and Outlook
Posted: Sat Aug 27, 2011 1:31 pm
by spikey
@srod:
Another question occurs to me. In this repeat loop, should I call Item\Release() at the end of the iteration before the next call to FindItems\GetNextObject()? In a real world scenario the Items collection is likely to have a lot of member objects and an enormous memory leak could ensue if not handled properly...
Code: Select all
Repeat
Item = FindItems\GetNextObject()
If Item
Debug Item\GetStringProperty("Subject")
EndIf
Until Not(Item)
Re: COMatePLUS and Outlook
Posted: Sun Aug 28, 2011 8:50 am
by schneider_ms
the problem is still there.
1) reading appointments from outlook in Purebasic seams possible but there is no way to use the find or restrict methods from outlook.
2) reading all appointments in purebasic and calculating the recurrent appointments is very very complicate.
solutions
1) use .net instead of Purebasic?
2) is there another mechanism that gives me all appointments of the current day?
3) use a google account and the api of google?
4) use a vb makro to retrieve the information and some new way to copy this information to purebasic?
has someone an idea that is realy working?
Re: COMatePLUS and Outlook
Posted: Sun Aug 28, 2011 9:17 pm
by schneider_ms
I found a library ScriptControl.
With this lib it should be possible to write some VB Code and run it in PureBasic.
Unfortunately the library produces the error:
purelibrary "StringExtension" is missing.
Where can I find this library? Or is there a newer version of
ScriptControl that works with PB 4.5?
regards
Markus
Re: COMatePLUS and Outlook
Posted: Sun Aug 28, 2011 9:31 pm
by IdeasVacuum
Re: COMatePLUS and Outlook
Posted: Mon Aug 29, 2011 10:30 am
by schneider_ms
I know the userlib that makes the problem. It is ScriptControl from Thomas Schulz. But if there is no new version of this userlib - how else can I use vb scripts in PB?
Re: COMatePLUS and Outlook
Posted: Mon Aug 29, 2011 11:02 am
by Kiffi
schneider_ms wrote:how else can I use vb scripts in PB?
that's quite simple. Here is an example-code:
Code: Select all
IncludePath #PB_Compiler_Home + "\srod\comateplus\" ; adjust to your comate-path!
XIncludeFile "comateplus.pbi"
IncludePath ""
Define ScriptControl.COMateObject
Define VBS.s
ScriptControl = COMate_CreateObject("ScriptControl")
ScriptControl\SetProperty("Language = 'VBScript'")
VBS = PeekS(?VBS)
VBS = ReplaceString(VBS, "'", "$0027")
ScriptControl\Invoke("AddCode('" + VBS + "')")
MessageRequester("", ScriptControl\GetStringProperty("Eval('IPAddress')"))
ScriptControl\Release()
DataSection
VBS:
IncludeBinary "test.vbs"
Data.b 0
EndDataSection
and here is an example vbs (just save as 'test.vbs'):
Code: Select all
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set IPConfigSet = objWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration")
For Each IPConfig in IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
For i=LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress)
IPAddress = IPAddress & IPConfig.IPAddress(i) & vbCrLf
Next
End If
Next
Greetings ... Kiffi
Re: COMatePLUS and Outlook
Posted: Mon Aug 29, 2011 11:59 am
by schneider_ms
That's great. This is the best solution and it works.
Thank you very much.