Muster einer C++-Schnittstelle

 

 

/************************************************************************/

/*                    Muster einer  C++ -Schnittstelle                  */

/*     zu einigen Funktionen der 32 Bit Dynamic Link Library GeoDLL     */

/*      Sie muss bei Bedarf um andere Funktionen erweitert werden.      */

/* Die Schnittstelle kann direkt in den C++ -Quellcode eingebaut werden */

/*                oder als Header-Datei abgelegt werden                 */

/*                                                                      */

/*                  Autor: Killet GeoSoftware Ing.-GbR                  */

/*                                                                      */

/*   Im Aufrufverzeichnis von GeoDLL müssen die Dateien geodll32.dll    */

/*                   und geodllbn.bin vorhanden sein.                   */

/************************************************************************/

 

 

/* Includes *************************************************************/

#include <windows.h>

#include <iostream.h>

#include <stdlib.h>

#include <stdio.h>

 

 

/* Funktionsdeklarationen ***********************************************/

/* Laden der Geodll32.dll */

short int __cdecl GeoDllLoadLib (void);

 

/* Freischalten der DLL-Funktionsgruppen */

short int __cdecl GeoDllSetunlockcode (char* cFreiSchaltCode,

 char* cLizenznehmer);

 

/* Koordinatentransformation */

short int __cdecl GeoDllTrans (

 double  dKoordXQ,       /* X-Koordinate des Quellkoordinatensystems */

 double  dKoordYQ,       /* Y-Koordinate des Quellkoordinatensystems */

 short int sKoordSysQ,   /* Kennung fuer das Quellkoordinatensystem */

 short int sBezSysQ,     /* Kennung fuer das Quellbezugssystem */

 short int sNotationQ,   /* Kennung fuer die Notation der Quellkoord. */

 double *dKoordXZ,       /* X-Koordinate des Zielkoordinatensystems */

 double *dKoordYZ,       /* Y-Koordinate des Zielkoordinatensystems */

 short int sKoordSysZ,   /* Kennung fuer das Zielkoordinatensystem */

 short int sBezSysZ,     /* Kennung fuer das Zielbezugssystem */

 short int sNotationZ,   /* Kennung fuer die Notation der Zielkoord. */

 short int sStreifenZ);  /* Kennung fuer den Zielmeridianstreifen */

 

/* Transformationsparameter fuer ein Bezugssystem */

short int __cdecl GeoDllSetuserrefsys (

 short int sRefSysTyp,   /* Kennung zum Setzen des Bezugssystems */

 double dTranslX,        /* Verschiebung auf der X-Achse (Translation) */

 double dTranslY,        /* Verschiebung auf der Y-Achse */

 double dTranslZ,        /* Verschiebung auf der Z-Achse */

 double dRotX,           /* Drehung der X-Achse (Rotation) */

 double dRotY,           /* Drehung der Y-Achse */

 double dRotZ,           /* Drehung der Z-Achse */

 double dMasstab);       /* Masstabsfaktor in ppm */

 

/* Halbachsen für das Quellellipsoid */

short int __cdecl GeoDllSetuserellsource (

 short int sEllSource,   /* Kennung fuer das Quellellipsoid */

 double dHalbAchsGrQ,    /* Grosser HalbAchsius des Quellellipsoiden */

 double dHalbAchsKlQ);   /* Kleiner HalbAchsius des Quellellipsoiden */

 

/* Halbachsen für das Zielellipsoid */

short int __cdecl GeoDllSetuserelltarget (

 short int sEllTarget,   /* Kennung fuer das Quellellipsoid */

 double dHalbAchsGrZ,    /* Grosser HalbAchsius des Zielellipsoiden */

 double dHalbAchsKlZ);   /* Kleiner HalbAchsius des Zielellipsoiden */

 

/* Entfernung zwischen zwei Koordinatenpaaren */

short int __cdecl GeoDllDistancegeo (

 double dGeoLaenge1,     /* Geogr. Laenge der ersten Koordinate */

 double dGeoBreite1,     /* Geogr. Breite der ersten Koordinate */

 double dGeoLaenge2,     /* Geogr. Laenge der zweiten Koordinate */

 double dGeoBreite2,     /* Geogr. Breite der zweiten Koordinate */

 double *dStrecke,       /* Berechnete Entfernung */

 short int sEllipsoid);  /* Kennung fuer den geodaetischen Ellipsoiden */

 

