Tricktresor

Hello, Calling – Nutzung dynamischer Bibliotheken mit ABAP®

Hello, Library Calling von Stefan Schnell Oftmals besteht der Wunsch oder sogar die Notwendigkeit mit einem ABAP®-Programm von einem SAP®- Applikationsserver auf dem Präsentationsserver mit dem Betriebssystem ® Windows® Operationen auszuführen. Zu diesem Zweck bieten ABAP® und der SAP® GUI für Windows® einige Möglichkeiten an, die jedoch nicht alle Wege bereitstellen. So ist beispielsweise ein direkter Zugriff auf dynamische Bibliotheken, auch als DLLs bekannt, und eine Kommunikation mit dem GUI, sobald das ABAP®-Programm im Hintergrund ausgeführt wird, nicht vorgesehen. Im Folgenden wird beschrieben wie mit der Programmiersprache FreeBASIC eine DLL erstellt und diese mittels DynamicWrapperX mit einem ABAP®-Programm verwendet werden kann. Weiterhin wird aufgezeigt wie dieses Szenario mit Background Light auch in Hintergrundprozessen verwendet werden kann.

Die Wahl der Programmiersprache zur Erstellung OutputDebugString Text End Sub einer DLL ist frei. Prinzipiell spielt es keine Rolle welche Sprache verwendet wird. Hier fiel die Wahl '-Function MsgBox------Function MsgBox Alias "MsgBox" _ exemplarisch auf FreeBASIC, jedoch hätte ebenso (ByVal Text As String, _ ein anderer BASIC-, Pascal- oder -Dialekt gewählt ByVal Caption As String, _ ByVal Style As Integer) As Integer Export werden können. MsgBox = MessageBox(NULL, Text, Caption, Style) End Function Wir sprechen FreeBASIC '-Function CircleArea------Function CircleArea Alias "CircleArea" _ FreeBASIC ist ein frei verfügbarer 32-bit - (ByVal Diameter As Single) _ ® für Windows und . Die ursprüng- As Single Export liche Idee hinter dieser Sprache ist die Fortführung Const Pi As Double = 3.1415926535897932 CircleArea = Pi * (Sqr(Diameter) / 4) ® eines Ansatzes mit hoher Microsoft QuickBASIC- End Function Kompatibilität. Daneben bietet FreeBASIC aber End Extern auch alle Möglichkeiten moderner Programmier- sprachen bis hin zur objektorientierten Program- '-End------mierung. DynamicWrapperX COM-Server Programmierung einer DLL DynamicWrapperX ist ein frei verfügbarer COM- ® Eine dynamische Bibliothek mit FreeBASIC zu Server für Windows , der die Möglichkeit bietet erstellen ist keine besondere Schwierigkeit. Die Funktionen von dynamischen Bibliotheken über ® Sub-Routinen und Funktionen müssen lediglich die COM-Schnittstelle aufzurufen. Da ABAP die mit dem Bezeichner Export deklariert und die direkte Verwendung von COM-Bibliotheken Kompilierung mit dem Parameter -dll durchge- unterstützt, können auf diesem Wege DLL- führt werden. Für das folgende Beispiel mit dem Funktionen auf dem Präsentationsserver aufgerufen werden. Name Test.dll wurden drei Routinen mit unter- schiedlichen Schnittstellen und Typen ausgeprägt: Verwendung dynamisch 1. Die Sub-Routine DebugPrint erhält einen Text und übergibt diesen an einen Debugger Der Einsatz der im Vorherigen erstellten DLL ® ohne einen Rückgabewert zu liefern. gestaltet sich mit ABAP und DynamicWrapperX ebenfalls nicht besonders aufwendig. Neben der 2. Die Funktion MsgBox erhält zwei Texte und Erzeugung des Objektes muss jede Funktion erst- eine Ganzzahl, übergibt diese der Windows® einmal registriert werden. Dabei werden mit den API-Funktion MessageBox und liefert als Argumenten 'i=...' die Eingabe- und mit Rückgabewert ebenfalls eine Ganzzahl. 'r=...' die Ausgabeparameter spezifiziert, z.B. 3. Die Funktion CircleArea erhält einen steht s für String, l für Long und f für Float. Nach Durchmesser als Kommazahl, berechnet die der erfolgreichen Registrierung kann nun die DLL- Fläche eines entsprechenden Kreises und Funktion einfach aufgerufen werden. liefert diese ebenfalls als Kommazahl zurück. "-Begin------Report zDynWrapX. '-Begin------"-Includes------'-Includes------Include OLE2INCL. #Include Once "Windows.bi" "-Variables------Extern "Windows-MS" Data DynWrapX Type OLE2_OBJECT. Data ret Type Integer Value 0. '-Sub DebugPrint------Data Area Type Float Value '0.0'. Sub DebugPrint Alias "DebugPrint" _ Data Diameter Type Float Value '1.0'. (ByVal Text As String) Export

