AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Sporadische Zugriffsverletzung bei LoadLibrary
Thema durchsuchen
Ansicht
Themen-Optionen

Sporadische Zugriffsverletzung bei LoadLibrary

Ein Thema von RWarnecke · begonnen am 28. Mai 2008 · letzter Beitrag vom 29. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 28. Mai 2008, 18:44
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 28. Mai 2008, 19:25
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?
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 28. Mai 2008, 19:29
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
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 28. Mai 2008, 19:34
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 28. Mai 2008, 19:46
hi,

Zitat:
Ein Auszug aus dem LOG-File: ...
ok, aber was für einen Fehler beanstandet Eurekalog denn?
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 28. Mai 2008, 19:48
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 29. Mai 2008, 07:56
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
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#8

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 29. Mai 2008, 09:52
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 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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 29. Mai 2008, 10:24
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;
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

Re: Sporadische Zugriffsverletzung bei LoadLibrary

  Alt 29. Mai 2008, 10:38
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 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