/* Zeiger auf die DLL-Funktion setunlockcode() setzen */

short int (_stdcall *pfnSetunlockcode) (

 char *,

 char *) = NULL;

 

/* Zeiger auf die DLL-Funktion coordtrans3() setzen */

short int (_stdcall *pfnTrans) (

 double,

 double,

 short int,

 short int,

 short int,

 double *,

 double *,

 short int,

 short int,

 short int,

 short int) = NULL;

 

/* Zeiger auf die DLL-Funktion setuserrefsys() setzen */

short int (_stdcall *pfnSetuserrefsys) (

 short int,

 double,

 double,

 double,

 double,

 double,

 double,

 double) = NULL;

 

/* Zeiger auf die DLL-Funktion setuserellsource() setzen */

short int (_stdcall *pfnSetuserellsource) (

 short int,

 double,

 double) = NULL;

 

/* Zeiger auf die DLL-Funktion setuserelltarget() setzen */

short int (_stdcall *pfnSetuserelltarget) (

 short int,

 double,

 double) = NULL;

 

/* Zeiger auf die DLL-Funktion distancegeo() setzen */

short int (_stdcall *pfnDistancegeo) (

 double,

 double,

 double,

 double,

 double *,

 short int) = NULL;

 

 

/* Funktion GeoDllLoadLib ***********************************************/

/* Dynamic Link Library GeoDLL laden und Zeiger auf die DLL- */

/* Funktionen setzen */

short int __cdecl GeoDllLoadLib (void)

{

   HINSTANCE hDLL;

   short int sReturn = 1;

   if (pfnTrans == NULL)

   {

      if ((hDLL = LoadLibrary("geodll32.dll")) != NULL)

      {

         if ((pfnSetunlockcode = (short int (_stdcall *)(char*,char*))

          GetProcAddress(hDLL, "setunlockcode")) == NULL)

            sReturn = 0;

         if ((pfnTrans = (short int (_stdcall *)(double, double,

          short int, short int, short int, double *, double *, short int,

          short int, short int, short int)) 

          GetProcAddress(hDLL, "coordtrans3")) == NULL)

            sReturn = 0;

         if ((pfnSetuserrefsys = (short int (_stdcall *)(short int,

          double, double, double, double, double, double, double))

          GetProcAddress(hDLL, "setuserrefsys")) == NULL)

            sReturn = 0;

         if ((pfnSetuserellsource = (short int (_stdcall *)(short int,

          double, double))

          GetProcAddress(hDLL, "setuserellsource")) == NULL)

            sReturn = 0;

         if ((pfnSetuserelltarget = (short int (_stdcall *)(short int,

          double, double))

          GetProcAddress(hDLL, "setuserelltarget")) == NULL)

            sReturn = 0;

         if ((pfnDistancegeo = (short int (_stdcall *)(double, double,

          double, double, double *, short int))

          GetProcAddress(hDLL, "distancegeo")) == NULL)

            sReturn = 0;

      }

      else

         sReturn = 0;

   }

   return (sReturn);

}

 

 

/* Funktion GeoDllSetunlockcode *****************************************/

/* Freischalten der DLL-Funktionsgruppen */

/* Die Parameterbeschreibung steht in der Datei GeoDLL_d.chm */

short int __cdecl GeoDllSetunlockcode (char* cFreiSchaltCode,

 char* cLizenznehmer)

{

   short int sReturn = 0;

   sReturn = pfnSetunlockcode(cFreiSchaltCode, cLizenznehmer);

   return (sReturn);

}

 

 

/* Funktion GeoDllTrans *************************************************/

/* Koordinatentransformation durchfuehren */

/* Die Parameterbeschreibung steht in der Datei GeoDLL_d.chm */

short int __cdecl GeoDllTrans (double dKoordXQ, double dKoordYQ,

 short int sKoordSysQ, short int sBezSysQ, short int sNotationQ,

 double *dKoordXZ, double *dKoordYZ, short int sKoordSysZ,

 short int sBezSysZ, short int sNotationZ, short int sStreifenZ)