Seite 1 von 3 Tricktresor

Hello, Library Calling – Nutzung dynamischer Bibliotheken mit ABAP®

"-Main------"-Variables------Create Object DynWrapX 'DynamicWrapperX'. Data DynWrapX Type Integer Value 0. If sy-subrc = 0 And DynWrapX-Handle <> 0. Data ret Type Integer Value 0. Data Area Type Float Value '0.0'. "-DebugPrint------Data Diameter Type String Value '1.0'. Call Method Of DynWrapX 'Register' Exporting Data Cmd Type String Value ''. #1 = 'Test.dll' #2 = 'DebugPrint' #3 = 'i=s'. "-Main------If sy-subrc = 0. BackgroundLightExists DestExists. Call Method Of DynWrapX 'DebugPrint' If DestExists = 1. Exporting #1 = 'Dies ist ein Test'. CreateObject 'DynamicWrapperX' DynWrapX EndIf. hResult. If sy-subrc = 0 And DynWrapX <> 0 And "-MsgBox------hResult = S_OK. Call Method Of DynWrapX 'Register' Exporting #1 = 'Test.dll' #2 = 'MsgBox' "-DebugPrint------#3 = 'i=ssl' #4 = 'r=l'. CallMethod DynWrapX If sy-subrc = 0. 'Register(''Test.dll'', ''DebugPrint'', Call Method Of DynWrapX 'MsgBox' = ret ''i=s'')' Exporting #1 = 'Dies ist ein Test' hResult. #2 = 'Test' #3 = 1. If sy-subrc = 0 And hResult = S_OK. Write: / ret. CallMethod DynWrapX EndIf. 'DebugPrint(''Dies ist ein Test'')' hResult. "-CircleArea------EndIf. Call Method Of DynWrapX 'Register' Exporting #1 = 'Test.dll' #2 = 'CircleArea' "-MsgBox------#3 = 'i=f' #4 = 'r=f'. CallMethod DynWrapX If sy-subrc = 0. 'Register(''Test.dll'', ''MsgBox'', Call Method Of DynWrapX 'CircleArea' = ''i=ssl'', ''r=l'')' Area Exporting #1 = Diameter. hResult. Write: / Area. If sy-subrc = 0 And hResult = S_OK. EndIf. GetPropertyInteger DynWrapX 'MsgBox(''Dies ist ein Test'', Free Object DynWrapX. ''Test'', 1 As Long)' EndIf. ret hResult. Write: / ret. "-End------EndIf.

"-CircleArea------Hintergrundbeleuchtung CallMethod DynWrapX 'Register(''Test.dll'', ''CircleArea'', Im Normalfall ist eine Kommunikation zwischen ''i=f'', ''r=f'')' dem Präsentationsserver und einem im Hinter- hResult. ® If sy-subrc = 0 And hResult = S_OK. grund laufenden ABAP -Programm nicht möglich. Concatenate 'CircleArea(' Diameter ')' Background Light ist eine ABAP®-COM-Brücke die Into Cmd. ® GetPropertyFloat DynWrapX Cmd Area es erlaubt COM-Bibliotheken auch in ABAP - hResult. Hintergrundprozessen zu verwenden und somit Write: / Area. trotzdem eine Kommunikation zu erlauben. Bei EndIf. ® Background Light handelt es sich um ein SAP FreeObject DynWrapX. Server-Programm auf Basis des SAP® NetWeaver® EndIf. EndIf. RFC SDK mit dem jeder COM-Server angesprochen werden kann. Darüber hinaus werden noch weitere "-End------® Möglichkeiten angeboten z.B. um das Windows Zusätzliche Hinweise Management Instrumentaion (WMI) zu nutzen. • Der Zusatz .dll beim Methodenaufruf Register ist optional. Blick in den Rückspiegel • Das Verzeichnis system32 ist am besten Die Umsetzung eines ABAP®-Programmes mit geeignet als Speicherort der DLL. Aufgrund Background Light und DynamicWrapperX sieht eingeschränkter Rechte kann dies jedoch zu ähnlich dem vorherigen Ansatz aus. Neben der Problemen führen. zusätzlichen Initialisierung und dem zusätzlichen Rückgabewert hResult sticht die Befehlsübergabe als Zeichenkette ins Auge. Während bei ABAP® Fazit diese mit den #-Parametern spezifiziert werden, Wie gezeigt ist die Verwendung von lokalen findet hier die Übergabe als eine Zeichenkette statt. Bibliotheken auf dem Präsentationsserver mit Dieser Ansatz an sich ist zwar etwas gewöhnungs- ABAP®-Programmen vom Applikationsserver kein bedürftig, bietet aber den Vorteil der besseren Hexenwerk oder Magie. DynamicWrapperX bietet Lesbarkeit. hier einen einfachen Ansatz dies zu realisieren.

