![]() |
AW: Fehler "access violation" - keine Ahnung, warum...
Kannst Du mir Deinen Gedankengang hier einmal erklären?
Zitat:
|
AW: Fehler "access violation" - keine Ahnung, warum...
Geh mal in die Projektoptionen und aktiviere dort die Bereichsprüfung und eventuell noch die Debug-DCUs.
|
AW: Fehler "access violation" - keine Ahnung, warum...
Zitat:
Die Funktion COM_TCpOpen weist dem Zeiger einen Wert zu (vorher NIL, nachher ein hardwarespezifischer Wert). |
AW: Fehler "access violation" - keine Ahnung, warum...
Zitat:
Code:
Und diese Meldung befindet sich in dieser Prozedur:
LOCK DEC [EDX-skew].StrRec.refCnt { threadsafe dec refCount }
Code:
Das sind für mich allerdings alle böhmische Dörfer ;)
procedure _UStrArrayClr(var StrArray; Count: Integer);
{$IF not defined(CPU386)} var P: Pointer; begin P := @StrArray; while Count > 0 do begin _UStrClr(P^); Dec(Count); Inc(NativeInt(P), SizeOf(Pointer)); end; end; {$ELSE} asm { -> EAX pointer to str } { EDX cnt } {$IFDEF ALIGN_STACK} SUB ESP,4 {$ENDIF ALIGN_STACK} PUSH EBX PUSH ESI MOV EBX,EAX MOV ESI,EDX @@loop: MOV EDX,[EBX] { fetch str } TEST EDX,EDX { if nil, nothing to do } JE @@doneEntry MOV dword ptr [EBX],0 { clear str } MOV ECX,[EDX-skew].StrRec.refCnt { fetch refCnt } DEC ECX { if < 0: literal str } JL @@doneEntry LOCK DEC [EDX-skew].StrRec.refCnt { threadsafe dec refCount } JNE @@doneEntry LEA EAX,[EDX-skew] { if refCnt now zero, deallocate} CALL _FreeMem @@doneEntry: ADD EBX,4 DEC ESI JNE @@loop POP ESI POP EBX {$IFDEF ALIGN_STACK} ADD ESP,4 {$ENDIF ALIGN_STACK} end; {$IFEND} |
AW: Fehler "access violation" - keine Ahnung, warum...
Bist sicher das der Zeiger identisch ist mit dem der als rückgabe bei open erzeut wird?
Hatte auch mal ein probleme das ein zeiger aus unerklärlichen gründen gelöscht bzw.. nicht gleich war. gruss |
AW: Fehler "access violation" - keine Ahnung, warum...
Wie sieht denn das Headerfile zu der DLL aus? Eigentlich gibt es ja nur 2 Möglichkeiten:
- die DLL fordert den Speicher an, befüllt ihn und gibt den Zeiger zurück - die DLL erwartet einen Zeiger auf selbst angeforderten Speicher und befüllt diesen Auf jeden Fall vermute ich, dass das ein Zeiger auf den Record sein soll und kein untypisierter. Die Kombination von New() und anschließendem NULLen macht zumindest keinen Sinn. |
AW: Fehler "access violation" - keine Ahnung, warum...
Zitat:
|
AW: Fehler "access violation" - keine Ahnung, warum...
Ich würde empfehlen erst mal richtig aufzuräumen.
Dazu gehört dass das Record TManipulationtag sowie die Deklarationen für function COM_TcpOpen usw. in eine eigene Unit verschoben werden. Alles was zur Ansteuerung der DLL benötigt wird muss in eine eigene Unit gepackt werden. Alles andere wäre unprofessionell.
Delphi-Quellcode:
Die Unit HwCom wird dann per Uses in deiner Formularunit eingebunden.
unit HwCom;
{ Hier Doku über die DLL (Hersteller, Zweck, Webseite,...) rein } interface uses Windows; type TManipulationtag = record TriggerType: byte; ///< Trigger 1: Identify whether the TriggerValue is an address or a value (0: trigger not active; 1: // ... end; function COM_TcpOpen(var zeiger:Pointer; ipAddress:AnsiString; port:smallint): NativeUInt; stdcall; ... implementation const HWCOM_DLL = 'HwCom.dll'; function COM_TcpOpen(var zeiger:Pointer; ipAddress:AnsiString; port:smallint): NativeUInt; stdcall; external HWCOM_DLL; ... end; Und dabei fällt mir sogleich ein Problem auf: Du übergibst den Parameter ipAddress als
Delphi-Quellcode:
. Dieser Datentyp ist aber unter C/C++ unbekannt und dürfte wohl eher ein
AnsiString
Delphi-Quellcode:
sein.
PAnsiChar
|
AW: Fehler "access violation" - keine Ahnung, warum...
Zitat:
|
AW: Fehler "access violation" - keine Ahnung, warum...
Zitat:
Du weißt jetzt wo es knallt, also beim Freigeben eines String-Arrays, bzw. mehrerer Strings, aber irgendwer hat ja diese Prozedur aufgerufen und bei dem könnte man nachsehn, was er "genau" freigeben will, also welche Strings/Stringvariablen das sind und dann hat man einen Anhaltspunkt, wo man eventuell nach der Ursache suchen könnte. Aber eventuell hast du ja irgendwo Bufferoverrun, welcher zufällig diese Stringvariablen überschreibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 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