AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein dll einbinden delphi 7 beispiel zugriffsfehler
Thema durchsuchen
Ansicht
Themen-Optionen

dll einbinden delphi 7 beispiel zugriffsfehler

Ein Thema von sneumann · begonnen am 19. Okt 2011 · letzter Beitrag vom 20. Okt 2011
Antwort Antwort
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#1

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 09:37
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
sneumann
(Gast)

n/a Beiträge
 
#2

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 11: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 11:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#3

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 11:36
Nimm mal bitte nicht var blubber : Char sondern blubber : PChar .
Dadurch kannste das dann fast wie einen String benutzen.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
sneumann
(Gast)

n/a Beiträge
 
#4

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 12:38
Nimm mal bitte nicht var blubber : Char sondern blubber : PChar .
Dadurch kannste das dann fast wie einen String benutzen.
zum Vorschlag von chaosben:
wenn ich deinen Vorschlag nehme und oben beim deklarieren var weglasse und stattdessen instidstring: PChar (value: Pchar) schreibe, und unten bei den im Aufruf so schreibe
Delphi-Quellcode:
instidstring: Pchar;
value: Pchar;
ANSTATT:
var instidstring: Char {in der Deklaration} var instidstring: Char; {imAufruf} //das gleiche mit value DANN zeigt er mir beim debuggen nicht mal an 'Wert nicht verfügbar', wenn ich im debuggen dann über value oder instidstring rüber gehe zeit er mir garnix an!

Bisher habe ich ja nur geschafft den ersten Char von IDstring (der war 'B' für Burster...etc..) und
der für value (war '-' was auch richtig wäre für -7°). Das geht ja schonmal,also kann ja eig nicht viel falsch sein.
jetzt muss ich das nur noch hinkriegen dass er mir alles ausgibt als String wahrs.

zu himitsu
char* value ist zwat "vom Wortlaut" her ein Zeiger auf
phi-Version (oder Lazarus) ...... und was überhaupt möglich ist.
1. Also in dem VB6 Project, was auch funktioniert steht vorher sowas:
instidstring = Space(50) also er macht sozusagen platz für 50 zeichen für den id string bei mir
und für den value der string measure methode legt er vor der funktion
value = Space(20) frei
das muss ich wahrscheinlich bei delphi auch so vorher machen!? Meinst du das?
2.probiere das jetzt beides: einmal mit ansi char und einmal mit Pansichar für Value meinst du ? oder auch für den ID string?
Wenn sich die DLL sozusagen nicht anpassen kann weil es dort ja als char* deklariert ist sozusagen geht das dann überhaupt wenn ich hier in meinem Delphi prog dann es mit ansichar bzw Pansichar versuche

3.Habe bei mir im Profil jetzt Delphi 7 Prof hinzugefügt.


EDIT: Der immerwiederkehrende Zugriffsfehler hängt wahrscheinlich auch damit zusammen ich versuchs mal mit ansichar und pansichar


EDIT 2: Übrigens Value soll ungefähr so aussehen dann : '25,4° Cel'
und instridstring sieht ungefähr so aus 'BursterString id 12316519464 Version 12,343 , 005'

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

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#5

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 12:42
Versuch es doch mal in der Art:
Delphi-Quellcode:
var
  Blabb: AnsiString;
begin
  SetLength(Blabb, 300); //oder eine andere zu erwartende maximale Länge
  error := bp4422_read_measure_string(instid, PAnsiChar(Blabb));
  SetLength(Blabb, StrLen(PAnsiChar(Blabb)));
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
sneumann
(Gast)

n/a Beiträge
 
#6

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 20. Okt 2011, 07:50
Versuch es doch mal in der Art:
Delphi-Quellcode:
var
  Blabb: AnsiString;
begin
  SetLength(Blabb, 300); //oder eine andere zu erwartende maximale Länge
  error := bp4422_read_measure_string(instid, PAnsiChar(Blabb));
  SetLength(Blabb, StrLen(PAnsiChar(Blabb)));
also habs jetzt mal so versucht aber auch wieder Wert nicht verfügbar
Delphi-Quellcode:
var
instidstring: AnsiString;

begin
SetLength(instidstring, 3);
error := bp4422_init(4,9600,2,0,0,0,AnsiString(instidstring),0,instid);
SetLength(instidstring, StrLen(PAnsiChar(instidstring)));
Wenn ich Setlength mache ist wert nicht verfügbar...
wie muss dann die definition in der deklaration oben sein?
brauch ich die zweite setlenght erst nach der funktionsanweisung? wofür ist die zweite...

vielleicht muss ichs mal irgendiwe mit nem array of char versuchen aber habs auch schon versucht array[1..50] of char in der anweisung und oben einfach nur array of char was gibt es noch für string typen vielleicht oder array die ich ausprobieren könnte um diesen blöden pointer auf ein char array zu kriegen und den wert hinterher richtig rauszuholen

Geändert von sneumann (20. Okt 2011 um 07:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#7

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 20. Okt 2011, 09:02
Dir fällt aber schon auf, dass wir beide unterschiedliche Dinge tun?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#8

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 11:43
char* value ist zwat "vom Wortlaut" her ein Zeiger auf einen Char,
aber alleine der Funktionsname sagt dir, daß dort ein ganzer String hingehört, also ein Zeiger auf eine Reihe von Chars ... ein Char-Array.

Entweder man kann irgendwie auslesen für wieviele Chars dort Platz sein muß oder in der Dokumentation steht irgendwo geschrieben wieviele Chars es maximal sein können.
Dementsprechend mußt du ein genügend großes Array (oder einen Zeiger auf einen String-Anfang) übergeben.

PS: Statt Char/PChar besser AnsiChar und PAnsiChar verwenden, denn ab Delphi 2009 ist Char = Unicode, aber die Deklaration der DLL wird sich nicht dementsprechend "anpassen" ... dort bleibt es also auch weiterhin ANSI.

PSS: Im Foren-Profil kann man seine Delphi-Version (oder Lazarus) angeben, damit man gleich weiß auf was mach achten muß und was überhaupt möglich ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#9

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 12:01
Warum soll er Speicher für den Parameter belegen? Das ist doch ein Eingabeparameter.

//edit:
Nagut: Bei bp4422_read_measure_string sollte man schon wissen, wieviel die Lib maximal reinschreibt. Da hat Himi recht.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)

Geändert von chaosben (19. Okt 2011 um 12:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:02 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