Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sporadische Zugriffsverletzung bei LoadLibrary (https://www.delphipraxis.net/114641-sporadische-zugriffsverletzung-bei-loadlibrary.html)

RWarnecke 28. Mai 2008 17:44


Sporadische Zugriffsverletzung bei LoadLibrary
 
Hallo zusammmen,

in der nachfolgenden Procedure meldet sich EurekaLog mit zwei Zeilen. Ich kann aber nicht richtig nachvollziehen, warum er sich gerade an den beiden Stellen meldet :
Delphi-Quellcode:
procedure TNetworkInfos.GetAdapterAddresses(AdapterName: string;
   var Ethertype, DNSSuffix, FriendlyName:string;
   var LinkSpeed :int64; var Mtu, Flags: integer);
var
  adapteraddr:pip_adapter_addresses;
  buffer:dword;
  Error:dword;
  hdll: THandle;
  AdaptersAddresses: TGetAdapterAdresses;
  FixedInfo: PFixedInfo;
  BufLen: ULONG;
  reg: TRegistry;
  I: Integer;
  TempAdapterName: string;
begin               // <--- Erste Zeile wo EurekaLog sich meldet
  hdll := LoadLibrary('IPHLPAPI.DLL');
  if hdll <> 0 then
  begin
    @AdaptersAddresses := GetProcAddress(hdll, 'GetAdaptersAddresses');
    if @AdaptersAddresses <> nil then
    begin
      error := AdaptersAddresses(AF_UNSPEC, 10, nil, nil, @buffer);
      if error <> ERROR_BUFFER_OVERFLOW then
        exit;
      adapteraddr := AllocMem(buffer);
      error := AdaptersAddresses(AF_UNSPEC, 10, nil, adapteraddr, @buffer);
      if error = ERROR_SUCCESS then
      begin
        while adapteraddr.Next <> nil do
        begin
          if AdapterName = adapteraddr.AdapterName then
          begin
            case adapteraddr.IfType of
              IF_TYPE_ETHERNET_CSMACD  : EtherType := 'Ethernet';
              IF_TYPE_SOFTWARE_LOOPBACK : EtherType := 'Loopback';
              IF_TYPE_TUNNEL           : EtherType := 'Tunnel';
              IF_TYPE_IEEE1394          : EtherType := 'FireWire 1394';
              IF_TYPE_IEEE80211         : EtherType := 'WLAN - Interface';
              IF_TYPE_PPP              : EtherType := 'PPP - Interface';
            end;
            DNSSuffix := WideCharToString(adapteraddr.DnsSuffix);
            FriendlyName := WideCharToString(adapteraddr.FriendlyName);
            LinkSpeed := round(adapteraddr.ReceiveLinkSpeed / 1000000);
            Mtu := adapteraddr.Mtu;
            Flags := adapteraddr.Flags;
          end;
          adapteraddr := adapteraddr.Next;
        end;
      end                   //<--- Zweite Zeile wo sich EurekaLog meldet
      else
      begin
        FreeLibrary(hdll);
        exit;
      end;
    end
    else
    begin
      TempAdapterName := '';
      FixedInfo := PFIXEDINFO( GlobalAlloc( GPTR, sizeof(FIXEDINFO) ) );
      BufLen := sizeof( FIXEDINFO );
      if GetNetworkParams(FixedInfo, @BufLen) = ERROR_BUFFER_OVERFLOW then
      begin
        GlobalFree( Cardinal(FixedInfo) );
        FixedInfo := PFIXEDINFO( GlobalAlloc( GPTR, BufLen ) );
      end;
      if GetNetworkParams(FixedInfo, @BufLen) = ERROR_SUCCESS then
      begin
        DNSSuffix := FixedInfo.DomainName;
      end;
      GlobalFree( Cardinal(FixedInfo) );
      case pAdapterList.dwType of
        IF_TYPE_ETHERNET_CSMACD  : EtherType := 'Ethernet';
        IF_TYPE_SOFTWARE_LOOPBACK : EtherType := 'Loopback';
        IF_TYPE_TUNNEL           : EtherType := 'Tunnel';
        IF_TYPE_IEEE1394          : EtherType := 'FireWire 1394';
        IF_TYPE_IEEE80211         : EtherType := 'WLAN - Interface';
        IF_TYPE_PPP              : EtherType := 'PPP - Interface';
      end;
      reg := TRegistry.Create();
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        for I := 0 to Length(pAdapterList.AdapterName) - 1 do
         if pAdapterList.AdapterName[i] <> '' then
           TempAdapterName := TempAdapterName + pAdapterList.AdapterName[i];
        if reg.OpenKeyReadOnly(w2knetcard + '\' + TempAdapterName + '\Connection') then
          FriendlyName := reg.ReadString('Name')
        else
          FriendlyName := 'unbekannt';
      finally
        reg.CloseKey;
        reg.Free;
      end;
    end;
    FreeLibrary(hdll);
  end;
end;
Könnt Ihr mir da irgendwie weiterhelfen ?

NormanNG 28. Mai 2008 18:25

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
Hi,

zuerst fällt auf:

Delphi-Quellcode:
  hdll := LoadLibrary('IPHLPAPI.DLL');
  if hdll <> 0 then
  begin
    @AdaptersAddresses := GetProcAddress(hdll, 'GetAdaptersAddresses');
    if @AdaptersAddresses <> nil then
    begin
      error := AdaptersAddresses(AF_UNSPEC, 10, nil, nil, @buffer);
      if error <> ERROR_BUFFER_OVERFLOW then
        exit;
Hier ensteht ein MemoryLeak, weil das Freelibrary nicht aufgerufen wird...



P.S. "...wo sich EurekaLog meldet..."
was wird denn gemeldet?

RWarnecke 28. Mai 2008 18:29

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
Zitat:

Zitat von NormanNG
P.S. "...wo sich EurekaLog meldet..."
was wird denn gemeldet?

Ein Auszug aus dem LOG-File:
Zitat:

------------------------------------------------------------------------------------------------
|Address |Module |Unit |Class |Procedure/Method |Line |
------------------------------------------------------------------------------------------------
|Running Thread: ID=3908; Priority=0; Class=; [Main] |
|----------------------------------------------------------------------------------------------|
|004B6BC3|NetHelperTest.exe|nethelper.pas |TNetworkInfos|GetAdapterAddresses |889[34] |
|004B6A40|NetHelperTest.exe|nethelper.pas |TNetworkInfos|GetAdapterAddresses |855[0] |
------------------------------------------------------------------------------------------------
855 ist die erste Zeile
889 ist die zweite Zeile

RWarnecke 28. Mai 2008 18:34

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
Zitat:

Zitat von NormanNG
Hi,

zuerst fällt auf:

Delphi-Quellcode:
  hdll := LoadLibrary('IPHLPAPI.DLL');
  if hdll <> 0 then
  begin
    @AdaptersAddresses := GetProcAddress(hdll, 'GetAdaptersAddresses');
    if @AdaptersAddresses <> nil then
    begin
      error := AdaptersAddresses(AF_UNSPEC, 10, nil, nil, @buffer);
      if error <> ERROR_BUFFER_OVERFLOW then
        exit;
Hier ensteht ein MemoryLeak, weil das Freelibrary nicht aufgerufen wird...

Habe diese Stelle korrigiert.

NormanNG 28. Mai 2008 18:46

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
hi,

Zitat:

Ein Auszug aus dem LOG-File: ...
ok, aber was für einen Fehler beanstandet Eurekalog denn?

RWarnecke 28. Mai 2008 18:48

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
Zitat:

Exception:
-----------------------------------------------------------------------------------------------------------------------
2.1 Date : Wed, 28 May 2008 00:22:39 +0200
2.2 Address : 00401D73
2.3 Module Name : NetHelperTest.exe
2.4 Module Version: 1.0.0.0
2.5 Type : EAccessViolation
2.6 Message : Zugriffsverletzung bei Adresse 00401D73 in Modul 'NetHelperTest.exe'. Lesen von Adresse 00000000.
2.7 ID : CCE0
2.8 Count : 1
2.9 Status : New
2.10 Note :
Ist es das, was Du meinst ? Ich möchte nicht alles aus dem LOG hier posten, da das Log nicht von mir stammt.

NormanNG 29. Mai 2008 06:56

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
hi,

Zitat:

2.6 Message : Zugriffsverletzung bei Adresse 00401D73 in Modul 'NetHelperTest.exe'. Lesen von Adresse 00000000.
Das sieht wie ein referenzierter NIL-Pointer aus.

Ich würde zuerst mal die zwei verschiedenen Varianten zur Ermittlung der Adapterdaten in jeweils eigene Funktionen auslagern.
Die zweite Variante erscheint mir suspekt. Du verwendest pAdapterList, ohne das hiese vorher initialisiert wurde :gruebel:

RWarnecke 29. Mai 2008 08:52

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
TNetworkInfos ist eine Klasse von TObject. Diese Klasse fülle ich mit den verschiedensten Daten von der Netzwerkkarte. Die Variable pAdapterList wird im Create der Klasse indiziert und im Destroy wieder freigegeben.
Zitat:

Zitat von NormanNG
Zitat:

2.6 Message : Zugriffsverletzung bei Adresse 00401D73 in Modul 'NetHelperTest.exe'. Lesen von Adresse 00000000.
Das sieht wie ein referenzierter NIL-Pointer aus.

Was meinst Du damit ? Gib mir doch mal bitte ein kleine Beispiel, wo der Fehler auftritt.

Die Procedure funktioniert ja soweit. Nur auf manchen Rechnern gibt es halt diese Zugriffsverletzung, deswegen sporadisch. Ich habe es auf mehreren Rechner mit unterschiedlicher Hardware, Betriebssystemen und User-Rechten auspropiert. Nur leider konnte ich den Fehler bis jetzt noch nicht nachvollziehen.

NormanNG 29. Mai 2008 09:24

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
hi,

Zitat:

Was meinst Du damit ? Gib mir doch mal bitte ein kleine Beispiel, wo der Fehler auftritt.

Delphi-Quellcode:
var
  p:^integer
  i:integer;
begin
  P:=NIL;
  I:= P^; // hier exception: ... Lesen von Adresse 000000
  showmessage(inttostr(i)); // ggf. wegen optimierung nötig
end;

RWarnecke 29. Mai 2008 09:38

Re: Sporadische Zugriffsverletzung bei LoadLibrary
 
Ok, habe ich soweit verstanden, was Du damit meinst. Nur kann ich das in der Procedure nicht ganz nachvollziehen. Oder meinst Du, dass es an der Variable pAdpaterList liegt, weil die im constructor initialisiert wird und im Destroy wieder freigegeben wird ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.
Seite 1 von 2  1 2      

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