Autor Beitrag
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Sa 09.09.06 14:33 
Hallo,

ich hab eine DLL die in einem Thread zeitaufwändige Dinge bearbeitet. Deshalb würde ich gerne dem Programm Rückmeldung durch eine CallBack-Funktion geben.
Die CallBack-Funktion sieht so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
//no need:
//  PFNCallBack = ^TFNCallBack;
  TFNCallBack = function (AData1, AData2: Cardinal;
                            AData: Pointer): Boolean; stdcall;

//Die Funktion in der DLL, welche die CallBack im Mainformular aufruft
function MyCallBack(AData1, AData2: Cardinal; ACallBackFunc: TFNCallBack;
  ACallBackData: Pointer): Boolean; stdcall;
begin
  if Assigned(ACallBackFunc) then begin  //schauen ob Funktion verfügbar ist....ja ist sie
    try
//      Result := ACallBackFunc^(AData1, AData2, ACallBackData);  //FEHLER
//this way:
      Result := ACallBackFunc(AData1, AData2, ACallBackData); 
    except
      Result := False;   //leider springt er immer hier rein
    end;
  end
  else
    Result := True;
end;

//Die Funktion im Programm
function MyCallBack(AData1, AData2: Cardinal; AData: Pointer): Boolean; stdcall;
begin
  Result := True;  //wird nie aufgerufen
end;
Ich vermute, dass der Zeiger auf die Funktion, die ich der DLL übergebe, in dieser ungültig ist, weil sie andere Speicherbereiche benutzt. Andererseits kennt er ja den Zeiger...
Könnt ihr mir sagen, was falsch ist und wie ich das verbessern kann?

Vielen Dank und viele Grüßem
Hape

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.


Zuletzt bearbeitet von wulfskin am Sa 03.01.09 12:13, insgesamt 2-mal bearbeitet
locutus2k5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 33

Windows Vista Ultimate
BDS2005
BeitragVerfasst: So 10.09.06 05:01 
Versuch mal die Adresse der Funktion zu benutzen...

ausblenden Delphi-Quelltext
1:
Result := @ACallBackFunc(AData1, AData2, ACallBackData);					
wulfskin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: So 10.09.06 20:32 
user profile iconlocutus2k5 hat folgendes geschrieben:
Versuch mal die Adresse der Funktion zu benutzen...

ausblenden Delphi-Quelltext
1:
Result := @ACallBackFunc(AData1, AData2, ACallBackData);					
Sorry locutus,

ich verstehe nicht ganz. Ich hab doch schon den Zeiger und will nun an die Funktion ran, warum sollte ich da das @-benutzen?
Oder wie meinst du das? Sonst noch jeamdn eine Idee?

EDIT: Hab den Fehler jetzt gefunden. Ohne Zeiger auf eine Funktion (PFNCallBack) funktioniert es wunderbar, siehe Luckies Tutorial. Ich habs oben mal verbessert.

Danke,
Hape

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
locutus2k5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 33

Windows Vista Ultimate
BDS2005
BeitragVerfasst: Mo 11.09.06 13:33 
Du hattest den Result Wert dereferenziert. Ich nahm (fälschlicherweise) an das du die Adresse der funktion übergeben müsstest. Naja, haben wir beide dazu gelernt ;-)