Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 19.05.09 00:15 
Hi!

Meine Probleme werden immer komplizierter ;)

Die Indys wwerfen bekanntermaßen bei jeder Gelegenheit mit Exceptions um sich, wenn etwas schief gehen kann. Manchmal weiß man das aber, und müsste eigentlich die Exception unterdrücken. In einer DLL mache ich deswegen das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
try
  res.Resolve(IPAddress);
except
  on e:EIdDnsResolverError do ;
end;


Wenn ich jetzt per definierter Host-Anwendung die DLL debugge, kommt da die Exception trotzdem noch an. Klar, dafür bin ich ja im Debugger ;)

Das Problem ist, dass eine Anwendung, die diese DLL nutzt, auch die Exception empfängt. Ist mir schleierhaft warum, schließlich geht den doch der DLL-Code gar nix an. Woher weiß also der Debugger, dass da eine Exception auftritt? Nach dem try...except sollte die doch nicht weiter gegeben werden, oder?

Ich könnte die jetzt zwar per Debugger-Setting ignorieren lassen, aber das ist mir halt nicht Granular genug, und irgendwo auch nicht ganz Sinn der Sache.

Wie werd ich diese Exception da jetzt los? Ich hab eigentlich nicht wirklich lust, mir da selber einen DNS-Resolver schrauben zu müssen.

Danke schonmal,
Sebastian

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 19.05.09 00:31 
Die Exception tritt eben auf, ob in einer externen DLL oder nicht, ist dabei ja egal. Denn Exceptions kommen beim Betriebssystem an und dieses sucht dann nach jemandem, der sich darum kümmert. Und das ist eben der Debugger, wenn einer aktiv ist, egal ob die Exception danach abgefangen wird oder nicht.

Und dass der Debugger die Hostanwendung debuggt und nicht direkt die DLL spielt dabei keine Rolle, denn die DLL ist von dem Programm geladen. Und damit reicht das Betriebssystem die Exception auch dann an den Debugger weiter.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 19.05.09 01:33 
Aha, ich dachte, der Debugger hängt sich an ein Modul. Alles klar ;)

Einen "Hier gibts nichts zu sehen"-Compilerschalter gibts nicht zufällig? Dann darf ich nämlich doch einen Resolver selbst schreiben...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 19.05.09 01:50 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Einen "Hier gibts nichts zu sehen"-Compilerschalter gibts nicht zufällig?
Nein, Exception ist Exception, also kommt die auch zum Debugger. Was der dann damit macht, ist Sache des Debuggers.

Die Option Exceptions eines bestimmten Moduls auszuschließen, gibt es in Delphi nicht, man kann nur die Behandlung bestimmter Exceptiontypen festlegen.

Was stört das aber, dass in Delphi beim Debuggen die Exception angezeigt wird? Wenn das Programm normal läuft, passiert das ja nicht.

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Dann darf ich nämlich doch einen Resolver selbst schreiben...
Was genau macht denn das Ding? Einfach nur einen Domainnamen auflösen? Das geht ja auch ganz simpel mit WinSock (getaddrinfo):
msdn.microsoft.com/e...ibrary/ms738520.aspx
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 19.05.09 02:17 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was stört das aber, dass in Delphi beim Debuggen die Exception angezeigt wird? Wenn das Programm normal läuft, passiert das ja nicht.

Oh doch, da die Exception eben bei jedem nicht auflösbarem DNS fliegt. Und das sind so ca 40% der verarbeiteten.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was genau macht denn das Ding? Einfach nur einen Domainnamen auflösen? Das geht ja auch ganz simpel mit WinSock (getaddrinfo):
msdn.microsoft.com/e...ibrary/ms738520.aspx

Nicht ganz. Reverse DNS mach ich, also PTR abfragen. GetHostByAddr geht deswegen nicht weil der auch im NetBIOS rumfragt, hier hab ich dann zu allem Überfluss noch ewige Timeouts. Hatte ich auch neulich nen Thread zu ;)

Was es aber gibt ist die DNSApi, inklusive Jedi-Header-Übersetzung in der JWAPI :)
Damit erstreckt sich mein Problem auf
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
uses {...}jwawindns{...}
var dns:PDNS_RECORD;
begin
//193.99.144.85
  if DnsQuery('85.144.99.193.in-addr.arpa',DNS_TYPE_PTR,DNS_QUERY_STANDARD,nil,@dns,nil)=0 then
    ShowMessage(dns^.Data.PTR.pNameHost);

Damit werfe ich dann zwar mit APIs um mich (IPHlp und Winsock sind schon drin), aber da die ab W2k supportet sind sollte das ja keine Probleme geben.

Thread gelöst, wenn auch anders als gedacht, würd ich sagen.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."