Beispiel C# Wrapper für die FA_XML

// Demo zum Einsatz der VBFA_XML in einem C Programm
//

// Wrapper für die FA_XML in c#
// Stand: 14.09.2011
// Copyright: Olaf Stüben
//
using System;

using System.Runtime.InteropServices;

    class VBFAXML
    {
        [DllImport("VBfa_xml.Dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern IntPtr GetFAXMLVersion();
        [DllImport("VBfa_xml.Dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void FreeMemory(IntPtr ptr);
        [DllImport("VBFA_XML.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void CoalaInit(IntPtr mem, IntPtr message, IntPtr messageLen, IntPtr vars);
        [DllImport("VBFA_XML.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr CoalaMakeElsterXML(IntPtr rc, IntPtr message, IntPtr messageLen,
        String xml,
        String verfahren,
        String datenart,
        String vorgang,
        String testmerker,
        String herstellerid,
        String datenLieferant,
        String transportSchl);
        [DllImport("VBFA_XML.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr CoalaTransfer(IntPtr rc, IntPtr message, IntPtr messageLen,
            String xml,
            int sigtype,
            String fileForPks,
            String password);
    }


    public class FAXML
    {
        private static void freememory(IntPtr ptr)
        {
            IntPtr mem = Marshal.AllocHGlobal(4);
            Marshal.WriteInt32(mem, ptr.ToInt32());
            VBFAXML.FreeMemory(mem);
            Marshal.FreeHGlobal(mem);
        }

        public static String GetVersion()
        {
            IntPtr ptr = VBFAXML.GetFAXMLVersion();
            String ret = Marshal.PtrToStringAnsi(ptr);
            freememory(ptr);
            return ret;
        }

        public static int Init(ref String errortxt, String param, String value)
        {
            int rc = -1;
            // Initialize unmanged memory to hold the array.

            IntPtr ptr = Marshal.AllocHGlobal(12);
            // Copy the Strings to unmanaged memory
            IntPtr unParam = Marshal.StringToHGlobalAnsi(param);
            IntPtr unValue = Marshal.StringToHGlobalAnsi(value);
            IntPtr ret = Marshal.AllocHGlobal(4);
            IntPtr msg = Marshal.AllocHGlobal(1000);
            IntPtr msglen = Marshal.AllocHGlobal(4);

            try
            {
                // Build the parameterarray
                Marshal.WriteIntPtr(ptr, 0, unParam);
                Marshal.WriteIntPtr(ptr, 4, unValue);
                Marshal.WriteIntPtr(ptr, 8, IntPtr.Zero);

                Marshal.WriteInt32(ret, -1);
                Marshal.WriteInt32(msglen, 1000);

                VBFAXML.CoalaInit(ret, msg, msglen, ptr);

                rc = Marshal.ReadInt32(ret);
                int msglength = Marshal.ReadInt32(msglen);
                errortxt = Marshal.PtrToStringAnsi(msg, msglength);
            }
            finally
            {
                // Free the unmanaged memory.
                Marshal.FreeHGlobal(ptr);
                Marshal.FreeHGlobal(unParam);
                Marshal.FreeHGlobal(unValue);
                Marshal.FreeHGlobal(msg);
                Marshal.FreeHGlobal(msglen);
                Marshal.FreeHGlobal(ret);
            }
            return rc;
        }

        public static int MakeElsterXML(ref String errortxt,
            String xml,
            String verfahren,
            String datenart,
            String vorgang,
            String testmerker,
            String herstellerid,
            String datenLieferant,
            String transportSchl,
            ref String newXML)
        {
            int rc = 0;

            IntPtr ret = Marshal.AllocHGlobal(4);
            IntPtr msg = Marshal.AllocHGlobal(1000);
            IntPtr msglen = Marshal.AllocHGlobal(4);

            try
            {
                // Vorbelegung Fehlertext
                Marshal.WriteInt32(ret, -1);
                Marshal.WriteInt32(msglen, 1000);

                IntPtr unNewxml = VBFAXML.CoalaMakeElsterXML(ret, msg, msglen,
                    xml, verfahren, datenart, vorgang, testmerker, herstellerid, datenLieferant, transportSchl);

                rc = Marshal.ReadInt32(ret);
                int msglength = Marshal.ReadInt32(msglen);
                errortxt = Marshal.PtrToStringAnsi(msg, msglength);

                newXML = Marshal.PtrToStringAnsi(unNewxml);
                freememory(unNewxml);
            }
            finally
            {
                // Free Unmanaged Memory
                Marshal.FreeHGlobal(ret);
                Marshal.FreeHGlobal(msg);
                Marshal.FreeHGlobal(msglen);
            }
            return rc;
        }

        public static int Transfer(ref String errortxt,
            String xml,
            int sigType,
            String pks,
            String pwd,
            ref String newXML)
        {
            int rc = 0;

            IntPtr ret = Marshal.AllocHGlobal(4);
            IntPtr msg = Marshal.AllocHGlobal(1000);
            IntPtr msglen = Marshal.AllocHGlobal(4);

            try
            {
                // Vorbelegung Fehlertext
                Marshal.WriteInt32(ret, -1);
                Marshal.WriteInt32(msglen, 1000);


                IntPtr unNewxml = VBFAXML.CoalaTransfer(ret, msg, msglen,
                    xml, sigType, pks, pwd);

                rc = Marshal.ReadInt32(ret);
                int msglength = Marshal.ReadInt32(msglen);
                errortxt = Marshal.PtrToStringAnsi(msg, msglength);

                newXML = Marshal.PtrToStringAnsi(unNewxml);
                freememory(unNewxml);
            }
            finally
            {
                // Free Unmanaged Memory
                Marshal.FreeHGlobal(ret);
                Marshal.FreeHGlobal(msg);
                Marshal.FreeHGlobal(msglen);
            }
            return rc;
        }

        /// Es soll nicht signiert werden: Wert 99
        public const int SIG_NOSIG = 99;
        /// Es soll mit einem Softzertifikat signiert werden: Wert 0
        public const int SIG_SOFTTOKEN = 0;
        /// Es soll mit einem Sicherheitsstick (ElsterStick) signiert werden: Wert 1
        public const int SIG_ELSTERSTICK = 1;
        /// Es soll mit einer Signaturkarte signiert werden: Wert 2
        public const int SIG_SIGCARD = 2;


        /// Kein Fehler
        public const int ERR_NOERROR = 0;
        /// Es wurde ungueltige Parameter übergeben
        public const int ERR_PARAM = 1;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_DATENTEILNOTFOUND = 2;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_DATENTEILENDNOTFOUND = 3;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_DATEIENDNOTFOUND = 4;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_BEGINDATENLIEFERANT = 5;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_ENDDATENLIEFERANT = 6;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_BEGINTRANSPORTSCHLUESSEL = 7;
        //7 Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_ENDTRANSPORTSCHLUESSEL = 8;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_BEGINDATENGROESSE = 9;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_ENDDATENGROESSE = 10;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_BEGINNUTZDATENNOTFOUND = 11;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_ENDNUTZDATENNOTFOUND = 12;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_HERSTELLERIDNOTFOUND = 13;
        
        /// Die Windows-Netzwerkbibliothek konnte nicht initialisiert werden (nur WIN32)
        public const int ERR_INITSOCKET = 20;
        /// Beim Datenaustausch ist ein Fehler aufgetreten
        public const int ERR_SEND = 21;
        /// Die Daten hatten keine gültig BASE64 kodierung
        public const int ERR_DECODEBASE64 = 22;
        // Die Antwortdaten waren nicht im Format PKCS7
        public const int ERR_DECODEP7 = 23;
        /// Die Antwortdaten waren nicht PKCS7 encrypted
        public const int ERR_NOTENCRYPTED = 24;
        /// Die Daten konnten nicht dekodiert werden (Falscher Privat-Key?)
        public const int ERR_DECODE = 25;
        /// Verbindung zum ProxyServer konnte nicht aufgebaut werden 
        public const int ERR_PROXYCONNECT = 26;
        /// Fehlerhafte bzw fehlende ProxyPort Angabe
        public const int ERR_NOPROXYPORT = 27;
        /// Zu den Servern konnte keine Verbindung aufgebaut werden
        public const int ERR_CONNECTSERVER = 28;
        /// Von der Clearingstelle konnte keine Antwort empfangen werden
        public const int ERR_NORESPONSE = 29;
        /// Der Proxyserver erwartet Anmeldedaten.
        public const int ERR_PROXYAUTH = 30;
        /// Die Signaturdatei konnte nicht geöffnet werden
        public const int ERR_OPENSIGFILE = 31;
        /// Das Passwort für die Signaturdatei ist nicht korrekt
        public const int ERR_OPENPWDSIGFILE = 32;
        /// Der Private Schluessel konnte nicht aus der Signaturdatei gelesen werden
        public const int ERR_SIGNGETPKEY = 33;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_NUTZDATENNOTFOUND = 34;
        /// Im XML-String konnte der Text  nicht gefunden werden
        public const int ERR_NUTZDATENENDNOTFOUND = 35;
        /// Der Schluessel zur Signierung konnte nicht aus der Signaturdatei gelesen werden
        public const int ERR_SIGNGETSIGNATUREKEY = 36;
        /// Der Proxyserver erwartet unbekannt Authentifizierung.
        public const int ERR_PROXYAUTHMETHOD = 37;
        /// Fehler bei der Signaturerstellung
        public const int ERR_SIGERROR = 38;
        /// Keine passende Signaturkarte gefunden
        public const int ERR_NOCARDFOUND = 39;
        /// Fuer die Signaturkarte wird eine PIN benoetigt
        public const int ERR_NEEDPIN = 40;
        /// Die PIN fuer die Signaturkarte ist falsch
        public const int ERR_PIN_INCORRECT = 41;
        /// Die PIN fuer die Signaturkarte ist gesperrt
        public const int ERR_PIN_LOCKED = 42;
        /// Die HerstellerID ist nicht fuer diese DLL/so lizensiert
        public const int ERR_HERSTELLERID = 998;
        /// Sonstige Fehler
        public const int ERR_OTHER = 999;
    }
    
Winston
Beschreibung
C Beispiel UStVA
C# Wrapper
VB Beispiel
Real Basic Beispiel
PHP Beispiel
Java Beispiel Lohnersatzleistungen
ELMA5 Datenübertragung
Kontakt