![]() |
Warum verursacht diese Zeile eine AV?
Liste der Anhänge anzeigen (Anzahl: 1)
Es gibt Programme, die man schreibt, die verfolgen einen 'ne verdammt lange Zeit. "Be S.M.A.R.T." ist so eines davon.
Welche Zeile ich meine? Diese hier:
Delphi-Quellcode:
Ich hab' das Beispiel - Projekt mit allen notwendigen Dateien angehängt. Ich würde mich freuen, wenn man mir helfen könnte. Das Programm in Einzelteilen hier hinein zu kopieren, würde keinen Sinn machen. Es muss doch irgendwie gehen... :cry:
pAttrBuffer := PChar(PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0]); //Zeile 73
|
Re: Warum verursacht diese Zeile eine AV?
Ich weiss hier jetzt zwar auch nicht weiter aber ich mache es normalerweise immer so, dass ich die entsprechende Zeile mit showmessage-Meldungen suche und dann aufsplitte
var c:char; begin c:=PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0]; pattrbuffer:=pchar(c); und so weiter... vielleicht hilft das ja... |
Re: Warum verursacht diese Zeile eine AV?
Hallo Daniel,
müsste das nicht eher so aussehen:
Delphi-Quellcode:
Auch die Zeile danach sieht sehr suspekt aus...
pAttrBuffer := PChar(@PSENDCMDOUTPARAMS(@SCOP).bBuffer);
Verstehe auch nicht warum du da mit PChar arbeitest. Grüße vom marabu |
Re: Warum verursacht diese Zeile eine AV?
Hmmm ... irgendwie sagt mein Delphi "Invalid Stream Format" ... kannst du mir helfen? :stupid:
Scherz beseite ... was soll denn das bitte sein?
Delphi-Quellcode:
:shock: ... bei mir ist AttrOutCmd == 16 ... kein Wunder also, daß das abkackt. Du castest hier den Wert 16 in einen Pointer auf eine Struktur und versuchst auf ein Element dieser Struktur (von der du sagst sie sei an Adresse 0x00000010) zuzugreifen. Du landest damit großzügig in der Nullpointerseite des Systems.
PChar(PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0]);
Erklär mal was du willst. EDIT: hab ich doch den marabu übersehen ... tut mir sorry :mrgreen: Übrigens kann man dann ja auch gleich zB schreiben:
Delphi-Quellcode:
oder sogar:
pAttrBuffer := @SCOP.bBuffer[0];
Delphi-Quellcode:
... nee, also das letzte mag er nicht, da bräuchtest du wohl wieder einen Typecast ...
pAttrBuffer := SCOP.bBuffer;
|
Re: Warum verursacht diese Zeile eine AV?
Hi Olli,
bin auch schon drauf gekommen. Habe zwar keine Doku aber das sieht vielversprechend aus:
Delphi-Quellcode:
marabu
var
pAttrBuffer: PDRIVEATTRIBUTE; begin ... pAttrBuffer := @SCOP.bBuffer; ... end; |
Re: Warum verursacht diese Zeile eine AV?
Zitat:
|
Re: Warum verursacht diese Zeile eine AV?
Hmm... Ok, die AV ist weg. Mal sehen, wie das jetzt weiter geht....
Ich hatte mich an dem orig. Microsoft - Code orientiert:
Code:
"DoPrintData" ist dabei wie folgt deklariert:
DoPrintData(((PSENDCMDOUTPARAMS)AttrOutCmd)->bBuffer,
((PSENDCMDOUTPARAMS)ThreshOutCmd)->bBuffer, i);
Code:
Zum Testen habe ich mir die erste Variable geschnappt:
VOID DoPrintData(PCHAR pAttrBuffer, PCHAR pThrsBuffer, BYTE bDriveNum)
int i; PDRIVEATTRIBUTE pDA; PATTRTHRESHOLD pAT; BYTE Attr; // // Print the drive number // printf("\nData for Drive Number %d\n", bDriveNum); // // Print the revisions of the data structures // printf("Attribute Structure Revision Threshold Structure Revision\n"); printf(" %d %d\n\n", (WORD)pAttrBuffer[0], (WORD)pThrsBuffer[0]); // // Print the header and loop through the structures, printing // the structures when the attribute ID is known. // printf(" -Attribute Name- -Attribute Value- -Threshold Value-\n"); pDA = (PDRIVEATTRIBUTE)&pAttrBuffer[2]; pAT = (PATTRTHRESHOLD)&pThrsBuffer[2]; for (i = 0; i < NUM_ATTRIBUTE_STRUCTS; i++) { Attr = pDA->bAttrID; if (Attr) { if (Attr > MAX_KNOWN_ATTRIBUTES) Attr = MAX_KNOWN_ATTRIBUTES+1; printf("%2X %-29s%d%20c%d\n", pDA->bAttrID, pAttrNames[Attr], pDA->bAttrValue, ' ', pAT->bWarrantyThreshold ); } pDA++; pAT++; } }
Delphi-Quellcode:
Und dann dachte ich halt, das obige würde in Delphi so aussehen:
pAttrBuffer: PChar
Delphi-Quellcode:
Oder hab' ich das damit völlig verhauen? Ich mochte "C" noch nie....
PChar(PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0])
|
Re: Warum verursacht diese Zeile eine AV?
Zitat:
|
Re: Warum verursacht diese Zeile eine AV?
Zitat:
C:
Delphi-Quellcode:
Und ...naja... halt dasselbe in Delphi:
#define READ_ATTRIBUTE_BUFFER_SIZE 512
BYTE AttrOutCmd[sizeof(SENDCMDOUTPARAMS) + READ_ATTRIBUTE_BUFFER_SIZE - 1];
Delphi-Quellcode:
const
READ_ATTRIBUTE_BUFFER_SIZE = 512; var AttrOutCmd : Byte = BYTE(sizeof(TSENDCMDOUTPARAMS) + (READ_ATTRIBUTE_BUFFER_SIZE - 1)); |
Re: Warum verursacht diese Zeile eine AV?
Zitat:
Delphi-Quellcode:
Willst du genau wissen was du gemacht hast? Ein Byte kann Werte von 0..255 halten. 512 ist 0 + 512 ist dementsprechend wieder 0 in den Grenzen eines Bytes. Daher enthielt dein Byte den Wert sizeof(TSENDCMDOUTPARAMS)-1 oder so ...
const
READ_ATTRIBUTE_BUFFER_SIZE = 512; var AttrOutCmd : array[0.. BYTE(sizeof(TSENDCMDOUTPARAMS) + (READ_ATTRIBUTE_BUFFER_SIZE - 1))]of Byte; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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