Datentyp structure

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
WernerSt
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 41
Registriert: Do, 05. Apr 2007 12:50
Wohnort: 26135 Oldenburg
Kontaktdaten:

Datentyp structure

Beitrag von WernerSt »

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Datentyp structure

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Datentyp structure

Beitrag von brandelh »

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 ...

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
im anderen Beispiel steht wie man es verwendet ...

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
WernerSt
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 41
Registriert: Do, 05. Apr 2007 12:50
Wohnort: 26135 Oldenburg
Kontaktdaten:

Re: Datentyp structure

Beitrag von WernerSt »

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:email:= "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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Datentyp structure

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

WernerSt hat geschrieben:Operation in dllExecuteCall
Aufgerufen von ericcreatekey(6834) (über den Quellcode verfüge ich nicht)
deine STRUCTUR sieht schon ganz gut aus aber Xbase++ DLLFUNCTION kennt keine STRUCTURE.
du müsstet die ot4xb Syntax benutzen

Code: Alles auswählen

@ERICAPI.Methode(parameter)
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Datentyp structure

Beitrag von brandelh »

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.

Code: Alles auswählen

#xtranslate @<dll>:<fn>([<p1>] [,<pn>] ) => nFpCall( {<(dll)>,<(fn)>} [,<p1>] [,<pn>] )
Also ...

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
WernerSt
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 41
Registriert: Do, 05. Apr 2007 12:50
Wohnort: 26135 Oldenburg
Kontaktdaten:

Re: Datentyp structure

Beitrag von WernerSt »

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
Antworten