{

   short int sReturn = 0;

   sReturn = pfnTrans(dKoordXQ, dKoordYQ, sKoordSysQ, sBezSysQ,

    sNotationQ, dKoordXZ, dKoordYZ, sKoordSysZ, sBezSysZ, sNotationZ,

    sStreifenZ);

   return (sReturn);

}

 

 

/* Funktion GeoDllSetuserrefsys *****************************************/

/* Eigenes Bezugssystem mit sieben Helmert-Transformationsparametern */

/* definieren */

/* Die Parameterbeschreibung steht in der Datei GeoDLL_d.chm */

short int __cdecl GeoDllSetuserrefsys (short int sRefSysTyp,

 double dTranslX, double dTranslY, double dTranslZ, double dRotX,

 double dRotY, double dRotZ, double dMasstab)

{

   short int sReturn = 0;

   sReturn = pfnSetuserrefsys(sRefSysTyp, dTranslX, dTranslY, dTranslZ, 

   dRotX, dRotY, dRotZ, dMasstab);

   return (sReturn);

}

 

 

/* Funktion GeoDllSetuserellsource *****************************************/

/* Eigenen Quellellipsoiden mit den beiden Halbachsen definieren */

/* Die Parameterbeschreibung steht in der Datei GeoDLL_d.chm */

short int __cdecl GeoDllSetuserellsource (short int sEllSource, 

 double dHalbAchsGrQ, double dHalbAchsKlQ)

{

   short int sReturn = 0;

   sReturn = pfnSetuserellsource(sEllSource, dHalbAchsGrQ, dHalbAchsKlQ);

   return (sReturn);

}

 

 

/* Funktion GeoDllSetuserelltarget *****************************************/

/* Eigenen Zielellipsoiden mit den beiden Halbachsen definieren */

/* Die Parameterbeschreibung steht in der Datei GeoDLL_d.chm */

short int __cdecl GeoDllSetuserelltarget (short int sEllTarget, 

 double dHalbAchsGrZ, double dHalbAchsKlZ)

{

   short int sReturn = 0;

   sReturn = pfnSetuserelltarget(sEllTarget, dHalbAchsGrZ, dHalbAchsKlZ);

   return (sReturn);

}

 

 

/* Funktion GeoDllDistancegeo **********************************************/

/* Entfernungsberechnung durchfuehren */

/* Die Parameterbeschreibung steht in der Datei GeoDLL_d.chm */

short int __cdecl GeoDllDistancegeo (double dGeoLaenge1,

 double dGeoBreite1, double dGeoLaenge2, double dGeoBreite2,

 double *dStrecke, short int sEllipsoid)

{

   short int sReturn = 0;

   sReturn = pfnDistancegeo(dGeoLaenge1, dGeoBreite1,

   dGeoLaenge2, dGeoBreite2, dStrecke, sEllipsoid);

   return (sReturn);

}

 

 

 

/************************************************************************/

/*     Beispielhafte Funktionsaufrufe der in der C++ -Schnittstelle     */

/*              definierten Funktionen mit Zugriff auf die              */

/*                     Dynamic Link Library GeoDLL                      */

/*                                                                      */

/*        Dieser Programmteil gehoert nicht zur C++ Schnittstelle       */

/*                                                                      */

/*                   Autor: Killet GeoSoftware Ing.-GbR                    */

/************************************************************************/

 

void main(void)

