Datentyp structure
Moderator: Moderatoren
-
- Cut&Paste-Entwickler
- Beiträge: 41
- Registriert: Do, 05. Apr 2007 12:50
- Wohnort: 26135 Oldenburg
- Kontaktdaten:
Datentyp structure
Ich habe an eine DLL (ericCreateKey.dll) einen Parameter zu übergeben, der sich als Strukturvariable aus mehreren Werten zusammensetzt. Da xbase++ diesen Typ nicht anbietet, stehe ich vor einem großen Problem.
Aufruf der dll: nCode:= EricCreateKey( cPin, cPfad, param )
cpin und cpfad sind jeweils vom Typ char
param wird vom DLL-Hersteller so deklariert mit der Anmerkung, dass alle Parameter bis einschl. beschreibung
zu initialisieren sind:
typedef struct
unsigned int version; // muss stets 1 sein
const char* name; // darf kein Leerstring sein
const char* land; // die nachfolgenden können auch Leerstring sein
const char* ort;
const char* adresse;
const char* email;
const char* organisation;
const char* abteilung;
const char* beschreibung;
Ich habe bereits die Lösung in ot4xb versucht (im Forum gefunden), da kommt leider bei Programmausführung eine Fehlermeldung an der Stelle, wo ich die Struktur erzeugen will:
BEGIN STRUCTURE _oParam
Member int 1
Member dynsz "TEST"
Member dynsz ""
usw.
END Structure
cParam:= _oParam():new() - > meldet das oParam() kein Objekt ist.
Ich hoffe, dass jemand helfen kann...
Werner
Aufruf der dll: nCode:= EricCreateKey( cPin, cPfad, param )
cpin und cpfad sind jeweils vom Typ char
param wird vom DLL-Hersteller so deklariert mit der Anmerkung, dass alle Parameter bis einschl. beschreibung
zu initialisieren sind:
typedef struct
unsigned int version; // muss stets 1 sein
const char* name; // darf kein Leerstring sein
const char* land; // die nachfolgenden können auch Leerstring sein
const char* ort;
const char* adresse;
const char* email;
const char* organisation;
const char* abteilung;
const char* beschreibung;
Ich habe bereits die Lösung in ot4xb versucht (im Forum gefunden), da kommt leider bei Programmausführung eine Fehlermeldung an der Stelle, wo ich die Struktur erzeugen will:
BEGIN STRUCTURE _oParam
Member int 1
Member dynsz "TEST"
Member dynsz ""
usw.
END Structure
cParam:= _oParam():new() - > meldet das oParam() kein Objekt ist.
Ich hoffe, dass jemand helfen kann...
Werner
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Datentyp structure
das können nur POINTER sein, flexibellange Texte sind als Parameter ohne Längenangabe nicht möglich.
POINTER auf Texte sind aber eindeutig in der Länge.
POINTER auf Texte sind aber eindeutig in der Länge.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Datentyp structure
Hi,
wenn es so nicht funktioniert, solltest du das in Pablos Forum fragen, die TYPEN die du gewählt hast passen fast, aber die Syntax stimmt nicht.
Du gibst WERTE statt Variablennamen an, aber wie das bei dem speziellen ist bin ich mir auch nicht sicher ...
im anderen Beispiel steht wie man es verwendet ...
wenn es so nicht funktioniert, solltest du das in Pablos Forum fragen, die TYPEN die du gewählt hast passen fast, aber die Syntax stimmt nicht.
Du gibst WERTE statt Variablennamen an, aber wie das bei dem speziellen ist bin ich mir auch nicht sicher ...
Code: Alles auswählen
BEGIN STRUCTURE StruDLL // oStru ist der Name
MEMBER WORD Version // unsigned INT 16 Bit, eventuell brauchst du aber auch ein DWORD 32 Bit ...
MEMBER DYNSZ Name
MEMBER DYNSZ Land
MEMBER DYNSZ Ort
MEMBER DYNSZ Adresse
MEMBER DYNSZ Email
MEMBER DYNSZ Organisation
MEMBER DYNSZ Abteilung
MEMBER DYNSZ Beschreibung
END STRUCTURE
Code: Alles auswählen
local oStru := StruDLL():New()
' nun muss man wohl die Werte setzen, die man bzw. die DLL braucht
oStru:Version = 1
oStru:Name = "Testname"
oStru:Land = "Deutschland"
etc.
Gruß
Hubert
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 41
- Registriert: Do, 05. Apr 2007 12:50
- Wohnort: 26135 Oldenburg
- Kontaktdaten:
Re: Datentyp structure
Hallo Hubert,
vielen Dank für die Hilfestellung. Ich habe den vorgeschlagenen Weg, wie folgt aufgeführt, in das Programm umgesetzt. Programmausführung bewirkt auch die Erstellung von oStru, der dann folgende Aufruf der dll erzeugt dann allerdings noch den Fehler:
Beschreibung: Parameter hat falschen Typ
Operation in dllExecuteCall
Aufgerufen von ericcreatekey(6834) (über den Quellcode verfüge ich nicht)
Programmiert habe ich:
beginn structure struDLL
member word version //alternativ dword und int versucht; keine Änderung der o.g. Fehlermeldung
member dynsz name
member dynsz land
member dynsz ort
member dynsz adresse
member dynsz email
member dynsz organisation
member dynsz abteilung
member dynsz beschreibung
end structure
cpin:= "Test1"
cKeypath:= "c:\fibu801\PSE"
oStru:= StruDLL():New()
oStru:Version:= 1
oStru:Name:= "Testname"
oStru:Land:= "DE"
oStru:Ort:= "Ort"
oStru:Adresse:= "Strasse"
oStru= "info@dbfibu.de"
oStru:organisation:= "orga"
oStru:Abteilung:= "abteilung"
oStru:Beschreibung:= "text"
elsterRC:= EricCreateKey(cPin,cKeyPath,oStru)
DLLFUNCTION EricCreateKey(cPin,cKeyPath,param) using stdcall from ericapi.dll
Der Hersteller beschreibt den Parameter param wie folgt:
Struktur mit Informationen zur Erzeugung von Zertifikaten mit ericcreatekey.
Die Elemente der Struktur beschreiben den Anwender, für den ein Schlüssel erstellt werden soll. Unbenutzte Parameter müssen mit NULL oder Leerstring initialisiert werden.
Diese Struktur und ihre Elemente sind vom Anwender zu allokieren und samt Inhalt auch wieder freizugeben.
vor dem Aufruf der dll habe ich einmal mit valtype ostru abgefragt und erhalte den Typ "O" (Objekt) zurück.
Ist es denn richtig, ein Objekt für param an ericcreatekey zu übergeben? Erwartet ericcreatekey diesen Datentyp?
Vielleicht kannst du hier noch einmal weiterhelfen.....
Werner
vielen Dank für die Hilfestellung. Ich habe den vorgeschlagenen Weg, wie folgt aufgeführt, in das Programm umgesetzt. Programmausführung bewirkt auch die Erstellung von oStru, der dann folgende Aufruf der dll erzeugt dann allerdings noch den Fehler:
Beschreibung: Parameter hat falschen Typ
Operation in dllExecuteCall
Aufgerufen von ericcreatekey(6834) (über den Quellcode verfüge ich nicht)
Programmiert habe ich:
beginn structure struDLL
member word version //alternativ dword und int versucht; keine Änderung der o.g. Fehlermeldung
member dynsz name
member dynsz land
member dynsz ort
member dynsz adresse
member dynsz email
member dynsz organisation
member dynsz abteilung
member dynsz beschreibung
end structure
cpin:= "Test1"
cKeypath:= "c:\fibu801\PSE"
oStru:= StruDLL():New()
oStru:Version:= 1
oStru:Name:= "Testname"
oStru:Land:= "DE"
oStru:Ort:= "Ort"
oStru:Adresse:= "Strasse"
oStru= "info@dbfibu.de"
oStru:organisation:= "orga"
oStru:Abteilung:= "abteilung"
oStru:Beschreibung:= "text"
elsterRC:= EricCreateKey(cPin,cKeyPath,oStru)
DLLFUNCTION EricCreateKey(cPin,cKeyPath,param) using stdcall from ericapi.dll
Der Hersteller beschreibt den Parameter param wie folgt:
Struktur mit Informationen zur Erzeugung von Zertifikaten mit ericcreatekey.
Die Elemente der Struktur beschreiben den Anwender, für den ein Schlüssel erstellt werden soll. Unbenutzte Parameter müssen mit NULL oder Leerstring initialisiert werden.
Diese Struktur und ihre Elemente sind vom Anwender zu allokieren und samt Inhalt auch wieder freizugeben.
vor dem Aufruf der dll habe ich einmal mit valtype ostru abgefragt und erhalte den Typ "O" (Objekt) zurück.
Ist es denn richtig, ein Objekt für param an ericcreatekey zu übergeben? Erwartet ericcreatekey diesen Datentyp?
Vielleicht kannst du hier noch einmal weiterhelfen.....
Werner
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Datentyp structure
Ein Objekt ist ein logischer Ausdruck der Programmiersprache Xbase++ oder ähnlicher.
Von C aus ist das nichts weiter als ein Speicherbereich.
Ich selbst habe damit keine Erfahrungen, du solltest die Frage mit Beispielcode im Forum von Pablo posten, er ist sehr hilfsbereit.
Ich habe leider keine Ahnung ob es so richtig ist.
Von C aus ist das nichts weiter als ein Speicherbereich.
Ich selbst habe damit keine Erfahrungen, du solltest die Frage mit Beispielcode im Forum von Pablo posten, er ist sehr hilfsbereit.
Ich habe leider keine Ahnung ob es so richtig ist.
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Datentyp structure
deine STRUCTUR sieht schon ganz gut aus aber Xbase++ DLLFUNCTION kennt keine STRUCTURE.WernerSt hat geschrieben:Operation in dllExecuteCall
Aufgerufen von ericcreatekey(6834) (über den Quellcode verfüge ich nicht)
du müsstet die ot4xb Syntax benutzen
Code: Alles auswählen
@ERICAPI.Methode(parameter)
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Datentyp structure
man darf natürlich nicht die include vergessen, und dann kann man Pablos Kurzschreibweise nutzen, oder aber die Funktionale.
Wichtig, alle Parameter müssen nach der Verwendung explizit auf NIL gesetzt werden, bevor die Funktion verlassen wird, sonst wird der Speicher nicht freigegeben.
Pablo nutzt diese Anweisung um die Schreibweise einfacher zu machen, man kann aber auch die Funktion direkt verwenden. Um STDCALL etc. braucht man sich aber nicht kümmern.
Also ...
Wichtig, alle Parameter müssen nach der Verwendung explizit auf NIL gesetzt werden, bevor die Funktion verlassen wird, sonst wird der Speicher nicht freigegeben.
Pablo nutzt diese Anweisung um die Schreibweise einfacher zu machen, man kann aber auch die Funktion direkt verwenden. Um STDCALL etc. braucht man sich aber nicht kümmern.
Code: Alles auswählen
#xtranslate @<dll>:<fn>([<p1>] [,<pn>] ) => nFpCall( {<(dll)>,<(fn)>} [,<p1>] [,<pn>] )
Code: Alles auswählen
#include "ot4xb.ch"
... Definition wie oben
@ericCreateKey:EricCreateKey(cPin,cKeyPath,oStru) // heißt die Funktion wie die DLL ?
oder funktional, mit der Möglichkeit direkt DLL Ladefehler zu erkennen.
nDLL := dllLoad("ericCreateKey.dll")
if empty(nDLL)
=> Fehler
else
... oStru ... und andere Parameter füllen
elsterRC := nFpCall( { nDLL, "EricCreateKey" } , cPin, cKeyPath, oStru )
... oStru ... auswerten
oStru:Version := nil // bei diesem Typ wahrscheinlich unnötig
oStru:Name := nil
oStru:Land := nil
oStru:Ort := nil
oStru:Adresse := nil
oStru:Email := nil
oStru:Organisation := nil
oStru:Abteilung := nil
oStru:Beschreibung := nil
endif
Return
Gruß
Hubert
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 41
- Registriert: Do, 05. Apr 2007 12:50
- Wohnort: 26135 Oldenburg
- Kontaktdaten:
Re: Datentyp structure
Hallo Hubert und Jimmy,
ich habe inzwischen auch Hilfe von Pablo bekommen; es lag wirklich nur noch daran, dass die dllfunction von Alaska keine Structure kennt. Nach Einsatz der ot4xb-Syntax lief tatsächlich die ericCreateKey-dll und erstellte ein Zertifikat (für den elektronischen Versand der Umsatzsteuervoranmeldung an das Finanzamt). Ich bedanke mich recht herzlich für eure Hilfestellung! Gut, dass wir dieses xbase-Forum haben!
Werner
ich habe inzwischen auch Hilfe von Pablo bekommen; es lag wirklich nur noch daran, dass die dllfunction von Alaska keine Structure kennt. Nach Einsatz der ot4xb-Syntax lief tatsächlich die ericCreateKey-dll und erstellte ein Zertifikat (für den elektronischen Versand der Umsatzsteuervoranmeldung an das Finanzamt). Ich bedanke mich recht herzlich für eure Hilfestellung! Gut, dass wir dieses xbase-Forum haben!
Werner