![]() |
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:
Könnt Ihr mir da irgendwie weiterhelfen ?
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; |
Re: Sporadische Zugriffsverletzung bei LoadLibrary
Hi,
zuerst fällt auf:
Delphi-Quellcode:
Hier ensteht ein MemoryLeak, weil das Freelibrary nicht aufgerufen wird...
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; P.S. "...wo sich EurekaLog meldet..." was wird denn gemeldet? |
Re: Sporadische Zugriffsverletzung bei LoadLibrary
Zitat:
Zitat:
889 ist die zweite Zeile |
Re: Sporadische Zugriffsverletzung bei LoadLibrary
Zitat:
|
Re: Sporadische Zugriffsverletzung bei LoadLibrary
hi,
Zitat:
|
Re: Sporadische Zugriffsverletzung bei LoadLibrary
Zitat:
|
Re: Sporadische Zugriffsverletzung bei LoadLibrary
hi,
Zitat:
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: |
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:
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. |
Re: Sporadische Zugriffsverletzung bei LoadLibrary
hi,
Zitat:
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; |
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. |
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