Autor Beitrag
neuling82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 29.07.03 14:05 
Hey Leute, ich habe ein rießen Problem: Ich schreibe eine Komponente. ich habe eine Funktion in einer DLL datei, die ein Procedurale Variable erwartet. in meinem Objekt in der Unit erstelle ich ein Objekt, welches die Prozedure enthält, die ich der Proceduralen Variablen zuweisen, diese wiederum wird der DLL - Funktion übergeben. das funktioniert jedoch nicht, da eine Methode immer einen Self Parameter mit sich führt, die Funktion in der DLL akzeptiert diesen jedoch nicht und ich bekomme eine Exception. Gibt es denn keine Möglichkeit dieses Problem zu lösen??

Zusatz: Wenn ich die Procedure, welche ich der Funktion übergebe nicht im Objekt sondern global in der Unit deklariere, funktioniert es, da der Self Parameter somit nicht mit übergeben wird. Das ist jedoch keine Lösung für mich, denn ich habe in meinem Objekt eine Variable, welche ich in der Procedure andern möcht. Ist die Procedure nicht im Objekt vorhanden, kann ich díe sich im objekt befindliche Variable nicht ändern, da im entwurfsmodus der Komponente das Objekt noch nicht erzeugt ist.

Hat jemand eine Lösung zu meinem Problem??

Danke und grüße
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 29.07.03 14:34 
Ist die DLL auch in Delphi geschrieben? Wenn nicht: Hast du den Quellcode der DLL und kannst sie rekompilieren? Ansonsten musst du eine weitere Funktion um die Methode herumbauen und das ist kein Kinderspiel.

_________________
Ist Zeit wirklich Geld?
neuling82 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 29.07.03 14:39 
hallo, danke für deine Antwort! Leider habe ich weder Quellcode, noch weiß ich ob sie in Delphi geschrieben wurde. Wie würde dass denn schematisch funktionieren mit der Funktion um die Methode herum?? Es währe mir echt wichtig!
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 29.07.03 15:47 
ho..

neuling82 hat folgendes geschrieben:
.... das funktioniert jedoch nicht, da eine Methode immer einen Self Parameter mit sich führt, die Funktion in der DLL akzeptiert diesen jedoch nicht und ich bekomme eine Exception. Gibt es denn keine Möglichkeit dieses Problem zu lösen??

...


der 'self parameter' ist kein parameter, sondern die referenz des objects auf sich selbst...somit hast du immer versucht, der DLL, die object-referenz mitzuteilen :wink:

Den richtigen prozeduralen pointer erhälst du indem du einfach den prozedur namen übergibst (evtl. mit nem @ davor):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TBla.makeDings;
  helloWorld('...wugguWuggu..')
end;
...
// übergabe an dll

wieAuchImmer(@makeDings); // evtl. ohne oder mit @ -> kommt drauf an, ob der procedurale-pointer typisiert ist oder nicht!


Du musst nur aufpassen, da es einen unterschied zwischen normalen prozeduren und prozeduren in objecten gibt...kommt halt drauf an, was die func. erwartet (in delphi zB. procedure of object).

hoffe das hilft?[/delphi]

_________________
mfg.
mâximôv
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 29.07.03 15:53 
Naja... self ist schon ein Parameter! Die Methoden eines Objektes existieren immer nur einmal im Speicher! Damit die Methode nun "weiß" auf welches Objekt sie sich beziehen muss wird implizit die Self-Referenz als "Parameter" (im EAX-Register) übergeben! Eine Objekt-Methode hat daher immer einen (versteckten) Parameter mehr!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 29.07.03 15:57 
OK...gut das du da meinen irrtum geklärt hast!

ändert aber nix drann, das er self nicht verwenden kann :roll:

_________________
mfg.
mâximôv
neuling82 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 29.07.03 16:05 
angenommen ich setze nun ein class vor die Procedure, die ich übergeben möchte, ist es dann immer noch eine Methode?? aber dann kann ich ja, wenn ich diese Procedure Programmiere wieder nicht auf Variablen im Objekt zugreifen oder?
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 29.07.03 16:16 
ich GLAUBE nicht...self ist dann IMHO nicht krrekt!...oder?

_________________
mfg.
mâximôv
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 29.07.03 16:33 
Eine Klassen-Methode (class function...) ist keine Static Method (gibt es in Delphi nicht). Auch sie hat einen Self-Parameter. Nur zeigt der nicht auf eine Instanz sondern auf die Klass selbst. Du kannst also in einer Klassenmethode mit Self.ClassName z.B. den Klassennamen ermitteln. Ein Self.MeineFunktion hingegen führt zu einer Schutzverletzung.

Zitat:
Wie würde dass denn schematisch funktionieren mit der Funktion um die Methode herum?? Es währe mir echt wichtig!

Du reservierst Speicher, der Ausführbar ist (VirtualAlloc) und schreibst in diesen Maschinencode, der deine Methode mit den Parametern aufruft. In dem Maschinencode steht der Self-Parameter fest codiert drinnen, wodurch diese neue "Prozedur" nur für eine einzige Klassen Instanz funktioniert.
Diesen Speicherbereich übergibst du nun der DLL Funktion.


Es kann aber auch ohne Assembler gemacht werden, wenn du die Funktion nicht mehrfach aufrufst, während sie abgearbeitet wird.
In diesem Fall reicht es, wenn du eine globale Variable anlegst, der du den Self-Parameter zuweist. Eine 2. Funktion, die du der DLL-Funktion übergibst, liest die globale Variable aus und ruft deren Methode auf.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
 CurrentSelf: TMyClass;

function MyCallback(Progress: Integer): Integer; stdcall;
begin
  if CurrentSelf <> nil then
    Result := CurrentSelf.UpdateProgress(Progress);
end;

...
begin
  CurrentSelf := MyObj;
  DllFunc(@MyCallback);
end;

_________________
Ist Zeit wirklich Geld?