![]() |
Bedingt Prozedur aufrufen
Hallo,
ich bin neu hier und habe mal ne frage.. weiß jemand wie man eine prozedur bedingt einbinden kann? Also wie man sie aufruft weiß ich, das ist nicht das Problem. hatte mir das so ca vorgestellt: if var=1 then procedure usw.. hoffe mein Problem ist nachvollziehbar. Danke schonmal für antworten Christoph |
Re: Bedingt Prozedur aufrufen
Meinst Du so?
Delphi-Quellcode:
P.S.: Willkommen in der DP :dp:
if var = 1 then
Machwas else MachwasAnderes; |
Re: Bedingt Prozedur aufrufen
ne das ist ja klar.. man muss die przedur doch definiern, sodass man die aufrufen kann.. und ich meien die definition dass man die irgendwie in ne if packt. Konkret würde ich des so meinen:
Delphi-Quellcode:
Bekomme sonst ne Fehlermeldung wo der port Treiber nicht installiert ist.
if var=1 then
begin procedure PortOut(Port : Word; Data : Byte);stdcall; external 'io.dll'; end; |
Re: Bedingt Prozedur aufrufen
Dann musst Du die externen Funktionsaufrufe dynamisch laden und vorher prüfen, ob die Porttreiber installiert sind.
Das, was Du jetzt meinst, wird so nicht funktionieren. |
Re: Bedingt Prozedur aufrufen
Guten Morgen,
vielleicht kannst Du mit defines arbeiten: Zitat:
|
Re: Bedingt Prozedur aufrufen
Schau Dir dazu mal z.B.
![]() [edit] @Klaus: Ich denke, bedingte Kompilierung ist nicht das, was er sucht. [/edit] |
Re: Bedingt Prozedur aufrufen
Klaus,
das geht leider nicht, da er mit den DEFINES nicht überprüfen kann, ob die Porttreiber installiert sind ;) |
Re: Bedingt Prozedur aufrufen
:wiejetzt:
wie mache ich das? mir reicht das schon wenn var=1 ist dass er dann die die funktion aufruft? weil var ist entweder 1 oder 0 bei 0 soll er einfach weiter machen und bei 1 soll die funktion geladen werden. Mehr brauche ich ja nicht. Das würde locker reichen.. Aber da ist das große fragezeichen wie macht man sowas am besten? thx schonmal |
Re: Bedingt Prozedur aufrufen
Zitat:
Wenn Die Funktion geladen werden soll (aus DLL?), dann mußt du sie wie vorher schon gesagt dynamisch einbinden. Gib aber erst mal mehr Infos was du mit laden meinst. Gruß oki [edit] Sorry, hatte den zweiten Post übersehen. Also aus DLL! Dann mußt du dynamisch laden und vor der Procedurezuweisung prüfen. [/edit] |
Re: Bedingt Prozedur aufrufen
Schau Dir entweder meinen verlinkten Thread an oder arbeite
![]() |
Re: Bedingt Prozedur aufrufen
Meine mit geladen:
Delphi-Quellcode:
Aber wie funktioniert das Dyamisch? Habe das noch nicht ganz so kappiert..wie es in dem einen thread (s.o.) beschrieben ist.
procedure PortOut(Port : Word; Data : Byte);stdcall; external 'io.dll';
Evtl kann man mir jemand nen gutes beispiel machen? Thx nochmal |
Re: Bedingt Prozedur aufrufen
Zitat aus Ollis Tut:
Zitat:
|
Re: Bedingt Prozedur aufrufen
Muss mich da wohl mal reinarbeiten.. Komme damit gerade nicht klar.. Mache das zum erstenmal mit dll's. evtl kann mir ja jemand nen Beispiel auf mich zugeschnitten machen dass ich das mal sehe. weil mit dem tutorial komme ich noch nicht so zurecht. evtl hilft mir dass Beispiel dann weiter.. und ich verstehe das tutorial richtig.
Thx nochmal für die ganzen antworten schon. |
Re: Bedingt Prozedur aufrufen
Du könntest das im Prinzip so machen:
Delphi-Quellcode:
Getippt und nicht getestet.
type TPortOut = procedure(Port : Word; Data : Byte);stdcall;
... var MyPortOut: TPortOut = nil; ... var aHandle: THandle; begin if var = 1 then begin aHandle := LoadLibrary('io.dll'); if aHandle <> 0 then try @MyPortOut := GetProcAddress(aHandle,'PortOut'); if Assigned(MyPortOut) then MyPortOut(aWord,aData); finally FreeLibrary(aHandle); end; end; end; |
Re: Bedingt Prozedur aufrufen
So habe das mal probiert..geht leider nicht. Habe
Delphi-Quellcode:
bei type angeben aber er sagt: BEZEICHNER ERWARTET ABER PROCEDURE GEFUNDEN
TPortOut = procedure(Port : Word; Data : Byte);stdcall;
Wenn alles soweit läuft kann ich die Prozedur dann ganz normal aufrufen mit PORTOUT(..)? |
Re: Bedingt Prozedur aufrufen
Komisch, bei mir geht das. Und zum Ausführen schau Dir mein Beispiel noch einmal an. Ich versuche, die Adresse der Prozedur in der DLL zu finden und führe sie falls gefunden aus.
Delphi-Quellcode:
if Assigned(MyPortOut) then
MyPortOut(aWord,aData); |
Re: Bedingt Prozedur aufrufen
Zitat:
Diese sind sehr gut und eigentlich auch verständlich geschrieben. Setz Dich also hin und arbeite diese Tutorials Schritt für Schritt durch. Eventuell solltest Du auch ein kleines Testprojekt der Tutorials durcharbeiten oder selber eines anlegen. Es wird Dir hier niemand eine fertige Lösung zusammenschustern. Eigeninitiative ist gefragt. |
Re: Bedingt Prozedur aufrufen
Ja ich arbeite mich jetzt das tutorial mal durch muss da nur gucken wie ich das zeitlich halt schaffe..mache das ja nicht hauptberuflich.. :-D
aber danke an alle für die antworten |
Re: Bedingt Prozedur aufrufen
So ich habe mir das Tut usw mal angeschaut und noch nen bisschen gegoogelt und habe mal einige versuche gestartet..aber leider erfolgslos. Poste hier mal den Quelltext einer kleinen Test Unit evtl habt ihr ein paar vorschläge warum das nicht geht. Bin ja nicht so der fiteste im Programmieren. Hoffe deshalb auf weitere gute Lösungsansätze.
Delphi-Quellcode:
Hoffe habe das jetzt so halbwegs verstanden
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; implementation {$R *.dfm} type TPortOut = procedure(Port:Word;Data:Byte); stdcall; var PortOut: TPortOut; Handle: THandle; procedure TForm1.Button1Click(Sender: TObject); begin Handle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'io.dll')); if Handle <> 0 then begin @PortOut := GetProcAdress(Handle, 'PortOut'); if @PortOut <> nil then begin PortOut($378,255); end; FreeLibrary(Handle); end; end. Danke für antworten |
Re: Bedingt Prozedur aufrufen
So wird ein Schuh draus:
Delphi-Quellcode:
Gruß oki{$R *.dfm} 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 begin PortOut($378,255); end; FreeLibrary(AHandle); end; [edit] Handle auf AHandle [/edit oki] |
Re: Bedingt Prozedur aufrufen
Und das FreeLibrary noch eine Zeile höher vor das end ;)
|
Re: Bedingt Prozedur aufrufen
Upps,
klar, sorry! Gruß oki |
Re: Bedingt Prozedur aufrufen
Zitat:
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; |
Re: Bedingt Prozedur aufrufen
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 :gruebel:
Delphi-Quellcode:
Gruß oki
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; [edit] ich formatiere mich hier noch um Kopf und Kragen [/edit] |
Re: Bedingt Prozedur aufrufen
Zitat:
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. |
Re: Bedingt Prozedur aufrufen
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 |
Re: Bedingt Prozedur aufrufen
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... |
Re: Bedingt Prozedur aufrufen
Zitat:
- aber was soll's, ich hab' ja keine Ahnung... :mrgreen: [heimliches Zitat] gruß oki |
Re: Bedingt Prozedur aufrufen
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 :twisted: 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. |
Re: Bedingt Prozedur aufrufen
|
Re: Bedingt Prozedur aufrufen
Schreibfehler,
Address mit doppeltem d dann klappts auch mit dem Nachbarn! Moin und Gruß oki |
Re: Bedingt Prozedur aufrufen
Moin thx erstemal für euere antworten ich glaube man kommt der Lösung immer näher es gibt nur noch eine stelle wo er rummeckert.. :gruebel:. Und zwar bei
Delphi-Quellcode:
da sagt er "nicht genügend wirkliche parameter". Was kann das sein? Habe die Unit von meinem test Prog auch nochmal kopiert:
if PortOut <> nil then begin
Delphi-Quellcode:
THX schonmal
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 AHandle := LoadLibrary('io.dll'); if AHandle <> 0 then begin PortOut:= GetProcAddress(AHandle, 'PortOut'); if PortOut <> nil then begin PortOut($378,00); end; FreeLibrary(AHandle); end; end; end. |
Re: Bedingt Prozedur aufrufen
Moin Crossi,
du mußt auch die Beiträge lesen. Muetze1 und ich hatten das drei Beiträge vorher diskutiert. Bei der Abfrage auf nil muß das @ davor. Schreib es so wie Muetze1 es gesagt hat:
Delphi-Quellcode:
oder so:
if assigned(PortOut) then
Delphi-Quellcode:
Gruß oki
if @PortOut <> nil then
|
Re: Bedingt Prozedur aufrufen
Jor hatte das @ nach meinem post nochmal probiert :oops: und es gehts endlich.. :bounce1: ein dickes Dankeschön an alle die bei diesem Thread mitgeholfen haben
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 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