Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi habe DLL aber nur C++ und VB Beispiele (https://www.delphipraxis.net/37843-habe-dll-aber-nur-c-und-vbulletin-beispiele.html)

Chewie 11. Jan 2005 19:37

Re: habe DLL aber nur C++ und VB Beispiele
 
Zitat:

Zitat von Robert Marquardt
Hochachtung!
Brauchen kann man das natuerlich. Wie waere es mit einer Interrupt Tabelle in einem Mikrocontroller?

Danke ;)
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!

alf.stefan 12. Jan 2005 07:49

Re: habe DLL aber nur C++ und VB Beispiele
 
Ich hab da immer noch meine Probleme!
Mach ich die Initialisierung richtig?

Code:
 
var
  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 Compilieren kommt kein Fehler zurück
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

alf.stefan 12. Jan 2005 08:20

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:
     Function KMTCPGetDeviceInformation(var lpszNameArray,lpszAddressArray,lpszSNArray: PPChar ;DIPArray: PUInt16 ;nNumDevices :long): KMErrorCode; cdecl; external 'KmApi32.DLL';
ohne das var gings dann plötzlich!

Danke an alle Beteiligten

Erleichterter Gruß

Stefan

Robert Marquardt 12. Jan 2005 09:02

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.

Boombuler 12. Jan 2005 09:33

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

alf.stefan 12. Jan 2005 09:40

Re: habe DLL aber nur C++ und VB Beispiele
 
Vielleicht ist es Murks aber es funktioniert.

Zitat:

Die Deklaration von KMTCPGetNumDevices mit "var" statt Zeiger umschreiben, dann kann man
KMTCPGetNumDevices(NumDevices);
benutzen.
das geht klar und funktioniert wunderbar

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:
/* 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];
oder wie sollte ich das namens array (also nicht name[0]..) anders initialisieren.

Code:
   ppName := @nBuff[0];
   ppIp := @ipBuff[0];
   ppSer := @serStrBuff[0];
das ist natürlich murks und müll, das hab ich auch gleich selbst gelöscht und dann
Code:
KMTCPGetDeviceInformation(@nBuff[0], @ipBuff[0], @serStrBuff[0], DipArrayBuff[0], NumDevices);
direkt aufgerufen.

Verwirrter Gruß

Stefan

alf.stefan 12. Jan 2005 09:48

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:
char **NameArray= new char*[NumberDevices];
char **IPArray = new char*[NumberDevices];
char **SNArray = new char*[NumberDevices];
und das muß in Delphi dann halt auch so ähnlich genacht werden damit man die Funktion benutzen kann.
Aber der Oberblicker bin ich da auch nicht.

Robert Marquardt 12. Jan 2005 11:41

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.

alf.stefan 12. Jan 2005 12:32

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

Sprint 12. Jan 2005 13:39

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 10:59 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz