AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

habe DLL aber nur C++ und VB Beispiele

Ein Thema von alf.stefan · begonnen am 11. Jan 2005 · letzter Beitrag vom 12. Jan 2005
Antwort Antwort
Seite 2 von 2     12   
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#11

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

  Alt 11. Jan 2005, 20:37
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!
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#12

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

  Alt 12. Jan 2005, 08:49
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
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#13

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

  Alt 12. Jan 2005, 09:20
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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#14

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

  Alt 12. Jan 2005, 10:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von Boombuler
Boombuler

Registriert seit: 14. Mär 2003
Ort: Osnabrück
244 Beiträge
 
Delphi 2009 Professional
 
#15

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

  Alt 12. Jan 2005, 10:33
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
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#16

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

  Alt 12. Jan 2005, 10:40
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
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#17

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

  Alt 12. Jan 2005, 10:48
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#18

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

  Alt 12. Jan 2005, 12:41
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.
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#19

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

  Alt 12. Jan 2005, 13:32
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
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#20

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

  Alt 12. Jan 2005, 14:39
Hallo Stefan,

solltest du nicht weiterkommen, dann kannst du mir die VB-Deklarationen schicken. Ich helfe dir dann beim Übersetzen.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.
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