Einzelnen Beitrag anzeigen

sneumann
(Gast)

n/a Beiträge
 
#4

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 12:31
Die Init-Funktion ist so definiert:
Code:
int _VI_FUNC bp4422_init(int ,int,double,int,int,int,char*,int,int *);
Also ist es kein var instrumentIDString: PChar sondern nur instrumentIDString: PChar , den du imho nicht initialisieren musst.
Das gleiche Problem hast du beim letzten Parameter: da reicht ein var instrumentID : Integer
Durch das var wird der Parameter automatisch als Pointer übergeben.
Dankeschön jetzt hat es funktioniert!!
So Folgendes jetzt möchte ich einen (z.Beispiel 20.5° C) Wert auslesen dazu benutze ich die Funktionenen bp4422_start_measure (klappt auch mit der instid alles), bp4422_read_measure_string (funzt aber problem mit dem zurück geben des Value Werts(das ist der Temp wert)), und zum stoppen bp4422_stop_measure (funzt auch) , danach dann close Com (funzt auch)

deklaration der Funktionen:
Delphi-Quellcode:
function bp4422_init(COMPort: integer; baudRate: integer; timeout_seconds: double; blockCheck: integer;
groupAddress: integer; userAddress: integer; var instrumentIDString: Char; resetDevice: integer;
var instrumentID: integer): integer; stdcall; external DLLNAME; // Init: habe ich jetzt verändert, so wie du meinstest nur das var sozusagen gelassen bei den pointern
function bp4422_start_measure(instrumentID: integer; typek: integer): integer; stdcall; external DLLNAME; // START Messen
function bp4422_read_measure_string(instrumentID: integer; var value: char): integer; stdcall; external DLLNAME; // Lese Temp - Wert aus
function bp4422_stop_measure(instrumentID: integer): integer; stdcall; external DLLNAME;stdcall; external DLLNAME; // STOP Messen
function bp4422_close(instrumentID: integer): integer; stdcall; external DLLNAME; //zum Schließen des Ports
Aufruf:
Delphi-Quellcode:
procedure Tfrm_c4SU.Button9Click(Sender: TObject);
var
   error: integer;
   instidstring: Char;
   instid: integer;
   value: char;
begin
  try
  error := bp4422_init(4,9600,2,0,0,0,instidstring,0,instid); //
  error := bp4422_start_measure(instid, 3); //instid hat den wert 1 was auch richtig ist
  error := bp4422_read_measure_string(instid, value); // value nimmt hier den Wert - an weil mein Messgerät momentan -7° liest, theoretisch ist das ja richtig weil er die erste stelle also nimmt, aber ich brauche 4-5 stellen weil er ja auch 23,5° lesen soll ect. aber in der dll ist value ja als *char angegeben. Wenn ich beides in der Deklaration der Funktion und im Aufruf hier unten auf string setze anstatt char ist der Wert Value beim debuggen nicht verfügbar (mit char steht ein - bei value) //(allerdings ändert sich hier die instid wieder auf irgendeine andere Zahl Beispiel 94516351 oder 0 deshalb das folgende instid :=1) warum die sich ändert weiss ich nicht
  ShowMessage(value);
  instid:= 1;
  error := bp4422_stop_measure(instid);
  error := bp4422_close(instid);
  except
  error := bp4422_close(instid);
  end; // HIER KOMMT IMMERNOCH DER ZUGRIFFSFEHLER nach dem ich beim debuggen hier weiterklicke

end;
in der .C datei steht die funktion read string ja so da:
int _VI_FUNC bp4422_read_measure_string(int instrID,char *value ) und in delphi wenn ich die bp4422.DLL öffne sehe ich bei parametern der funktion bp4422_read_measure_string instrID als int (in) und value als LPSTR (in,out)

Geändert von sneumann (19. Okt 2011 um 12:40 Uhr)
  Mit Zitat antworten Zitat