![]() |
dll einbinden delphi 7 beispiel zugriffsfehler
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: ![]() 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:
dann die deklarationen der exportierten funktion zum initialisieren des comport 4
const
DLLNAME = 'bp4422.dll';
Code:
dann der aufruf
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;
Code:
was mache ich falsch bekomme trotzdem zugriffsfehler beim starten
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; 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);
|
AW: dll einbinden delphi 7 beispiel zugriffsfehler
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? |
AW: dll einbinden delphi 7 beispiel zugriffsfehler
Die Init-Funktion ist so definiert:
Code:
Also ist es kein
int _VI_FUNC bp4422_init(int ,int,double,int,int,int,char*,int,int *);
Delphi-Quellcode:
sondern nur
var instrumentIDString: PChar
Delphi-Quellcode:
, den du imho nicht initialisieren musst.
instrumentIDString: PChar
Das gleiche Problem hast du beim letzten Parameter: da reicht ein
Delphi-Quellcode:
var instrumentID : Integer
Durch das
Delphi-Quellcode:
wird der Parameter automatisch als Pointer übergeben.
var
|
AW: dll einbinden delphi 7 beispiel zugriffsfehler
Zitat:
So Folgendes jetzt möchte ich einen (z.Beispiel 20.5° C) Wert auslesen dazu benutze ich die Funktionenen
Delphi-Quellcode:
(klappt auch mit der instid alles),
bp4422_start_measure
Delphi-Quellcode:
(funzt aber problem mit dem zurück geben des Value Werts(das ist der Temp wert)), und zum stoppen
bp4422_read_measure_string
Delphi-Quellcode:
(funzt auch) , danach dann close Com (funzt auch)
bp4422_stop_measure
deklaration der Funktionen:
Delphi-Quellcode:
Aufruf:
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
Delphi-Quellcode:
in der .C datei steht die funktion read string ja so da:
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;
Delphi-Quellcode:
und in delphi wenn ich die bp4422.DLL öffne sehe ich bei parametern der funktion
int _VI_FUNC bp4422_read_measure_string(int instrID,char *value )
Delphi-Quellcode:
instrID als int (in) und value als LPSTR (in,out)
bp4422_read_measure_string
|
AW: dll einbinden delphi 7 beispiel zugriffsfehler
Nimm mal bitte nicht
Delphi-Quellcode:
sondern
var blubber : Char
Delphi-Quellcode:
.
blubber : PChar
Dadurch kannste das dann fast wie einen String benutzen. |
AW: dll einbinden delphi 7 beispiel zugriffsfehler
Delphi-Quellcode:
ist zwat "vom Wortlaut" her ein Zeiger auf einen Char,
char* value
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. :wink: |
AW: dll einbinden delphi 7 beispiel zugriffsfehler
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. :) |
AW: dll einbinden delphi 7 beispiel zugriffsfehler
Zitat:
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:
ANSTATT:
instidstring: Pchar;
value: Pchar;
Delphi-Quellcode:
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!
var instidstring: Char {in der Deklaration} var instidstring: Char; {imAufruf} //das gleiche mit value
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 Zitat:
Delphi-Quellcode:
also er macht sozusagen platz für 50 zeichen für den id string bei mir
instidstring = Space(50)
und für den value der string measure methode legt er vor der funktion
Delphi-Quellcode:
frei
value = Space(20)
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' |
AW: dll einbinden delphi 7 beispiel zugriffsfehler
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))); |
AW: dll einbinden delphi 7 beispiel zugriffsfehler
Zitat:
Delphi-Quellcode:
Wenn ich Setlength mache ist wert nicht verfügbar...
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))); 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
Delphi-Quellcode:
in der anweisung und oben einfach nur
array[1..50] of char
Delphi-Quellcode:
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
array of char
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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