![]() |
Re: habe DLL aber nur C++ und VB Beispiele
Zitat:
Nun, ich hab bisher leider nur mit hardwareabstrahierter Programmierung auf PCs Erfahrung und leider nicht mit µCs :? Aber OK; jetzt wirklich zurück zum Thema! |
Re: habe DLL aber nur C++ und VB Beispiele
Ich hab da immer noch meine Probleme!
Mach ich die Initialisierung richtig?
Code:
Beim Compilieren kommt kein Fehler zurückvar nBuff : array of PChar; ipBuff : array of PChar; SerStrBuff : array of PChar; DipArrayBuff : array of PUint16; name : Array[0..MAX_TCP_NM_LENGTH] of pChar; ip: Array[0..MAX_TCP_IP_LENGTH] of pChar; ser: Array[0..MAX_TCP_SN_LENGTH] of pChar; ppName, ppIp, ppSer : pPchar; begin err := KMInitialize; NumDevices :=0; refresh := KMTCPRefreshDevices(); getNum := KMTCPGetNumDevices(@NumDevices); SetLength(nBuff, NumDevices); SetLength(ipBuff, NumDevices); SetLength(serStrBuff, NumDevices); SetLength(DipArrayBuff, NumDevices); for lLoop := 0 to NumDevices-1 do begin for c:= 0 to MAX_TCP_NM_LENGTH do name[c] := new(pChar); nBuff[lLoop] := name[0]; for c:= 0 to MAX_TCP_IP_LENGTH do ip[c] := new(pChar); ipBuff[lLoop] := ip[0]; for c:= 0 to MAX_TCP_SN_LENGTH do ser[c] := new(pChar); serStrBuff[lLoop] := ser[0]; DipArrayBuff[lLoop] := new(PUint16); end; ppName := @nBuff[0]; ppIp := @ipBuff[0]; ppSer := @serStrBuff[0]; if getNum = 0 then begin err := KMTCPGetDeviceInformation(ppName, ppIp, ppSer, DipArrayBuff[0], NumDevices); end; Beim debugen ist mir aber aufgefallen, daß in nBuff[0] keine Adresse steht! Obwohl es da eigentlich eine Geben müßte. Wieder ratloser Gruß Stefan |
Re: habe DLL aber nur C++ und VB Beispiele
Und es geht doch. Ich war schon ganz dicht an der Lösung.
Mein Fehler war ein var in der Funktions deklaration.
Code:
ohne das var gings dann plötzlich!
Function KMTCPGetDeviceInformation(var lpszNameArray,lpszAddressArray,lpszSNArray: PPChar ;DIPArray: PUInt16 ;nNumDevices :long): KMErrorCode; cdecl; external 'KmApi32.DLL';
Danke an alle Beteiligten Erleichterter Gruß Stefan |
Re: habe DLL aber nur C++ und VB Beispiele
Das "var" hatte ich auch nicht geschrieben.
Die Initialisierungen sind noch Murks. Schmeiss alles was sich auf array of bezieht weg. Also nBuff, die lLoop-Schleife und die SetLength Aufrufe. Offensichtlich liefert die Funktion in name usw PChars ab. ppName usw wird auch nicht gebraucht. Direkt @name[0] usw als Parameter benutzen. Die Funktion braucht ein array von PChar's, die auch wirklich im Speicher vorhanden sind. "name" und Konsorten erfuellt das, denn das Array ist auf dem Stack vorhanden. Die Deklaration von KMTCPGetNumDevices mit "var" statt Zeiger umschreiben, dann kann man KMTCPGetNumDevices(NumDevices); benutzen. |
Re: habe DLL aber nur C++ und VB Beispiele
kurze Frage am Rande:
PChar = Pointer auf Char PPChar = Pointer auf PChar = Pointer auf Pointer auf Char??? Hat das n speziellen grund das ihr das so macht? Greetz Boombuler |
Re: habe DLL aber nur C++ und VB Beispiele
Vielleicht ist es Murks aber es funktioniert.
Zitat:
aber was ich nicht verstehe ist @name[0] ist doch der Zeiger auf nur einen Namen. Was ist wenn ich mehrere devices habe NumDevices>1 ? Deshalb habe ich das mit den dynamischen arrays ja so gemacht, daß NumDevices variabel sein kann. Brauche ich dann nicht genau soviel Pointer auf die unterscheidlichen name[lLoop] wie es devices gibt? enspricht das dann nicht so in etwa dem was auch in C++ gemacht wurde
Code:
oder wie sollte ich das namens array (also nicht name[0]..) anders initialisieren.
/* serial numbers, and IP addresses */
char **NameArray= new char*[NumberDevices]; char **IPArray = new char*[NumberDevices]; char **SNArray = new char*[NumberDevices]; UINT16 *DIPArray = new UINT16[NumberDevices]; for(int j=0;j<NumberDevices;j++) { NameArray[j]=new char[MAX_TCP_NM_LENGTH]; IPArray[j]=new char[MAX_TCP_IP_LENGTH]; SNArray[j]=new char[MAX_TCP_SN_LENGTH];
Code:
das ist natürlich murks und müll, das hab ich auch gleich selbst gelöscht und dann
ppName := @nBuff[0];
ppIp := @ipBuff[0]; ppSer := @serStrBuff[0];
Code:
direkt aufgerufen.
KMTCPGetDeviceInformation(@nBuff[0], @ipBuff[0], @serStrBuff[0], DipArrayBuff[0], NumDevices);
Verwirrter Gruß Stefan |
Re: habe DLL aber nur C++ und VB Beispiele
ja das hat es. C++ ruft das halt auch so auf.
Musst Dir mal bei meiner 1. Frage den C++ code anschauen wie da vor dem Funtionsauruf die arrays initialisiert werden.
Code:
und das muß in Delphi dann halt auch so ähnlich genacht werden damit man die Funktion benutzen kann.
char **NameArray= new char*[NumberDevices];
char **IPArray = new char*[NumberDevices]; char **SNArray = new char*[NumberDevices]; Aber der Oberblicker bin ich da auch nicht. |
Re: habe DLL aber nur C++ und VB Beispiele
Die C Deklaration lautet "char *name[]". Das ist praktisch das selbe wie "char **name".
Die feinen Unterschiede wollen wir hier nicht waelzen. Also lautet die Pascal Deklaration korrekt PPChar eben ein Zeiger auf einen Zeiger auf Char. C kennt nur call by value. Call by reference wird genau durch "Zeiger auf" repraesentiert. Das ist das was Pascal bei var-Parametern auch macht. Ueblicherweise gilt bei der Uebergabe eines Arrays in C das der Zeiger auf das erste Element des Arrays uebergeben wird. Die Groesse des Arrays muss in einem gesonderten Parameter uebergeben werden. Alternativ wird der letzte Zeiger des Arrays auf nil gesetzt um das Ende anzuzeigen. "char *name[]" ist also ein Array von PChars. |
Re: habe DLL aber nur C++ und VB Beispiele
das ist ja alles schön und gut und richtig. Aber wie soll ich denn dann
"char *name[]" initialisieren wenn nicht so wie ich es gemacht habe. Möglich, daß ich mich auch bloss blöd anstelle aber ich hab keine Ahnung wie ich es anders machen könnte. Aber es ist auch möglich, daß ich dadurch wie ich es gemacht habe mein nächstes Problem erzeugt habe, nämlich wie im Thread "immer noch Stress mit DLL Aufruf" beschrieben der Absturz beim Zugreifen auf meine eingelesenen PPChar arrays. Immer noch einigermassen ratloser Gruß Stefan |
Re: habe DLL aber nur C++ und VB Beispiele
Hallo Stefan,
solltest du nicht weiterkommen, dann kannst du mir die VB-Deklarationen schicken. Ich helfe dir dann beim Übersetzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz