Gehe zu deutscher Webseite

News

Project description:

OIDplus is an OpenSource database solution to manage Objekt Identifiers ("OIDs") and many other object types (e.g. COM+ GUIDs). With OIDplus, you can operate your own "Registration Authority" and either present your objects to the public, or manage them internally (hidden from the public). You can delegate permissions to subordinate objects to other users (RAs) in the system, so that they can work independently.

The ViaThinkSoft Registration Authority already uses OIDplus 2.0 and even gives users the possibility to gain a free OID.

We are grateful for every person that wants to install OIDplus on their systems, as we love to see our product spreading and receive feedback about the user-experience. Therefore, if we can help you with installing OIDplus and migrating your data into OIDplus, please let us know. We will support you with this, free of charge!

Downloading/Updating using SVN (recommended):
svn co https://svn.viathinksoft.com/svn/oidplus/trunk/

System requirements:
- PHP compatible web server (tested with Apache 2, nginx and Microsoft IIS)
- PHP 7.0 or higher
- with extension GMP or BCMath
- with extension MBString
- with extension MySQLi, PostgreSQL, SQLite3, PDO or ODBC
- Database: MySQL/MariaDB (recommended), PostgreSQL, SQLite3 or Microsoft SQL Server
- Independent of operating system (tested with Windows and Linux)

Show demo system
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

An API written in PHP for the OID repository oid-info.com.

The majority of the functions provided by this API helps developers in creating XML files which can be uploaded to the OID repository to add multiple OIDs, but the API also contains other helpful utilities related to OIDs, UUIDs and the OID repository in general. The XML generation can be useful for Registration Authorities (RAs) that want to deliver their assignments to oid-info.com , but also for people who want to support the OID repository by adding OIDs from public sources.
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

VGWhoIs is a fork of the tool GWhoIs (currently not actively developed). It allows users to find information about domains, IP addresses, ASN numbers etc by querying the best fitting WhoIs service automatically. The information about the whois services is stored in a pattern file and can be altered or extended by new pattern files.

The usage is pretty simple:

vgwhois example.com
Daniel Marschall
ViaThinkSoft Co-Founder
Download description:

YouTube Downloader is a tool for Linux. It is a wrapper for youtube-dl and offers several additional functionalities like the downloading and searching inside channels, or downloading of playlists. You can either download videos or audio files. YouTube-IDs can be automatically written in the ID tag of downloaded mp3 files. An automatic managed list of already downloaded videos allows you to move away the downloaded files without the risk of downloading the already downloaded files again. The tool is fully CLI and is optimized for cronjobs.

Requirements:
- PHP CLI
- Package "youtube-dl"
- If you want to extract MP3 files: "avconv" or "ffmpeg". Optional: "id3v2"
- Ein Youtube API-Key (obtain here)
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

LogViewer ist ein kleines Tool für Linux, das Logdateien (üblicherweise von PHP) ausliest und in eine MySQL-Datenbank speichert.
Dort werden die Fehler kategorisiert und nach Eintrittszeitpunkt und Anzahl zusammengefasst.
Über ein Webinterface können die Fehler sortiert und gefiltert werden. Da es das Ziel ist, die Fehler zu korrigieren, kann mit einem Klick der Fehler ausgeblendet werden. Er wird dann nur noch eingeblendet, wenn er trotzdem nocheinmal auftritt.
Daniel Marschall
ViaThinkSoft Co-Founder
Download description:

Beta release of ViaThinkSoft crypto chat.
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

In this project, you will find various downloads about the PC version of the ancient game "Plumbers Don't Wear Ties".
Daniel Marschall
ViaThinkSoft Co-Founder
Download description:

This editor let you edit the file GAME.BIN
Daniel Marschall
ViaThinkSoft Co-Founder
Download description:

This engine replaces the original 16-bit engine. It is compatible with all Windows Operating Systems beginning with Windows 95.

If a file called INTRO.AVI is existing, the 32-bit engine will play it at the beginning at the game.
Daniel Marschall
ViaThinkSoft Co-Founder
32/64 Bit Delphi (Windows 95+):

uses
  MMSystem, Windows;

function Supports16BitWaveout: boolean;
var
  caps: TWaveOutCaps;
begin
  ZeroMemory(@caps, sizeof(caps));
  waveOutGetDevCaps(0, @caps, sizeof(caps));
  result := caps.dwFormats and $CCCCCCCC <> 0;
end;

16 Bit Delphi (Windows 3.x):

uses
  MMSystem;

function Supports16BitWaveout: boolean;
var
  caps: TWaveOutCaps;
begin
  waveOutGetDevCaps(0, @caps, sizeof(caps));
  result := caps.dwFormats and $CCCC <> 0;
end;

How it works:

{ 11.025 kHz, Mono,   8-bit  }  WAVE_FORMAT_1M08   00000001 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 11.025 kHz, Stereo, 8-bit  }  WAVE_FORMAT_1S08   00000002 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 11.025 kHz, Mono,   16-bit }  WAVE_FORMAT_1M16   00000004 and CCCCCCCC = 00000004 ==> "16 Bit"
{ 11.025 kHz, Stereo, 16-bit }  WAVE_FORMAT_1S16   00000008 and CCCCCCCC = 00000008 ==> "16 Bit"

{ 22.05  kHz, Mono,   8-bit  }  WAVE_FORMAT_2M08   00000010 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 22.05  kHz, Stereo, 8-bit  }  WAVE_FORMAT_2S08   00000020 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 22.05  kHz, Mono,   16-bit }  WAVE_FORMAT_2M16   00000040 and CCCCCCCC = 00000040 ==> "16 Bit"
{ 22.05  kHz, Stereo, 16-bit }  WAVE_FORMAT_2S16   00000080 and CCCCCCCC = 00000080 ==> "16 Bit"

{ 44.1   kHz, Mono,   8-bit  }  WAVE_FORMAT_44M08  00000100 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 44.1   kHz, Stereo, 8-bit  }  WAVE_FORMAT_44S08  00000200 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 44.1   kHz, Mono,   16-bit }  WAVE_FORMAT_44M16  00000400 and CCCCCCCC = 00000400 ==> "16 Bit"
{ 44.1   kHz, Stereo, 16-bit }  WAVE_FORMAT_44S16  00000800 and CCCCCCCC = 00000800 ==> "16 Bit"

{ 48     kHz, Mono,   8-bit  }  WAVE_FORMAT_48M08  00001000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 48     kHz, Stereo, 8-bit  }  WAVE_FORMAT_48S08  00002000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 48     kHz, Mono,   16-bit }  WAVE_FORMAT_48M16  00004000 and CCCCCCCC = 00004000 ==> "16 Bit"
{ 48     kHz, Stereo, 16-bit }  WAVE_FORMAT_48S16  00008000 and CCCCCCCC = 00008000 ==> "16 Bit"

{ 96     kHz, Mono,   8-bit  }  WAVE_FORMAT_96M08  00010000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 96     kHz, Stereo, 8-bit  }  WAVE_FORMAT_96S08  00020000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 96     kHz, Mono,   16-bit }  WAVE_FORMAT_96M16  00040000 and CCCCCCCC = 00040000 ==> "16 Bit"
{ 96     kHz, Stereo, 16-bit }  WAVE_FORMAT_96S16  00080000 and CCCCCCCC = 00080000 ==> "16 Bit"
Daniel Marschall
ViaThinkSoft Co-Founder

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Linq;

namespace ConsoleApp6
{

    class Program
    {


        public class AtomzeitAsync
        {
            public struct Atomzeit
            {
                public string server;
                public DateTime zeit;
            }

            protected static DateTime GetNetworkTime(string ntpServer, bool utc = false)
            {
                // https://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c

                // NTP message size - 16 bytes of the digest (RFC 2030)
                var ntpData = new byte[48];

                //Setting the Leap Indicator, Version Number and Mode values
                ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)

                var addresses = Dns.GetHostEntry(ntpServer).AddressList;

                //The UDP port number assigned to NTP is 123
                var ipEndPoint = new IPEndPoint(addresses[0], 123);
                //NTP uses UDP

                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                {
                    socket.Connect(ipEndPoint);

                    //Stops code hang if NTP is blocked
                    socket.ReceiveTimeout = 3000;

                    socket.Send(ntpData);
                    socket.Receive(ntpData);
                    socket.Close();
                }

                //Offset to get to the "Transmit Timestamp" field (time at which the reply 
                //departed the server for the client, in 64-bit timestamp format."
                const byte serverReplyTime = 40;

