Autor Beitrag
stiftmaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



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



BeitragVerfasst: 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?

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



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



BeitragVerfasst: Do 13.02.03 00:54 
Der ist schon in deutsch. Soll ich dir ersatzweise ins englische übersetzten? :wink:

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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: Fr 14.02.03 00:16 
So habe ich die DLL-Datei eingebunden:
ausblenden 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:
ausblenden 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



BeitragVerfasst: Fr 14.02.03 00:58 
Versuch es noch mal zusätzlich mit stdcall bei den Funktionsdeklarationen.
stiftmaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



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



BeitragVerfasst: Fr 14.02.03 14:37 
War ich blind? 8) 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: Fr 14.02.03 14:44 
Hier die Beschreibung, die bei der DLL dabeilag:
ausblenden 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 ;-)