Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   dll einbinden delphi 7 beispiel zugriffsfehler (https://www.delphipraxis.net/163857-dll-einbinden-delphi-7-beispiel-zugriffsfehler.html)

sneumann 19. Okt 2011 08:41

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:

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);

sneumann 19. Okt 2011 09:02

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?

chaosben 19. Okt 2011 09:37

AW: dll einbinden delphi 7 beispiel zugriffsfehler
 
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
Delphi-Quellcode:
var instrumentIDString: PChar
sondern nur
Delphi-Quellcode:
instrumentIDString: PChar
, den du imho nicht initialisieren musst.
Das gleiche Problem hast du beim letzten Parameter: da reicht ein
Delphi-Quellcode:
var instrumentID : Integer

Durch das
Delphi-Quellcode:
var
wird der Parameter automatisch als Pointer übergeben.

sneumann 19. Okt 2011 11:31

AW: dll einbinden delphi 7 beispiel zugriffsfehler
 
Zitat:

Zitat von chaosben (Beitrag 1131208)
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
Delphi-Quellcode:
var instrumentIDString: PChar
sondern nur
Delphi-Quellcode:
instrumentIDString: PChar
, den du imho nicht initialisieren musst.
Das gleiche Problem hast du beim letzten Parameter: da reicht ein
Delphi-Quellcode:
var instrumentID : Integer

Durch das
Delphi-Quellcode:
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
Delphi-Quellcode:
bp4422_start_measure
(klappt auch mit der instid alles),
Delphi-Quellcode:
bp4422_read_measure_string
(funzt aber problem mit dem zurück geben des Value Werts(das ist der Temp wert)), und zum stoppen
Delphi-Quellcode:
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:
Delphi-Quellcode:
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
Delphi-Quellcode:
bp4422_read_measure_string
instrID als int (in) und value als LPSTR (in,out)

chaosben 19. Okt 2011 11:36

AW: dll einbinden delphi 7 beispiel zugriffsfehler
 
Nimm mal bitte nicht
Delphi-Quellcode:
var blubber : Char
sondern
Delphi-Quellcode:
blubber : PChar
.
Dadurch kannste das dann fast wie einen String benutzen.

himitsu 19. Okt 2011 11:43

AW: dll einbinden delphi 7 beispiel zugriffsfehler
 
Delphi-Quellcode:
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. :wink:

chaosben 19. Okt 2011 12:01

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. :)

sneumann 19. Okt 2011 12:38

AW: dll einbinden delphi 7 beispiel zugriffsfehler
 
Zitat:

Zitat von chaosben (Beitrag 1131236)
Nimm mal bitte nicht
Delphi-Quellcode:
var blubber : Char
sondern
Delphi-Quellcode:
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:
Delphi-Quellcode:
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
Zitat:

Zitat von himitsu (Beitrag 1131237)
Delphi-Quellcode:
char* value
ist zwat "vom Wortlaut" her ein Zeiger auf
phi-Version (oder Lazarus) ...... und was überhaupt möglich ist. :wink:

1. Also in dem VB6 Project, was auch funktioniert steht vorher sowas:
Delphi-Quellcode:
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
Delphi-Quellcode:
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'

DeddyH 19. Okt 2011 12:42

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)));

sneumann 20. Okt 2011 07:50

AW: dll einbinden delphi 7 beispiel zugriffsfehler
 
Zitat:

Zitat von DeddyH (Beitrag 1131254)
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
Delphi-Quellcode:
array[1..50] of char
in der anweisung und oben einfach nur
Delphi-Quellcode:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.
Seite 1 von 2  1 2      

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