                //Get the seconds part
                ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);

                //Get the seconds fraction
                ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);

                //Convert From big-endian to little-endian
                intPart = SwapEndianness(intPart);
                fractPart = SwapEndianness(fractPart);

                var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);

                //**UTC** time
                var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);

                return utc ? networkDateTime : networkDateTime.ToLocalTime();
            }

            private static uint SwapEndianness(ulong x)
            {
                // https://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c
                // stackoverflow.com/a/3294698/162671
                return (uint)(((x & 0x000000ff) << 24) +
                               ((x & 0x0000ff00) << 8) +
                               ((x & 0x00ff0000) >> 8) +
                               ((x & 0xff000000) >> 24));
            }

            static AtomzeitAsync()
            {
                string zeitServerFile = "TimeserverNTP.txt";
                if (File.Exists(zeitServerFile))
                {
                    bool containsSomething = false;
                    var lines = File.ReadAllLines(zeitServerFile);
                    foreach (var line in lines)
                    {
                        if (line.Trim() == "") continue;
                        if (line.Trim().Substring(0, 1) == "#") continue;
                        containsSomething = true;
                        break;
                    }
                    if (containsSomething)
                    {
                        Array.Resize(ref servers, 0);
                        foreach (var line in lines)
                        {
                            if (line.Trim() == "") continue;
                            if (line.Trim().Substring(0, 1) == "#") continue;
                            Array.Resize(ref servers, servers.Length + 1);
                            servers[servers.Length - 1] = line.Trim();
                        }
                    }
                }
                else
                {
                    string[] dummyList = { };
                    File.WriteAllLines(zeitServerFile, dummyList.ToList());
                }
            }
            public static string[] servers = {
        "ptbtime1.ptb.de",
        "ptbtime2.ptb.de",
        "ptbtime3.ptb.de"
        };

            public static Atomzeit? GetAtomzeit(int timeout = 1000)
            {
                List<Task<Atomzeit>> tasks = new List<Task<Atomzeit>>();

                int bakWorkerThreads = 0;
                int bakCompletionPortThreads = 0;
                ThreadPool.GetMinThreads(out bakWorkerThreads, out bakCompletionPortThreads);
                ThreadPool.SetMinThreads(bakWorkerThreads + servers.Length, bakCompletionPortThreads + servers.Length);
                try
                {
                    for (int i = 0; i < servers.Length; i++)
                    {
                        tasks.Add(GetFileLengthsAsync(servers[i], false));
                    }

                    Thread.Sleep(timeout);

                    for (int ctr = 0; ctr < tasks.Count; ctr++)
                    {
                        if (tasks[ctr].Status == TaskStatus.RanToCompletion)
                        {
                            return tasks[ctr].Result;
                        }
                    }

                    return null;
                }
                finally
                {
                    ThreadPool.SetMinThreads(bakWorkerThreads, bakCompletionPortThreads);
                }
            }

            private static Task<Atomzeit> GetFileLengthsAsync(string serverIp, bool utc)
            {
                return Task.Factory.StartNew(() =>
                {
                    // Variable für Fehlermeldungen
                    string errors = null;

                    try
                    {
                        Atomzeit res = new Atomzeit();
                        res.server = serverIp;
                        res.zeit = GetNetworkTime(serverIp, utc);
                        return res;
                    }
                    catch (Exception ex)
                    {
                        // Fehler dokumentieren
                        if (errors != null) errors += "\r\n";
                        errors += "Fehler bei der Abfrage von '" +
                           serverIp + ": " + ex.Message;
                    }

                    // Wenn die Methode hier ankommt, sind bei allen Abfragen
                    // Fehler aufgetreten, also eine Ausnahme werfen
                    throw new Exception(errors);
                });
            }

        }

        public static void Main()
        {
            AtomzeitAsync.Atomzeit? az = AtomzeitAsync.GetAtomzeit();
            if (az == null)
            {
                Console.WriteLine("Atomzeit konnte nicht ermittelt werden");
            }
            else
            {
                Console.WriteLine("Atomzeit: {0} gemeldet durch {1}", ((AtomzeitAsync.Atomzeit)az).zeit, ((AtomzeitAsync.Atomzeit)az).server);
            }

            Console.ReadLine();
        }

    }
}
Daniel Marschall
ViaThinkSoft Co-Founder
ATTENTION: The DayTime-Protocol is outdated! Please use the NTP variant here.

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net.Sockets;

