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