deutschsprachige FoxPro User Group
Forum View
Home
  
  Eric-Funktion mit Strukturreferenz- #15849 in section [733998]
Sec: (51) MS-Visual FoxPro 9.0
Von: Bernhard Sander
An: Volkmar Höhn
Am/Um: 29.05.2012 12:22:07 gelesen

Hallo Volkmar,


 

also ich bin einen kleinen Schritt weiter gekommen.
Ich habe in die struct-Funktion getcMembers folgendes eingefügt:

pHandle = 1
cPIN = "xxxxxx"
this.cMembers = "l:pHandle, c6:cPIN"

Damit wird nun ein Objekt oPara zurückgegeben:
oPara = CREATEOBJECT("struct")




Bei mir sieht eine Strukturdefinition beispielsweise so aus:
(evtl. musst Du den Umbruch korrigieren!)
wichtig: GetCMembers soll einen String zurückliefern, daher das
RETURN DoDefault()
Die Vorbelegung der Elemente geschieht in der Klassendefinition. Das sollte m.E. auch dort bleiben, damit ein zwischenzeitlicher (interner) Aufruf von GetCMembers keine Werte ändert, die anderweitig in die Elemente eingetragen worden waren.

DEFINE CLASS PROCESS_INFORMATION AS struct OF struct\struct.vcx

** typedef struct _PROCESS_INFORMATION {
** HANDLE hProcess;
** HANDLE hThread;
** DWORD dwProcessId;
** DWORD dwThreadId;
** } PROCESS_INFORMATION,

cMembers = ""
hProcess = 0
hThread = 0
dwProcessId = 0
dwThreadId = 0

PROCEDURE GetCMembers
TEXT TO this.cMembers NOSHOW FLAGS 1 PRETEXT 15
HANDLE l:hProcess,
HANDLE l:hThread,
DWORD l:dwProcessId,
DWORD l:dwThreadId
ENDTEXT

RETURN DoDefault()

ENDPROC && GetCMembers

ENDDEFINE && PROCESS_INFORMATION



 

Wenn ich allerdings die Eric-API aufrufe, kommt der Fehler "Datentyp stimmt nicht überein."

DECLARE long EricGetPublicKey IN ericapi.dll string oPara, integer @ pPuffer, integer nBufferlen
rcEricKey = EricGetPublicKey(oPara, @pPuffer, nBufferlen)

Leider sagt mir FoxPro nicht, bei welchem Parameter der Datentyp nicht stimmt, aber ich vermute, dass es doch an oPara liegt.





Die Anwendung von obiger Struktur sieht dann so aus (auf die wesentlichen Zeilen gekürzt):

DECLARE BOOL CreateProcess IN WIN32API ;
STRING lpApplicationName, STRING lpCommandLine, ;
STRING lpProcessAttributes, STRING lpThreadAttributes, ;
INTEGER bInheritHandles, LONG dwCreationFlags, ;
STRING lpEnvironment, STRING lpCurrentDirectory, ;
STRING @lpStartupInfo, STRING @lpProcessInformation

loPI = NewObject("PROCESS_INFORMATION", "winapistruct.prg")
lcPI = loPI.GetString()
lnOk = CreateProcess(0, m.tcBefehl, 0, 0, 1, 0, 0, 0, @m.lcSI, @m.lcPI)
loPI.SetString(m.lcPI)
this.hKindProzess = m.loPI.hProcess

Der Parameter lpProcessInformation von CreateProcess ist im WinApi-Original als Pointer auf eine ProcessInformation-Struktur definiert (PROCESS_INFORMATION *). Im Zusammenhang mit Struct wird die Datenstruktur als ein Pointer auf einen String realisiert und die Daten mit GetString()/SetString() zwischen dem tatsächlichen Parameter und der Struct-Struktur umgeschaufelt.


Wenn ich über den Tread drüberschau, fällt mir noch folgendes auf:
 

DECLARE long EricGetPublicKey IN ericapi.dll string oPara, integer @ pPuffer, integer nBufferlen


sollte m.E. heißen:

DECLARE long EricGetPublicKey IN ericapi.dll string @oPara, string @ pPuffer, integer nBufferlen
(bei dem @ vor oPara bin ich mir nicht sicher)
und dann:

loEricKey = CreateObject("EricKey")
loEricKey = hToken && mit EricGetHandleToCertificate erfolgreich erstellt
loEricKey.PIN = 'xxxxxx'
lcPara = loEricKey.GetString()
lnBufferlen = 20000
lpPuffer = Replicate(chr(0), lnBufferlen)
rcEricKey = EricGetPublicKey(lcPara, @lpPuffer, lnBufferlen)

HTH.

Gruß
Bernhard Sander




Volkmar Höhn   22.02.2012 12:00
Christof Wollenhaupt  13.03.2012 11:14
Volkmar Höhn  13.03.2012 18:35
Volkmar Höhn  21.05.2012 12:04
Bernhard Sander  21.05.2012 14:16
Volkmar Höhn  22.05.2012 12:10
Bernhard Sander  22.05.2012 13:46
Volkmar Höhn  27.05.2012 12:30
Bernhard Sander  29.05.2012 12:22
Volkmar Höhn  29.05.2012 19:44
Bernhard Sander  30.05.2012 12:36
Volkmar Höhn  04.06.2012 17:01
Bernhard Sander  04.06.2012 19:06
Volkmar Höhn  12.06.2012 21:59
Bernhard Sander  13.06.2012 10:16
Volkmar Höhn  26.06.2012 15:18
Bernhard Sander  27.06.2012 11:04
Volkmar Höhn  11.07.2012 21:37
  
zurück zum Forum