Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Überwachte Ausdrücke optimieren?

  Alt 3. Aug 2016, 22:42
Ich komme so leider auch nicht weiter.

Den Formularvisualizer möchte ich nicht nutzen. Nur den StringReplacer.

Über OTA ermittle ich den aktuellen Thread.
Über CurThread.Evaluate(Expression...) wird der Ausgabetext ermittelt.
Das ergibt aber den ungewollten "TsoGuid($2FB1204) as IsoGuid".

Im folgenden Code wird der Text erfolgreich abgerufen, nur, dass ich den eben nicht ändern kann:
Gewünscht wäre: IsoGuid.AsString
Zitat:
Guid - IsoGuid - TsoGuid($2FB1204) as IsoGuid
-1
-2
-3
-4a "TsoGuid($2FB1204) as IsoGuid"
-5
--
Delphi-Quellcode:
    CodeSite.Send(Expression + ' - ' + TypeName + ' - ' + EvalResult);
    // Guid - IsoGuid - TsoGuid($2F21204) as IsoGuid
    if (TypeName = 'IsoGuid') then
    begin
      Result := 'IsoGuid! => ' + EvalResult;
      CodeSite.Send('-1');
      if Supports(BorlandIDEServices, IOTADebuggerServices, DebugSvcs) then
        CurProcess := DebugSvcs.CurrentProcess;
      if CurProcess <> nil then
      begin
        CodeSite.Send('-2');
        CurThread := CurProcess.CurrentThread;
        if CurThread <> nil then
        begin
          CodeSite.Send('-3');
          repeat
          begin
            Done := True;
            EvalRes := CurThread.Evaluate(Expression, @ResultStr, Length(ResultStr), CanModify, eseAll, '', ResultAddr,
              ResultSize, ResultVal, '', 0);
            case EvalRes of
              erOK:
                begin
                  Result := ResultStr;
                  CodeSite.Send('-4a "' + Result + '"');
                end;
              erDeferred:
                begin
                  CodeSite.Send('-4b');
                  FCompleted := False;
                  FDeferredResult := '';
                  FDeferredError := False;
                  FNotifierIndex := CurThread.AddNotifier(Self);
                  while not FCompleted do
                    DebugSvcs.ProcessDebugEvents;
                  CurThread.RemoveNotifier(FNotifierIndex);
                  FNotifierIndex := -1;
                  if not FDeferredError then
                  begin
                    if FDeferredResult <> 'then
                      Result := FDeferredResult
                    else
                      Result := ResultStr;
                  end;
                end;
              erBusy:
                begin
                  CodeSite.Send('-4c');
                  DebugSvcs.ProcessDebugEvents;
                  Done := False;
                end;
            end;
            CodeSite.Send('-5');
          end
          until Done = True;
        end;
      end;
      CodeSite.Send('--');

Also müsste CurThread.Evaluate irgendwie überschrieben werden. Aber dann müsste die als einziges bekannte Adresse ja auch in das Interface-Object gecastet werden.
Dann könnte ich das aber doch auch gleich (wie im vorigen Beitrag) in Visualizer direkt tun - nur dass das dort (noch) nicht funktionierte.

Sorry, ist etwas schwierig für mich.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat