Entwickler-Ecke
Windows API - Zugriffsverletzung bei Capi.dll
Peter18 - Do 08.01.15 14:19
Titel: Zugriffsverletzung bei Capi.dll
Ein freundliches Hallo an alle,
mit der Speicherverwaltung bei Pascal tue ich mich noch etwas schwer, so hoffe ich jemand kann mir einen Tipp geben, was hier falsch ist.
Ich habe ein kleines Testprogramm geschrieben, mit dem ich mich bei der CAPI ein wenig umsehen möchte. "CAPI_REGISTER" funktioniert auch. Wenn ich aber "CAPI_PUT_MESSAGE( AppID, ConRq );" verwende, erhalte ich die Fehlermeldung "Zugriffsverletzung bei der Capi32.dll". Die Variable ConRq ist so deklariert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| Type Connect_Req = Record Length : Integer; Command : Byte ; Subcommand : Byte ; Controller : Longword; CIP : Word ; CalledNumberTyp : Byte ; CalledNumber : PChar ; CallingNumberTyp : Byte ; CallingNumberTyp1 : Byte ; CallingNumber : PChar ; CalledSubTyp : Byte ; CalledSub : PChar ; CallingSubTyp : Byte ; CallingSub : Byte ; BProt : Word ; BC : Byte ; LLC : Byte ; HLC : Byte ; AdditionalInfo : Byte ; end;
procedure TForm1.Button1Click(Sender: TObject); var ConRq : Connect_Req; |
Die Funktion "CAPI_PUT_MESSAGE" verlangt den Typ "Connect_Req" aber keinen Pointer.
Ich hoffe jemand hat einen Tipp, wie die Struktur korrekt aufbauen kann.
Grüße von der Nordsee
Peter
baumina - Do 08.01.15 14:56
Peter18 hat folgendes geschrieben : |
Die Funktion "CAPI_PUT_MESSAGE" verlangt den Typ "Connect_Req" aber keinen Pointer.
|
Ich denke Connect_Req müsste ein Pointer sein, aber ohne Quellcode weiß man nix genaues.
Peter18 - Do 08.01.15 16:18
Hallo baumina,
danke für Deine Antwort. Wenn ich einen Pointer übergebe erhalte ich eine Fehlermeldung. Die Programmierhilfe sagt: "D_AppID: Integer; pcapimessage: Connect_Req".
Der Quelltext beinhaltet sonst nur Eintragen der Daten und den Aufruf "Res := CAPI_PUT_MESSAGE( AppID, ConRq );". Wenn Du den Fehler in den Daten der Struktur vermutest kann ich die natürlich auch noch liefern.
Grüße von der Nordsee
Peter
baumina - Do 08.01.15 16:29
Ich meinte den Quelltext von CAPI_PUT_MESSAGE der muss ja in irgendeiner Unit drin stehen.
Peter18 - Do 08.01.15 17:00
Hallo baumina,
nochmals danke für Deine Antwort. Man sollte seine Saftware vollständig lesen, wenn man sie nach längerer Zeit wieder aufwärmt.
Weil die importierte Schnittstelle nicht zur CAPI-Beschreibung (AVM) passt hatte ich die Schnittstelle manuell deklariert und dabei den Parameter nicht als Zeiger eingetragen. Mit
Delphi-Quelltext
1: 2: 3:
| Function CAPI_PUT_MESSAGE ( D_AppID : Longint; pcapimessage : P_Conn_Req ): Longint; stdcall; external 'Capi2032.dll'; |
ist der Fehler behoben.
Grüße von der Nordsee
Peter
Gerd Kayser - Fr 09.01.15 05:32
Peter18 hat folgendes geschrieben : |
Delphi-Quelltext 1:
| Type Connect_Req = Record | |
Müsste es nicht so heißen:
Delphi-Quelltext
1:
| Type Connect_Req = packed Record |
Peter18 - Mo 19.01.15 17:37
Hallo Gerd Kayser,
danke für die Antwort. Ob "Record" oder "packed Record" macht in diesem Fall anscheinend keinen Unterschied, beides scheint zu funktionieren.
Grüße von der Nordsee
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!