Seite 1 von 1

Ergebnis aus AppleScript

Verfasst: 05.12.2019 12:21
von IB-Software
Um AppleScript im Programm auszuführen nutze ich die Procedure

Code: Alles auswählen

Procedure.s AppleScript(Script.s)
    Protected retVal.s, strVal, numItems, i
    Protected aScript = CocoaMessage(0, CocoaMessage(0, CocoaMessage(0, 0, "NSAppleScript alloc"), "initWithSource:$", @Script), "autorelease")
    Protected eventDesc = CocoaMessage(0, aScript, "executeAndReturnError:", #nil)
    If eventDesc
      numItems = CocoaMessage(0, eventDesc, "numberOfItems")
      If numItems
        For i = 1 To numItems
          strVal = CocoaMessage(0, CocoaMessage(0, eventDesc, "descriptorAtIndex:", i), "stringValue")
          If strVal
            retVal + PeekS(CocoaMessage(0, strVal, "UTF8String"), -1, #PB_UTF8)
            If i <> numItems : retVal + #LF$ : EndIf
          EndIf
        Next
      Else
        strVal = CocoaMessage(0, eventDesc, "stringValue")
        If strVal : retVal = PeekS(CocoaMessage(0, strVal, "UTF8String"), -1, #PB_UTF8) : EndIf
      EndIf
    EndIf
    ProcedureReturn retVal 
  EndProcedure
aus dem englischen Forum.
Funktioniert wunderbar.

Wie bekomme ich jedoch das Ergebnis (Rückmeldung) aus dem AppleScript in eine Variable?

Danke im Voraus.

Ingo

Re: Ergebnis aus AppleScript

Verfasst: 05.12.2019 18:55
von ccode_new
Hallo IB-Software,

deine Frage ist leicht beantwortet.

So wie bei einer Prozedure mit Rückgabewert üblich.
Bei der Procedure AppleScript wurde hier der Rückgabewert als PureBasic-String-Typ gewählt.

Also z.B. so:

Code: Alles auswählen

Procedure.s AppleScript(Script.s)
  Protected retVal.s, strVal, numItems, i
  Protected aScript = CocoaMessage(0, CocoaMessage(0, CocoaMessage(0, 0, "NSAppleScript alloc"), "initWithSource:$", @Script), "autorelease")
  Protected eventDesc = CocoaMessage(0, aScript, "executeAndReturnError:", #nil)
  If eventDesc
    numItems = CocoaMessage(0, eventDesc, "numberOfItems")
    If numItems
      For i = 1 To numItems
        strVal = CocoaMessage(0, CocoaMessage(0, eventDesc, "descriptorAtIndex:", i), "stringValue")
        If strVal
          retVal + PeekS(CocoaMessage(0, strVal, "UTF8String"), -1, #PB_UTF8)
          If i <> numItems : retVal + #LF$ : EndIf
        EndIf
      Next
    Else
      strVal = CocoaMessage(0, eventDesc, "stringValue")
      If strVal : retVal = PeekS(CocoaMessage(0, strVal, "UTF8String"), -1, #PB_UTF8) : EndIf
    EndIf
  EndIf
  ProcedureReturn retVal
EndProcedure

ok.s = AppleScript(~"set lalala to computer name of (system info)")
Debug ok


Re: Ergebnis aus AppleScript

Verfasst: 06.12.2019 00:36
von IB-Software
Hallo ccode_new,

erst einmal vielen Dank. Meine Frage war offensichtlich von mir seltsam formuliert, denn natürlich wusste ich wie man den Rückgabewert einer Prozedur einer Variable übergibt. :wink:

Dass bei mir kein Wert zurückgegeben wurde, lag an meinem Script, das mit Start aus der IDE nicht ausgeführt wurde.
Erst innerhalb der als separat ausführbaren kompilierten App funktioniert es.
Das herauszufinden hat ganz schön gedauert und war erst durch Dein einfaches Scriptbeispiel für mich möglich. :allright:

Ingo

Re: Ergebnis aus AppleScript

Verfasst: 06.12.2019 22:20
von ccode_new
Hallo IB-Software,

du kannst auch AppleScript direkt über PureBasic (auch mit Debugger) ausführen.

Dafür musst du aber PureBasic mehr Rechte geben.

Systemeinstellungen -> Sicherheit -> Datenschutz

Anbei:
Auch bei meinen aktuellen Thema "Bluetooth" muss man sehr stark mit den Sicherheitsframework eines MACs kämpfen.
(Da ist Linux (je nach Distribution) in den Standardeinstellungen teilweise ganz friedlich)

Beim Thema-Bluetooth (Mac):
->Achtung: Firewall per Standard ein und alle eingehenden Dateien werden blockiert.
->Achtung: Die zu verbindenden Bluetoothgeräte müssen sich erst einmal immer gegenseitig authentifizieren. (PIN)
(EIne permanente TRUSTED - Einstellung (wie unter LInux) ist mir noch nicht bekannt.
->Eine Bluetooth-Dateifreigabe muss erteilt sein. (Standardmäßig ist dies nicht der Fall.)
(für OBEX)
->etc.

Re: Ergebnis aus AppleScript

Verfasst: 07.12.2019 16:54
von IB-Software
du kannst auch AppleScript direkt über PureBasic (auch mit Debugger) ausführen.
Dafür musst du aber PureBasic mehr Rechte geben.
Systemeinstellungen -> Sicherheit -> Datenschutz
Danke für den Hinweis, hatte ich schon getan.
Das Problem bei mir ist, dass ich die Bibliothek "System Events" nutze und dafür will Catalina eine extra Zustimmung.
Starte ich mein Programm als *.app kommt diese einmalige Nachfrage und alles ist ok. Beim Start aus der IDE heraus leider nicht und daher wird das Script nicht ausgeführt.

Ingo