"-Begin------Damit können auch die Funktionen des WinAPI Report zBLight. genutzt werden. Ebenso kann der Aufruf von DLL- Funktionen aus ABAP®-Hintergrundprozessen mit "-Includes------Include ZBLIGHTINCL. Background Light und DynamicWrapperX simpel

Seite 2 von 3 Tricktresor

Hello, Library Calling – Nutzung dynamischer Bibliotheken mit ABAP® durchgeführt werden, so dass nicht einmal ein Anhang B Dialogprozess zur Verfügung gestellt werden muss. Auch die Verwendung von Zeigern, die bei DLL- Abschließend noch ein Beispiel mit dem der ® Funktionen öfter üblich sind, können mit einer Zugriff auf das Windows API demonstriert wird. weiteren COM-Bibliothek ermöglicht werden. Es wird die Funktion MessageBox der Bibliothek user32 verwendet, ausgeführt und der Haben Sie Fragen, Anregungen oder Anmerkungen, Rückgabewert abgefragt. so senden Sie einfach eine E-Mail an "[email protected]. Report zDynWrapX. "-Includes------Include OLE2INCL. Warenzeichen "-Constants------Data IDYes Type i Value 6. • SAP, ABAP und NetWeaver sind Data IDNo Type i Value 7. eingetragene Warenzeichen der SAP AG "-Variables------• Microsoft, Windows, und QuickBASIC sind Data Win32 Type OLE2_OBJECT. eingetragene Warenzeichen der Microsoft Data ret Type i.

Corporation, USA "-Main------• FreeBASIC ist Freeware von Andre Victor Create Object Win32 'DynamicWrapperX'. und steht unter GPL-Lizenz If sy-subrc = 0 And Win32-Handle <> 0. • PureBasic ist das Eigentum von Frédéric Call Method Of Win32 'Register' Exporting Laboureur, Fantaisie Software #1 = 'user32' #2 = 'MessageBoxW' • DynamicWrapperX ist Freeware und das #3 = 'i=hwwu' #4 = 'r=l'. If sy-subrc = 0. Eigentum von Yuri Popov • Background Light ist das Eigentum von “-Call MessageBox from WinAPI------Call Method Of Win32 'MessageBoxW' = ret Stefan Schnell Exporting #1 = 0 #2 = 'Hello World' Links #3 = 'Test' #4 = 4. If ret = IDYes. • www..net Write: / 'Yes'. ElseIf ret = IDNo. • www..com Write: / 'No'. Else. • DynamicWrapperX Write: / '?'. • www.stschnell.com EndIf. EndIf. Anhang A Free Object Win32. Ergänzend die identische Ausprägung der dyna- EndIf. mischen Bibliothek in einem anderen BASIC- "-End------Dialekt – PureBasic. Diese Bibliothek kann mit dem ausgeführten ABAP®-Beispiel verwendet werden.

;-Begin------

;-Sub DebugPrint------ProcedureDLL DebugPrint(Text.s) OutputDebugString_(Text) EndProcedure

;-Function MsgBox------ProcedureDLL.l MsgBox(Text.s, Caption.s, Style.l) ProcedureReturn MessageBox_(0, Text, Caption, Style) EndProcedure

;-Function CircleArea------ProcedureDLL.f CircleArea(Diameter.f) ProcedureReturn #PI * (Sqr(Diameter) / 4) EndProcedure

;-End------

Seite 3 von 3