Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler beim laden einer Funktion aus einer DLL - PC bootet? (https://www.delphipraxis.net/39393-fehler-beim-laden-einer-funktion-aus-einer-dll-pc-bootet.html)

Pseudemys Nelsoni 2. Feb 2005 07:23


Fehler beim laden einer Funktion aus einer DLL - PC bootet?
 
hi,

ich habe folgendes versucht:

Delphi-Quellcode:
program patch;

{$APPTYPE CONSOLE}

uses
  Windows;

type
  TRegOpenCurrentUser = function(samDesired: REGSAM; phkResult: PHKEY): LongInt; stdcall;

var
  LibModule: HMODULE;
  RegOpenCurrentUser: TRegOpenCurrentUser;
  phkResult: PHKEY;

begin
  LibModule := LoadLibrary('Advapi32.dll');
  if LibModule <> 0 then // DLL wurde erfolgreich geladen
  begin
    RegOpenCurrentUser := GetProcAddress(LibModule, 'RegOpenCurrentUser');
    if (@RegOpenCurrentUser <> nil) and (RegOpenCurrentUser(KEY_READ, phkResult) = ERROR_SUCCESS) then
    begin
      //
    end;
  end;
end.
Die zweite Bedingung der letzten If-Abfrage löst einen Fehler aus und mein PC bootet direkt... was ist da denn falsch? Und das beste is noch das nach dem Start die projektdatei nichtmehr lesbar ist und ich alles neu schreiben muss (delphi zeigt dann nur vierecke an ~~)

Robert Marquardt 2. Feb 2005 07:34

Re: Fehler beim laden einer Funktion aus einer DLL - PC boot
 
Standard-Fehler der Delphiprogrammierer. Ein Zeiger in C ist oft Call-by-Reference.
Du gibst einen zufaelligen Zeigerwert an eine funktion, die dorthin schreibt.
Delphi-Quellcode:
program patch;

{$APPTYPE CONSOLE}

uses
  Windows;

type
  TRegOpenCurrentUser = function(samDesired: REGSAM; phkResult: PHKEY): LongInt; stdcall;

var
  LibModule: HMODULE;
  RegOpenCurrentUser: TRegOpenCurrentUser;
  hkResult: HKEY;
begin
  LibModule := LoadLibrary('Advapi32.dll');
  if LibModule <> 0 then // DLL wurde erfolgreich geladen
  begin
    RegOpenCurrentUser := GetProcAddress(LibModule, 'RegOpenCurrentUser');
    if Assigned(RegOpenCurrentUser) and (RegOpenCurrentUser(KEY_READ, @hkResult) = ERROR_SUCCESS) then
    begin
      //
    end;
  end;
end.

Pseudemys Nelsoni 2. Feb 2005 07:43

Re: Fehler beim laden einer Funktion aus einer DLL - PC boot
 
nun gehts, danke dir :)

Sprint 2. Feb 2005 07:45

Re: Fehler beim laden einer Funktion aus einer DLL - PC boot
 
Ich würde es eher so machen...
Delphi-Quellcode:
program patch;

{$APPTYPE CONSOLE}

uses
  Windows;

type
  TRegOpenCurrentUser = function(samDesired: REGSAM; var phkResult: HKEY): Integer; stdcall;

var
  RegOpenCurrentUser: TRegOpenCurrentUser;
  hkResult: HKEY;
begin

  RegOpenCurrentUser := GetProcAddress(GetModuleHandle('ADVAPI32.DLL'), 'RegOpenCurrentUser');
  if Assigned(RegOpenCurrentUser) then
    if RegOpenCurrentUser(KEY_READ, hkResult) = ERROR_SUCCESS then
    begin
      //
      RegCloseKey(hkResult);
    end;

end.

Pseudemys Nelsoni 2. Feb 2005 07:51

Re: Fehler beim laden einer Funktion aus einer DLL - PC boot
 
hallo springt,

danke für den code, sieht gut aus, dann bräucht ich LoadLibrary/FreeLibrary also nicht, richtig?

Noch eine Frage: Was passiert wenn die dll nicht gefunden wird? Löst GetProcAddress dann einen fehler aus oder wird sie einfach nil zurückgeben?

Sprint 2. Feb 2005 09:11

Re: Fehler beim laden einer Funktion aus einer DLL - PC boot
 
Zitat:

Zitat von Pseudemys Nelsoni
dann bräucht ich LoadLibrary/FreeLibrary also nicht, richtig?

Genau.

Zitat:

Was passiert wenn die dll nicht gefunden wird? Löst GetProcAddress dann einen fehler aus oder wird sie einfach nil zurückgeben?
GetProcAddress kann keinen Fehler auslösen. Dafür benutzt du dann Assigned und prüfst, ob GetProcAddress erfolgreich war. Die DLL wird beim Programmstart mitgeladen und befindet sich in deinem Adressraum. Darum brauchst du auch kein LoadLibrary. Hier reicht ein GetModuleHandle. AdvAPI32 ist eine wichtige Systemdatei. Ohne dieses Datei würde dein Programm auch ohne RegOpenCurrentUser nicht laufen.

Luckie 2. Feb 2005 09:15

Re: Fehler beim laden einer Funktion aus einer DLL - PC boot
 
Zitat:

Zitat von Pseudemys Nelsoni
danke für den code, sieht gut aus, dann bräucht ich LoadLibrary/FreeLibrary also nicht, richtig?

Das geht aber nur, weil in diesem Fall die DLL schon geladen wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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