AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bedingt Prozedur aufrufen

Ein Thema von CRoSSi · begonnen am 24. Jan 2008 · letzter Beitrag vom 1. Feb 2008
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#21

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 15:43
Und das FreeLibrary noch eine Zeile höher vor das end
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#22

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 15:46
Upps,

klar, sorry!

Gruß oki
42
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#23

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 18:05
Zitat von oki:
So wird ein Schuh draus:
Bezweifle ich. Du machst einen Aufruf der Procedure beim Zuweisen mit GetProcAddress und du rufst die Funktion innerhalb der If Anweisung auf. Da meckert beide male der Compiler. Er hatte es schon richtig.

Die Frage ist eher: Was klappt nicht? Passiert einfach nichts? Da ist dann die Frage: kann er die DLL nicht laden oder den Export in der DLL nicht finden?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  AHandle := LoadLibrary('io.dll');
  if AHandle <> 0 then
  begin
    @PortOut := GetProcAdress(AHandle, 'PortOut');
    if assigned(PortOut) then
    begin
      PortOut($378,255);
    end
    else
      ShowMessage('Funktion in der DLL nicht gefunden!');

    FreeLibrary(AHandle);
  end
  else
    ShowMessage('DLL nicht gefunden!');
end;
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#24

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 18:14
Hi Muetze1,

ich hab mich durch die miese Formatierung etwas durcheinander bringen lassen. Der Compiler sollte aber eher wegen der fehlenden End's meckern.

so sollte es aber doch richtig sein ... oder bin ich jetzt blind
Delphi-Quellcode:
type TPortOut = procedure(Port:Word;Data:Byte); stdcall;

var PortOut: TPortOut = nil;
      AHandle: THandle = 0;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  AHandle := LoadLibrary('io.dll');
  if AHandle <> 0 then begin
    PortOut := GetProcAdress(AHandle, 'PortOut');
    if PortOut <> nil then
      PortOut($378,255);
    FreeLibrary(AHandle);
  end;
end;
Gruß oki

[edit] ich formatiere mich hier noch um Kopf und Kragen [/edit]
42
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#25

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 18:18
Zitat von oki:
so sollte es aber doch richtig sein ... oder bin ich jetzt blind
Entweder bin ich auf dem Holzweg, aber PortOut ist vom Typ TPortOut und das ist ein definierter Typ einer procedure. Wenn du also nun irgendwo einfach nur PortOut schreibst (wie du es ja beim endgültigen Aufruf tust), dann ruft er die Procedure auf. Dies schreibst du nun aber auch bei der Zuweisung mit GetProcAdress() und bei der If Abfrage. Somit will der Compiler dort einen Aufruf machen, da du ja eindeutig die Procedure aufrufst. Von daher meckert er die fehlenden Parameter an.

Deshalb muss man die Adresse zuweisen beim GetProcAdress(), also mit dem @ davor. Bei der If Abfrage will man schliesslich auch nicht den Rückgabewert der Procedure mit Nil vergleichen sondern die abgelegte Adresse der Funktion. Von daher auch dort ein @ davor - oder - mit Assigned() prüfen.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#26

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 18:27
Hi,

Das mit dem assigned verwende ich bei mir eigentlich auch immer. Hab an dieser Stelle aus dem Thread kopiert und mir nichts dabei gedacht, da das nil in der globalen Variablenzuweisung auch nicht angemeckert wird. Somit geb ich dir ungeprüft recht. Bei der Zuweisung der Proceduradresse klappt das aber definitiv ohne @ !!! Hab ich vorherige Woche grad mit einer dynamischen DLL-Einbindung gemacht. Ist getestet. Entweder es geht wirklich auch grundsätzlich so, oder mein D2007 hilft im Hintergrund nach.

Gruß oki
42
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#27

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 18:42
Ok, das mit dem GetProcAddress() kann ich nachvollziehen, das meckert er mir beim BDS2006 auch nicht mehr an. Die If Anweisung jedoch wird als Aufruf betrachtet. Das ist mir neu, ich teste gleich nochmal die älteren Versionen.

Ok, bis runter zu D5 klappt die GetProcAddress() Zuweisung ohne das @. Somit stimmt meine Aussage mit dem @ bei dem Teil nicht, es ist optional. Wieder was gelernt - aber was soll's, ich hab' ja keine Ahnung...
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#28

Re: Bedingt Prozedur aufrufen

  Alt 30. Jan 2008, 18:49
Zitat von Muetze1:
Die If Anweisung jedoch wird als Aufruf betrachtet.
Dazu ziehe ich meine Meinung zurück und behaupte das Gegenteil

- aber was soll's, ich hab' ja keine Ahnung... [heimliches Zitat]

gruß oki
42
  Mit Zitat antworten Zitat
CRoSSi

Registriert seit: 24. Jan 2008
11 Beiträge
 
#29

Re: Bedingt Prozedur aufrufen

  Alt 31. Jan 2008, 22:00
So irgendwie ghets immer noch nicht... irgendwie bin ich zu doof für die gnaze aktion oder es ist wirlioch noch irgendwo nen fehler drin. So muss es doch gehen aber warum sagt er mir bei GetProcAdress das es ein undefinierter Bezeichner ist? also mir fällt da jetzt garnichts mehr ein..habe davon die anse bald voll das muss doch irgendwie gehen.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
type TPortOut = procedure(Port:Word;Data:Byte); stdcall;

var PortOut: TPortOut = nil;
      AHandle: THandle = 0;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  begin
  AHandle := LoadLibrary('io.dll');
  if AHandle <> 0 then begin
    PortOut := GetProcAdress(AHandle, 'PortOut');
    if PortOut <> nil then
      PortOut($378,255);
    end;
    FreeLibrary(AHandle);
  end;
end;

end.
Alles ist relativ..
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#30

Re: Bedingt Prozedur aufrufen

  Alt 31. Jan 2008, 22:41
MSDN-Library durchsuchenGetProcAddress()
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 19:15 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