Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Er der ikke noget helt galt med det eksempel i About? Den forbinder til et dll, returnerer true hvis funktionen findes, returnerer desuden pointer til funktionen ... men hvor frigives handle igen?
// if aFunctionName exists in aFileName it returns handle to dll and pointer to function function IfAvailableGetDLLFunction(const aFileName, aFunctionName: string; var aHandle: THandle; var aFunctionPointer: pointer): boolean; begin result := false; if LoadLibrary(pchar(aFileName)) <> 0 then begin aHandle := GetModuleHandle(pchar(aFileName)); if aHandle <> 0 then begin aFunctionPointer := GetProcAddress(aHandle, pchar(aFunctionName)); result := assigned(aFunctionPointer) end; end; end;
// Call SHELL32.DLL for Win < Win98 otherwise call URL.dll } function IsInternetAvailable: boolean; var Handle: THandle; InetIsOffline: function(dwFlags: DWORD): BOOL; stdcall; begin result := false; if IfAvailableGetDLLFunction('URL.DLL','InetIsOffline',Handle,@InetIsOffline) then begin try result := not InetIsOffLine(0); // Coming here it's assigned, no need to check! finally FreeLibrary(Handle); // Ditto here. At this point it's assigned end; end else if assigned(Handle) then FreeLibrary(Handle); // Need to check here end;
Her er en lidt forkortet udgave: Jeg har fjernet check før FreeLibrary da der ikke sker noget ved det.
// if aFunctionName exists in aFileName it returns handle to dll and pointer to function function IfAvailableGetDLLFunction(const aFileName, aFunctionName: string; var aHandle: THandle; var aFunctionPointer: pointer): boolean; begin result := false; aHandle:=LoadLibrary(pchar(aFileName)); if aHandle<>0 then begin aFunctionPointer := GetProcAddress(aHandle, pchar(aFunctionName)); result := assigned(aFunctionPointer) end; end;
// Call SHELL32.DLL for Win < Win98 otherwise call URL.dll } function IsInternetAvailable: boolean; var Handle: THandle; InetIsOffline: function(dwFlags: DWORD): BOOL; stdcall; begin result := false; if IfAvailableGetDLLFunction('URL.DLL','InetIsOffline',Handle,@InetIsOffline) then begin try result := not InetIsOffLine(0); // Coming here it's assigned, no need to check! except end; end; FreeLibrary(Handle); end;
Kroning: Her er jeg ikke helt enig. Funktionen kan godt returnere en handle men ikke en pointer til funktionen - men selvfølgelig, hvis FreeLibrary er ligeglad så er jeg også (det står der bare ikke noget om i MS' hjælp)
Der står i hjælpen: If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError.
Dvs. der sker ikke noget ved at kalde den selv om Handle er 0
"Funktionen kan godt returnere en handle men ikke en pointer til funktionen" Jeg ved ikke helt hvad du mener med det?
kroning: Funktionen IfAvailableGetDLLFunction kalder LoadLibrary og derved levere et handle til filen, uden det behøver returnere en funktions-pointer. Derfor skal man huske at kalde FreeLibrary uanset hvad.
Hej hrc + kroning I har haft en længere diskussion mens jeg har været på arbejde.
Jeg har afprøvet funktionen IsInternetAvailable, men den returnerer "true" uanset om jeg er online eller afbryder forbindelsen til nettet ved at afbryde mit trådløse netværk ?
Jeg får for øvrigt en compilerfejl, hvis jeg benytter forslaget med at checke om Handlen er assigned:
else if assigned(Handle) then FreeLibrary(Handle); // Need to check here
Det fungerer fint med at pinge ip-addressen til min website. Er IP-addressen altid den samme på et bestemt website? Ellers kan man vist også pinge med web-addressen i stedet for ip-addressen.
IP burde altid være den samme og så slipper man for et DNS opslag.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.