namespace ConsoleApp6
{

    class Program
    {
        public class AtomzeitAsync
        {
            public struct Atomzeit
            {
                public string server;
                public DateTime zeit;
            }
            public static string[] servers = { "time-a.nist.gov", "time-b.nist.gov", "time.nist.gov", "utcnist.colorado.edu", "nist1.datum.com" };
            public static Atomzeit? GetAtomzeit(int timeout = 1000)
            {
                List<Task<Atomzeit>> tasks = new List<Task<Atomzeit>>();

                int bakWorkerThreads = 0;
                int bakCompletionPortThreads = 0;
                ThreadPool.GetMinThreads(out bakWorkerThreads, out bakCompletionPortThreads);
                ThreadPool.SetMinThreads(bakWorkerThreads + servers.Length, bakCompletionPortThreads + servers.Length);
                try
                {
                    for (int i = 0; i < servers.Length; i++)
                    {
                        tasks.Add(GetFileLengthsAsync(servers[i], false));
                    }

                    Thread.Sleep(timeout);

                    for (int ctr = 0; ctr < tasks.Count; ctr++)
                    {
                        if (tasks[ctr].Status == TaskStatus.RanToCompletion)
                        {
                            return tasks[ctr].Result;
                        }
                    }
                    return null;
                }
                finally
                {
                    ThreadPool.SetMinThreads(bakWorkerThreads, bakCompletionPortThreads);
                }
            }

            private static Task<Atomzeit> GetFileLengthsAsync(string serverIp, bool utc)
            {
                return Task.Factory.StartNew/*Task.Run*/(() =>
                {


                        // Variable für Fehlermeldungen
                        string errors = null;

                    TcpClient tcpClient = null;
                    try
                    {
                            // TcpClient erzeugen und den Empfangs-Timeout auf eine Sekunde
                            // setzen
                            tcpClient = new TcpClient();
                        tcpClient.ReceiveTimeout = 1000;

                            // Versuch zum aktuellen Server eine Verbindung aufzubauen
                            tcpClient.Connect(serverIp, 13);

                            // Den NetworkStream referenzieren
                            NetworkStream networkStream = tcpClient.GetStream();

                        string result = null;
                        if (networkStream.CanWrite && networkStream.CanRead)
                        {
                                // Das Ergebnis empfangen und in ASCII konvertieren
                                byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
                            try
                            {
                                networkStream.Read(bytes, 0,
                                   (int)tcpClient.ReceiveBufferSize);
                                result = Encoding.ASCII.GetString(bytes);
                            }
                            catch (Exception ex)
                            {
                                    // Fehler dokumentieren
                                    if (errors != null) errors += "\r\n";
                                errors += "Fehler bei der Abfrage von '" + serverIp +
                                   ": " + ex.Message;
                            }
                        }

                        if (result != null)
                        {
                                // Das Ergebnis, das die Form JJJJJ YR-MO-DA HH:MM:SS TT L H msADV 
                                // UTC(NIST) OTM besitzt, in einzelne Token aufsplitten
                                string[] token = result.Split(' ');

                                // Anzahl der Token überprüfen
                                if (token.Length >= 6)
                            {
                                    // Den Health-Status auslesen und überprüfen
                                    string health = token[5];
                                if (health == "0")
                                {
                                        // Alles ok:  Datums- und Zeitangaben auslesen
                                        string[] dates = token[1].Split('-');
                                    string[] times = token[2].Split(':');

                                        // DateTime-Instanz mit diesen Daten erzeugen
                                        System.DateTime utcDate =
                                   new System.DateTime(Int32.Parse(dates[0]) + 2000,
                                   Int32.Parse(dates[1]), Int32.Parse(dates[2]),
                                   Int32.Parse(times[0]), Int32.Parse(times[1]),
                                   Int32.Parse(times[2]));

                                        // Lokale Zeit berechnen und zurückgeben
                                        if (utc)
                                    {
                                        Atomzeit res = new Atomzeit();
                                        res.server = serverIp;
                                        res.zeit = utcDate;
                                        return res;
                                    }
                                    else
                                    {
                                        Atomzeit res = new Atomzeit();
                                        res.server = serverIp;
                                        res.zeit = TimeZone.CurrentTimeZone.ToLocalTime(utcDate);
                                        return res;
                                    }
                                }
                                else
                                {
                                        // Fehler dokumentieren
                                        if (errors != null) errors += "\r\n";
                                    errors += "Fehler bei der Abfrage von '" + serverIp +
                                       ": Der Health-Status ist " + health;
                                }
                            }
                            else
                            {
                                    // Fehler dokumentieren
                                    if (errors != null) errors += "\r\n";
                                errors += "Fehler bei der Abfrage von '" + serverIp +
                                   ": Die Anzahl der Token ist kleiner als 6";
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                            // Fehler dokumentieren
                            if (errors != null) errors += "\r\n";
                        errors += "Fehler bei der Abfrage von '" +
                           serverIp + ": " + ex.Message;
                    }
                    finally
                    {
                        try
                        {
                                // TcpClient schließen
                                tcpClient.Close();
                        }
                        catch { }
                    }

                        // Wenn die Methode hier ankommt, sind bei allen Abfragen
                        // Fehler aufgetreten, also eine Ausnahme werfen
                        throw new Exception(errors);
                });
            }

        }

        public static void Main()
        {
            AtomzeitAsync.Atomzeit? az = AtomzeitAsync.GetAtomzeit();
            if (az == null)
            {
                Console.WriteLine("Atomzeit konnte nicht ermittelt werden");
            }
            else
            {
                Console.WriteLine("Atomzeit: {0} gemeldet durch {1}", ((AtomzeitAsync.Atomzeit)az).zeit, ((AtomzeitAsync.Atomzeit)az).server);
            }

            Console.ReadLine();
        }

    }
}
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:



VNag (ViaThinkSoft Nagios) is a framework for PHP which allows developing plguins for Nagios-compatible systems (e.g. Icinga2), following the development guidelines.

The download package contains documentation, examples and many new plugins, e.g. to check WordPress installations.

Beside developing normal Nagios/Icinga plugins (PHP will be called via CLI), you can develop plugins which are additionally served over HTTP.