{

 

/* Variablen */

   double      dEastValue, dNorthValue, dDistance;

 

/* GeoDLL laden */

   if (!GeoDllLoadLib())

   {

      printf("Fehler in GeoDllLoadLib");

      Sleep(10000);

      exit(1);

   }

 

/* Funktionsgruppe "Koordinatentransformationen" freischalten */

/* Die Freischaltschluessel stimmen natuerlich nicht! */

/* Sie müssen bei der Killet GeoSoftware Ing.-GbR erworben werden! */

/* Vollversion: Der Freischaltschluessel muss bei der 1. Eingabe stimmen! */

/* Testversion: Die Funktion GeoaDllSetunlockcode() darf nicht aufgerufen werden! */

/* Testversion funktioniert pro Programmlauf kurze Zeit ohne Freischaltung! */

/*   if (!GeoDllSetunlockcode("123454321-678901234","MacroModia GmbH")) */

/*   { */

/*      printf("Fehler in GeoDllSetunlockcode\n"); */

/*      Sleep(10000); */

/*      exit(1); */

/*   } */

 

/* Funktionsgruppe "Benutzerdefinitionen" freischalten */

/* Beachten Sie die oben aufgeführten Hinweise! */

/*   if (!GeoDllSetunlockcode("234566543-789014545","MacroModia GmbH")) */

/*   { */

/*      printf("Fehler in GeoDllSetunlockcode\n"); */

/*      Sleep(10000); */

/*      exit(1); */

/*   } */

 

/* Funktionsgruppe "Entfernungsberechnungen" freischalten */

/* Beachten Sie die oben aufgeführten Hinweise! */

/*   if (!GeoDllSetunlockcode("345678876-890120987","MacroModia GmbH")) */

/*   { */

/*      printf("Fehler in GeoDllSetunlockcode\n"); */

/*      Sleep(10000); */

/*      exit(1); */

/*   } */

 

/* Eigenes Bezugssystem definieren */

/* Die Funktion muss nur benutzt werden, wenn ein eigenes Bezugssystem */

/* verwendet werden soll */

   if (!GeoDllSetuserrefsys(1, -661.9, 155.2, -441.3, 0.332, 0.172,

    -2.994, -8.99))

      printf("Fehler in GeoDllSetuserrefsys\n");

 

/* Eigenen Quellellipsoiden definieren */

/* Die Funktion muss nur benutzt werden, wenn ein eigenes Bezugssystem */

/* verwendet werden soll */

   if (!GeoDllSetuserellsource(1000, 6378127.0, 6356752.3))

      printf("Fehler in GeoDllSetuserellsource\n");

 

/* Eigenen Zielellipsoiden definieren */

/* Die Funktion muss nur benutzt werden, wenn ein eigenes Bezugssystem */

/* verwendet werden soll */

   if (!GeoDllSetuserelltarget(1000, 6377397.0, 6356078.0))

      printf("Fehler in GeoDllSetuserelltarget\n");

 

/* Koordinatentransformation */

/* Geographische Koordinaten nach Gauss-Krueger */

/* Beibehaltung des Bessel-Bezugssystems (PD) */

/* Dezimale Notation der Quellkoordinaten */

/* Berechnung fuer den 3. Gauss-Krueger-Meridianstreifen */

   if (!GeoDllTrans(10.2349934, 52.3188386, 1, 1, 0, &dEastValue,

    &dNorthValue, 2, 1, 0, 3))

      printf("Fehler in GeoDllTrans\n");

   else

      printf("Ergebnis: Ostwert %f  Nordwert: %f\n",dEastValue,dNorthValue);

 

/* Koordinatentransformation */

/* Geographische Koordinaten nach Gauss-Krueger */

/* Verwendung des mit GeoDllSetuserrefsys() definierten Bezugssystems */

/* Dezimale Notation der Quellkoordinaten */

/* Berechnung fuer den 3. Gauss-Krueger-Meridianstreifen */

   if (!GeoDllTrans(10.2349934, 52.3188386, 1, 1000, 0, &dEastValue,

    &dNorthValue, 2, 100, 0, 3))

      printf("Fehler in GeoDllTrans\n");

   else

      printf("Ergebnis: Ostwert %f  Nordwert: %f\n",dEastValue,dNorthValue);

 

/* Entfernungsberechnung */

/* Bessel-Ellipsoid */

/* Dezimale Notation der Koordinaten */

   if (!GeoDllDistancegeo(10.2349934, 52.3188386, 10.3216545, 52.1343436,

    &dDistance, 1))

      printf("Fehler in GeoDllDistancegeo\n");

   else

      printf("Ergebnis: Entfernung %f\n",dDistance);

 

/* Auf einen Tastendruck warten */

   Sleep(10000);

   exit(0);

}