Hallo zusammen,
habe erhebliche Probleme mit einer Callback funktion. Ich versuche derzeit eine Komponente zu schreiben die verschiedene Funktionen der wimapi.dll zur Verfügung stellen soll. Die Funktionen an sich funktionieren auch, allerdings gibt es da eine ApplyImage Funktion die sofern zuvor über eine andere funktion registriert einen Callback macht.
So weit klappt das auch, nach Aufruf der Apply funktion kommt das Programm auch in dieser Callback Routine an und sämtliche Variablen sind einwandfrei verfügbar. Von da aus rufe ich nun eine eigene doProgress Routine auf und diese kommt dann auch an der richtigen Stelle an und prüft dann ob onProgress assigned wurde und führt diese dann aus. Dort komme ich auch mit dem Debugger an, wenn ich nun aber z.B. in den .Position wert einer Progressbar schreibe (lesen geht) dann steigt Delphi aus dem Debugger aus und die Apply Routine wird bis zum Ende fortgesetzt ohne das noch mal im Callback angehalten wird. Hat hier jemand eine Idee woran das liegen könnte?
Über diese Zeilen wird der Zeiger auf die Callback Routine gesetzt:
Delphi-Quellcode:
WIMRegisterMessageCallback(0, @Messagecallback, 0);
if TempPath = '
'
then
TempPath:= '
c:\temp';
// todo: Windows Tempverzeichnis holen und setzen
ForceDirectories(TempPath);
if WIMSetTemporaryPath(hWim, pchar(TempPath))
then
begin
Image := WimLoadImage(hWim,
Index);
// Hier wird der Index bestimmt der geladen wird.
if Image <> 0
then
begin
TargetPath := IncludeTrailingPathDelimiter(TargetPath);
ForceDirectories(TargetPath);
try
Result := WIMApplyImage(Image, pchar(TargetPath), 0);
except
on e:
Exception do
begin
;
// raise ?!
end;
// exception
end;
// try
WIMUnregisterMessageCallback(0, @Messagecallback);
Die Callback Routine springt auf eine doProgress Routine:
Delphi-Quellcode:
function MessageCallBack(msgID: dword; param1: uint; const param2: uint; user: pointer): longint; stdcall;
var
MyAPI: TObject;
begin
MyAPi:= ApiObject;
if Assigned(TWimApi(MyApi).FProgressEvent) then
TWimApi(MyApi).doProgressEvent(param1);
MessageCallback := WIM_MSG_SUCCESS;
end;
Und die DoProgress Funktion ruft dann die onProgress zugewiesene Procedure FProgressEvent auf:
Delphi-Quellcode:
function TWimApi.doProgressEvent (const Percent: integer): boolean;
begin
result := false ;
if Assigned (FProgressEvent) then
begin
FProgressEvent(Self,'nix',1,Percent,1,1) ;
end;
end ;
Im Formular selber sieht das dann so aus:
Delphi-Quellcode:
procedure TForm1.WIMProgress(Sender: TObject; CurrentFile:
string; MsgID:Cardinal; Progress, TicksLeft, FileCount: Integer);
begin
// Progress
TRY
Form1.Progressbar1.Position:= Progress;
// steigt aus
except
on e:
Exception do // und kommt hier nicht mal an
begin
SysErrorMessage(GetLastError);
end;
END;