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
Seite 1 von 2  1 2      
sneumann
(Gast)

n/a Beiträge
 
#1

dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 09:41
Ich habe mir jetzt schon einiges hier durchgelesen über DLLs in Delphi einbinden, ich habe es auch schon teilweise hinbekommen, dass die Funktionien funktioniert haben , habe trotzdem immer einen Zugriffsfehler bekommen beim Starten obwohl die funktionen funktioniert haben.
Benutze Delphi 7 und will eine dll einbinden die aus einem VB6 Project stammt.
zu finden ist das project unter:

http://burster.de/de/products/servic.../Thailand.html
Dort ist das Beispiel prog VB_Sample_4422.zip zum download und die dll befindet sich in der BP4422_V.1.6zip für LabWindows/CVI -, LabView - und Win32-Treiber V1.6

Ich habe die dll so eingebunden gehabt:
oben im interface
Code:
const
DLLNAME = 'bp4422.dll';
dann die deklarationen der exportierten funktion zum initialisieren des comport 4
Code:
function bp4422_init(COMPort: integer; baudRate: integer; timeout_seconds: double; blockCheck: integer; groupAddress: integer; userAddress: integer; var instrumentIDString: PChar; resetDevice: integer; var instrumentID: Pinteger): integer; stdcall; external DLLNAME;
dann der aufruf
Code:
procedure Tfrm_c4SU.Button9Click(Sender: TObject);
var
error: integer;
instidstring: PChar;
instid: Pinteger;
error := bp4422_init(4,9600,2,0,0,0,instidstring,0,instid);
ShowMessage('error = ' + IntToStr(error));
end;
was mache ich falsch bekomme trotzdem zugriffsfehler beim starten

Muss ich bei Delphi die dll noch verweisen?? habe sie als suchpfad und für den debugger angegeben. Noch irgendwo verweisen? bei Vb6 kann man sie einfach verweisen und dann funktioniert das schon wie ist das bei delphi genau? was vergesse ich?!
benutze ich die falsche aufrufkonvention ??
eventuell falsche parameter?




Die funktion scheint zu funktionieren da er mir als error eine 0 liefert am ende. (in der dokumentation der dll steht bei error = 0 success) ,aber trotzdem der zugriffsfehler am ende

EDIT: instidstring und instidname müssten eigentlich was zurück bekommen das tut instidstring jedoch nicht, beim steppen im debugger steht bei instdit jetzt $1,was scheinbar auch richtig so ist und bei instidstring steht nix

EDIT2: muss ich vorher vielliecht sowas aehnliches schreiben?
Code:
instidstring := StringOfChar(' ', 50);

Geändert von sneumann (19. Okt 2011 um 09:55 Uhr)
  Mit Zitat antworten Zitat
sneumann
(Gast)

n/a Beiträge
 
#2

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 10:02
Ich habe jetzt instidstring mal als Char deklariert jetzt liefert es mir was zurück! ein B wahrsccheinlich ist das LPSTR aus der dll = ein Char?! ich dachte vorher das LPSTR wäre ein String Pointer bzw ein PChar.

So jetzt liefert beides etwas zurück das geht aber der zugriffsfehler kommt trotzdem !!

warum?
  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, 10: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
 
#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
Benutzerbild von chaosben
chaosben

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

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 12: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
Benutzerbild von himitsu
himitsu

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

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 12: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

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

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 13: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 13:05 Uhr)
  Mit Zitat antworten Zitat
sneumann
(Gast)

n/a Beiträge
 
#8

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 13: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 13:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 19. Okt 2011, 13: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
 
#10

AW: dll einbinden delphi 7 beispiel zugriffsfehler

  Alt 20. Okt 2011, 08: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 08:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04: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