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
-------------------------
 

Antwort per Email an