Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Warum hier Zugriffsverletzung? (https://www.delphipraxis.net/26679-warum-hier-zugriffsverletzung.html)

Chewie 27. Jul 2004 15:04


Warum hier Zugriffsverletzung?
 
Ich habe hier die Definition einer Funktion:

Delphi-Quellcode:
function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWord;
  lpInfo: Pointer): BOOL; stdcall;

type
  _SERVICE_DESCRIPTIONA = packed record
    lpDescription: PChar;
  end;
  TServiceDescriptionA = _SERVICE_DESCRIPTIONA;
  PServiceDescriptionA = ^TServiceDescriptionA;

  _SERVICE_DESCRIPTIONW = packed record
    lpDescription: PWChar;
  end;
  TServiceDescriptionW = _SERVICE_DESCRIPTIONW;
  PServiceDescriptionW = ^TServiceDescriptionW;

  //we use the ANSI version
  TServiceDescription = TServiceDescriptionA;
Soweit so gut. Der Record enthält doch nur einen PChar, sollte also doch auf Speicherebene identisch mit PChar sein. Doch warum funktioniert dann das hier nicht:
Delphi-Quellcode:
procedure TServiceInstaller.SetDescription(const Value: String);

begin
  if FServiceOpened then
  begin
    ChangeServiceConfig2(FhService, SERVICE_CONFIG_DESCRIPTION, PChar(Value));
    FDescription := Value;
  end;
end;
Benutz ich den Record und setz dort den PChar, dann klappt es. Aber wieso gibt es hier die Zugriffsverletzung??

NicoDE 27. Jul 2004 15:33

Re: Warum hier Zugriffsverletzung?
 
PChar <> PPChar

Langfassung: PChar(Value) übergibt die Adresse des ersten Zeichens von Value. Die Funktion erwartet aber einen Zeiger auf einen Zeiger (erster Member der Struktur) auf des erste Zeichen von Value.

Chewie 27. Jul 2004 15:38

Re: Warum hier Zugriffsverletzung?
 
Autsch :wall:

Klar. Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz