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); }
|