  • The plugins can be shown via a HTTP-Demon (e.g. Apache) in user's browsers. Beside the output for Nagios (Summary, Verbose information, Performance data), user-defined HTML output can be added, e.g. to complete your Nagios output with more diagrams, pictures, etc. Only one code base is required!

  • The web-output contains a hidden machine readable part, which can be read out with the "WebReader" plugin of VNag. The WebReader plugins reads the machine readable part and outputs the data in the output format which can be read by Nagios. This way, you can monitor things like WordPress version at systems where you have no shell access and/or without Nagios installed.

  • It is also possible to create websites which only have a machine readable part (i.e. you include your VNag output in your existing website). This machine readable part can be optionally signed and/or encrypted.

VNag comes with following plugins pre-installed:

  • 4images_version: Checks 4images installations for updates.
  • disk_running: Checks if harddisks which do not have SMART capability are online
  • file_timestamp: Warns when files are not modified withhin a specific interval/age.
  • ipfm: Checks the log files of the tool "ipfm" and warns when the measured traffic exceeds a given limit.
  • joomla_version: checks Joomla installations for updates.
  • last: Checks the output of the tool "last" and warns when logins from suspicious IP adresses are detected.
  • mdstat: Parses the output of "/proc/mdstat" and warns when drives inside a RAID array have failed.
  • mediawiki_version: Checks MediaWiki installations for updates.
  • pmwiki_version: Checks PmWiki installations for updates.
  • net2ftp_version: Checks net2ftp installations for updates.
  • nocc_version: Checks NOCC webmail installations for updates.
  • openbugbounty: Checks if your domains are listed at OpenBugBounty.org.
  • phpbb_version: Checks phpBB installations for updates.
  • phpmyadmin_version: Checks phpMyAdmin installations for updates.
  • roundcube_version: Checks RoundCube installations for updates.
  • smart: Checks the SMART attributes of harddrives and warns when bad attributes are detected.
  • virtual_mem: Checks the amount of virtual memory (physical memory + swap).
  • webreader: Reads the output of another VNag plugin transferred over HTTP.
  • wordpress_version: Checks WordPress installations for updates.
  • x509_expire: Warns when X.509 (PEM) certificate files reach a specific age.
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

This small class in PHP has following functionalities:

- Get MIME Type from a filename (useful if your system does not support mime_content_type)
- Get a name/description of a given file or filename

The project contains a small lookup-table for file type names in English.
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

This small class in PHP has following functionalities:

- Get MIME Type from a filename (useful if your system does not support mime_content_type)
- Get a name/description of a given file or filename

The project contains a small lookup-table for file type names in English.
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

FastPHP is a simple, efficient and comfortable editor/IDE for PHP. Beside syntax highlighting, a code explorer and the execution of PHP scripts outside the browser, FastPHP offers other useful functionalities like PHP Lint, showing the PHP documentation by keystroke and automatic replacement of whitespaces into tabs.
Daniel Marschall
ViaThinkSoft Co-Founder
Project description:

ViaThinkSoftSimpleLogEvent offers a COM interface for easily logging things into the Windows Event Log.

Using a COM interface enables some applications which cannot call arbitary DLL functions (like PHP) to write to the Event Log.

Additionally, ViaThinkSoftSimpleLogEvent registeres a "Log Event Provider" which will prevent the message "The description for Event ID ... from source ... cannot be found" that would show up if you would call the WinAPI function "ReportEvent" without MessageTable/Provider.


Example usage with VBScript

Dim objMyObject

set objMyObject = CreateObject("ViaThinkSoftSimpleLogEvent.ViaThinkSoftSimpleEventLog")

const LOGEVENT_MSG_SUCCESS       = 0
const LOGEVENT_MSG_INFORMATIONAL = 1
const LOGEVENT_MSG_WARNING       = 2
const LOGEVENT_MSG_ERROR         = 3

objMyObject.LogEvent "MySourceName", LOGEVENT_MSG_WARNING, "This is a test warning written by VBS"

Example usage with PHP

define('CLASS_ViaThinkSoftSimpleEventLog', '{E4270053-A217-498C-B395-9EF33187E8C2}');

define('LOGEVENT_MSG_SUCCESS',       0);
define('LOGEVENT_MSG_INFORMATIONAL', 1);
define('LOGEVENT_MSG_WARNING',       2);
define('LOGEVENT_MSG_ERROR',         3);

$x = new COM(CLASS_ViaThinkSoftSimpleEventLog);
$x->LogEvent('MySourceName', LOGEVENT_MSG_WARNING, 'This is a test warning written by PHP');

Example usage with Delphi

uses
  ActiveX,
  ViaThinkSoftSimpleLogEvent_TLB;

procedure LogTest;
var
  x: IViaThinkSoftSimpleEventLog;
begin
  CoInitialize(nil); // needs to be called only once
  x := CoViaThinkSoftSimpleEventLog.Create;
  x.LogEvent('MySourceName', ViaThinkSoftSimpleLogEvent_TLB.Warning, 'This is a test warning written by Delphi');
  x := nil;
end;
Daniel Marschall
ViaThinkSoft Co-Founder

Screenshots of the projekt

