Ergebnis aus AppleScript

MAC OSX spezifisches Forum
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

Ergebnis aus AppleScript

Beitrag 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
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Ergebnis aus AppleScript

Beitrag 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

Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

Re: Ergebnis aus AppleScript

Beitrag 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
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Ergebnis aus AppleScript

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

Re: Ergebnis aus AppleScript

Beitrag 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
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
Antworten