| Autor |
Beitrag |
stiftmaster
      
Beiträge: 149
|
Verfasst: Mi 12.02.03 23:31
auf meiner Schule setzen wir zur Zeit das Gerät 'SIR-1001' von der Firma Symtec für eine Zeitmessanlage ein.
Dafür haben wir ein Programm in Borland Delphi (Version 6) geschrieben.
Das Einlesen der Tags klappt schon einwandfrei.
Wir haben nur ein Problem: Sobald der Quelltext länger wird, kommt folgende Fehlermeldung:
Projekt lauf.exe raised exception class EAccessViolation with message 'Access violation at address 0048C023 in module 'SCEM32.DLL'. Write of address 0046361C'. Process stopped. Use Step or Run to continue
Wir haben folgende DLL ins Windows-Verzeichnis kopiert: 'SCEM32.dll'.
Woran könnte das liegen?
Auf eine baldige Antwort würde ich mich freuen
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 12.02.03 23:36
Hast du dir den Text durchgelesen, den Borland beim erstellen einer DLL in den Dateikopf als Kommentar einfügt?
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| { Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt- Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. } |
Eventuell liegt es daran.
|
|
stiftmaster 
      
Beiträge: 149
|
Verfasst: Do 13.02.03 00:44
erstmal danke für deine schnelle Antwort.
Der grüne Text sieht zwar wunderbar aus, aber ehrlich gesagt weiß ich jetzt nicht, was ich machen soll...
Kannst du das vielleicht mal in "Deutsch"  erklären
Dankend
Stefan
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 13.02.03 00:54
Der ist schon in deutsch. Soll ich dir ersatzweise ins englische übersetzten?
Zusammengefaßt sagt er so viel aus: Wenn du an Funktionen in der DLL Strings übergibst oder wenn selbige Strings zurück geben, mußt du die BORLNDMM.DLL mit liefern und im Programm als aller erste Unit die Unit ShareMem einbinden. Willst du dies nicht tun, mußt du entweder mit PChar arbeiten (nicht vergessen selber Speicher zu reservieren) oder mit ShortStrings.
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 13.02.03 11:44
Hallo,
| stiftmaster hat folgendes geschrieben: | | Wir haben folgende DLL ins Windows-Verzeichnis kopiert: 'SCEM32.dll'. |
wo habt ihr diese DLL her, wer hat sie geschrieben und wie bindet ihr sie ein? Ist eure Kapzelung noch aktuell (also passen zur DLL)?
Gruß
Klabautermann
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 13.02.03 12:09
Ach die DLL habt ihr gar nicht selber geschrieben oder wie?
Was steht denn in der Dokumentation drin?
|
|
stiftmaster 
      
Beiträge: 149
|
Verfasst: Do 13.02.03 17:19
Also, die DLL haben wir nicht selber geschrieben, die gab's bei der Hardware mit dabei.
Daher habe ich auch schon an die Firma eine E-mail geschrieben, da ich net weiß, ob's an meinem Code oder an der DLL liegt...
Ich werde jetzt erstmal eure Tipps probieren und danach werde ich mich hier wieder melden.
Dankend
Stefan
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 13.02.03 17:27
Hallo,
ich würde vermuten, das es an der "Schnitstelle" zwischen deinem Delphi Programm und der DLL liegt.
Die frage ist, habe ihr diese selber gemacht, oder hat die auch der Hersteller geliefert?
Gruß
Klabautermann
|
|
stiftmaster 
      
Beiträge: 149
|
Verfasst: Fr 14.02.03 00:16
So habe ich die DLL-Datei eingebunden:
Quelltext 1: 2: 3:
| function stxetx_open(n:integer):integer; stdcall; external 'scem32.dll'; function stxetx_close:integer; stdcall; external 'scem32.dll'; function stxetx_cmd(ein,aus: string):integer; stdcall; external 'scem32.dll'; |
und so binde ich die Funktionen ein:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var uebertragen : string; tag : string; begin // auf die Hardware zugreifen stxetx_open(1); tag := ' '; stxetx_cmd('4301s',tag); stxetx_close; uebertragen := copy(tag,6,10); |
Das klappt auch soweit perfekt - was mich nur wundert, sobald der Quelltext länger wird - irgendwann kommt eben die Zeile - da funktioniert das nicht mehr - da kommt diese dumme Fehlermeldung (hab ich oben ja schon beschrieben) - ich weiß jetzt nicht, ob es an der DLL liegt - am Einbinden der DLL oder am Aufrufen der DLL...
Weiß jemand einen Rat?
Stefan[/code]
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.02.03 00:58
Versuch es noch mal zusätzlich mit stdcall bei den Funktionsdeklarationen.
|
|
stiftmaster 
      
Beiträge: 149
|
Verfasst: Fr 14.02.03 14:34
Wo soll ich das nochmal mit den Funktionen machen, habe das net so wirklich verstanden...
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.02.03 14:37
War ich blind?  Das hast du ja schon drin. dann versuch es mal mit anderen Aufrufkonventionen. cdcel oder was es da noch gibt.
Gibt es denn keine Doku zu der DLL?
|
|
stiftmaster 
      
Beiträge: 149
|
Verfasst: Fr 14.02.03 14:44
Hier die Beschreibung, die bei der DLL dabeilag:
Quelltext 1: 2: 3:
| Alle Verwaltungsaufgaben der seriellen Schnittstelle und des Datenübertragungsprotokolls werden durch die DLL übernommen. Öffnen Sie die Schnittstelle einfach mit stxetx_open, senden Sie eine Anforderung durch stxetx_cmd und schließen Sie den Kommunikationsport mit stxetx_close.
Alle Daten werden transparent übertragen, d.h. Sie übergeben die Anforderungssequenz und empfangen die Antwort ohne Steuerzeichen und Checksumme! Dadurch sind Sie offen für evtl. Protokoll- und Funktionserweiterungen der Reader. |
Hilft euch das weiter - mir nämlich net wirklich 
|
|