Hallo,
nach meinem Erfolg mit der Verwendung von Shared Libs für AppleEvents
nun wieder ein Rückschlag. Wie um alles in der Welt übergibt man ein
variadic, also ein Array mit variabler Länge welches im C-Code den
Typ "va_list" hat ?
Ich habe alles möglich versucht, als einfache Liste als Liste mit
Zeigern, ohne Erfolg. Dann habe ich stundenlang gegooglet um
herauszubekommen wie das ABI für einen solchen Datentyp ist,
ebenfalls ohne Erfolg. Die VA-Geschichten sind mit Makros realisiert
und auch wenn mir das Prinzip klar ist, habe ich es dennoch nicht
geschafft in RB einen MemomryBlock zu generieren den ein mit Declare
definierter Aufruf als va_list akzeptiert.
Ich habe jetzt so viel gelesen und gesehen und probiert das ich
völlig wirr im Kopf bin *-7
Bitte kann mir jemand mit Erfahrung/Ahnung helfen ?!
Mit freundlichen Grüssen,
Oliver Geisen
_____________________________
Systemadministrator
Kreisboten Verlag Mühlfellner KG
82362 Weilheim i. Ob.
Tel. 0881/686-904
Fax 0881/686-74
Hier etwas Code zum experimentieren:
-------------------------
Declare Function AEBuildAppleEvent Lib "CarbonLib" (theClass as
OSType, theID as OSType, addressType as OSType, addressData as Ptr,
addressLength as Integer, returnID as Integer, transactionID as
Integer, result as Ptr, error as Ptr, paramsFmt as CString, theArgs
as Ptr) as Integer
Declare Function AESend Lib "CarbonLib" (theAppleEvent as Ptr,
reply as Ptr, sendMode as Integer, sendPriority as Integer,
timeOutInTicks as Integer, idleProc as Ptr, filterProc as Ptr) as
Integer
Dim OSErr as Integer
Dim applSign as String
Dim aevent as MemoryBlock
Dim paramsFmt as String
Dim theArgs as MemoryBlock
Dim reply as MemoryBlock
paramsFmt = "'----':[TEXT(@), TEXT(@)]"
theArgs = NewMemoryBlock(256)
theArgs.CString(0) = "Dok1"
theArgs.CString(5) = "Dok2"
// build event from paramsFmt/argsBlock
applSign = "XPR3"
aevent = NewMemoryBlock(4)
OSErr = AEBuildAppleEvent("aevt", "odoc", "sign", applSign, 4, -1,
0, aevent, nil, paramsFmt, theArgs)
if (OSErr <> 0) then
MsgBox "Error " + Str(OSErr)
end if
// send event (wait for reply)
reply = NewMemoryBlock(4)
OSErr = AESend(aevent, reply, 3, 0, -1, nil, nil)
if (OSErr <> 0) then
MsgBox "Error " + Str(OSErr)
Return
end if
-------------------------