  Example of created log event  
Project description:

FastPHP is a simple, efficient and comfortable editor/IDE for PHP. Beside syntax highlighting, a code explorer and the execution of PHP scripts outside the browser, FastPHP offers other useful functionalities like PHP Lint, showing the PHP documentation by keystroke and automatic replacement of whitespaces into tabs.
Daniel Marschall
ViaThinkSoft Co-Founder
Download description:

These patches fix various errors for the English and German editions of the game!

See a list of the changes here
Daniel Marschall
ViaThinkSoft Co-Founder
Download description:

Dieser Patch ist nur für die zensierte Fassung der Spielebox von ALDI notwendig (schwarze CD mit orangener Schrift). Die Version aus dem Einzelhandel ist FSK 16 und besitzt keinerlei zensierten Videos.

Dieser inoffizielle Patch ersetzt zensierte Videos mit den Videos der deutschen Vollversion. Es wurden beispielsweise alle Abbildungen von Bomben, Explosions-Animationen, dem Helikopterabsturz oder Videos mit der weinenden Tochter durch Standbilder ersetzt.

Dieser Patch ist vor allem deswegen notwendig, da bei der Zensur Fehler unterlaufen sind, wodurch einige Räume schwarz dargestellt wurden, und man blind klicken musste.
Daniel Marschall
ViaThinkSoft Co-Founder