![]() |
Win11 AV in ntdll.dll
Hi,
auf allen meinen Windows 11 PC bekomme ich in meinen BDS2006 Anwendungen einen AV Fehler, der von XP über W7 bis W10 nicht auftritt.
Code:
Keep it simple, habe ich eine Lazarus-3.2 und eine BDS2006-Console Anwendung gebaut und die function dort getestet.var GwObj, GwRAobj, GwMail : variant; function gwInit( aUser, aPass, aHost, aPort : string ) : integer; begin OleInitialize(nil); GWobj := CreateOleObject( 'NovellGroupWareSession' ); // Okay GwRAobj := GWobj.Login( User, '/ipa-' + Host + ' /ipp-' + Port, Pass, 1 ); // Access violation at address 777F0131 in module 'ntdll.dll'. Read of address 000E0029 end; Bei einem Aufruf mit den gleichen Parameter-Werten gibt es in beiden Anwendungen keine AV und auch das weitere Senden einer Mail klappt. Eine Idee woran das liegen könnte? |
AW: Win11 AV in ntdll.dll
Das ist leider die Tücke, wenn man so alte Entwicklungsumgebungen nutzt. Die können keine Programme für aktuelle Windowsversionen erstellen. Im Ergebnis schickt Windows dann jede Menge Emulationen und Kompatibilitätseinstellungen ins Rennen, damit solche Software möglichst fehlerfrei läuft.
Du kannst versuchen ein aktuelles Manifest zu verwenden, so dass Windows 11 keine Kompatibilitätseinstellungen mehr aktiviert. Allerdings kann es sein, dass dann andere Sachen nicht mehr funktionieren. Am sinnvollsten wäre, eine neuere Delphiversion zu nutzen. Du könntest es ja zumindest mal mit der aktuellen Trial versuchen, um zu sehen, ob es daran liegt. |
AW: Win11 AV in ntdll.dll
Danke für die Antwort, ich habe mich ja von TurboPascal über D1 und D2 bis hin zur Berlin jedes Jahr aktualisiert, ohne die IDE auch umzustellen.
Trial wäre schön aber da ich befinde mich leider in der Komponentenhölle, weil man ja früher jedes Feature (DevExpress und Co) total toll fand und unbedingt nutzen wollte. Das letzte Update auf 2006 hat damals schon viel zu viel Zeit gekostet. Für die alten Anwendungen möchte ich das nicht noch einmal machen, da wäre ein komplettes Redesign die bessere Lösung aber auch das kostet Zeit, die ich im Moment überhaupt nicht habe. Neuere kleinere Projekte laufen seit einiger Zeit über CodeTyphon oder Lazarus pur. Wenn alle Stricke reißen, lagere ich das Mail senden über Groupwise in die seltsamerweise funktionierende BDS2006 oder Lazarus Console Version aus. |
AW: Win11 AV in ntdll.dll
Teste, ob dein GWObj wirklich assigned wurde, bevor Du den Login aufrufst. Falls nicht, schau was windows für einen Fehlercode meldet.
|
AW: Win11 AV in ntdll.dll
Habe ich geprüft, das Object ist wohl zugeordnet, beide varIs.. functions liefern false zurück, hier mal der komplette Code.
Code:
OleInitialize(nil); // 2024.05.11.uc // CoInitialize( nil );
try GWobj := CreateOleObject( 'NovellGroupWareSession' ); except on E : exception do begin FehlerOK( 'CreateOleObject( "NovellGroupWareSession" ) fehlgeschlagen.' + crlf + E.Message ); result := -1; end; end; if VarIsNull(GWobj) then FehlerOK( 'GWobj Null'); if VarIsEmpty(GWobj) then FehlerOK( 'GWobj Empty'); try GwRAobj := GWobj.Login( User, '/ipa-' + Host + ' /ipp-' + Port, Pass, 1 ); gwInitOK := true; except on E : exception do begin FehlerOK( 'GWobj.Login() fehlgeschlagen.' + crlf + E.Message ); result := -2; end; end; |
AW: Win11 AV in ntdll.dll
Eventuell nicht relevant, aber Du rufst die Parameter als "User", "Host", "Port", "Pass" auf während die Deklaration von gwInit von "aUser", "aHost", "aPort", "aPass" spricht. Gibt es da eventuell undeklarierte Variablen?
|
AW: Win11 AV in ntdll.dll
Sorry, weil mir nichts anderes mehr eingefallen ist, hatte ich die Parameter versuchsweise nochmal in lokale Variablen gespeichert.
Code:
function gwInit( aUser, aPass, aHost, aPort : string ) : integer;
var User, Pass, Host, Port : string; begin User := aUser + ''; Pass := aPass + ''; Host := aHost + ''; Port := aPort + ''; |
AW: Win11 AV in ntdll.dll
Da es kein CONST gibt, waren es bereits kopienen, allergings mehr als (mit Referenzzählung)
Delphi-Quellcode:
Dein
User := aUser;
Pass := aPass; Host := aHost; Port := aPort;
Delphi-Quellcode:
entspricht quasi Folgendem (
+ ''
![]()
Delphi-Quellcode:
function gwInit( aUser, aPass, aHost, aPort : string ) : integer;
begin UniqueString(aUser); UniqueString(aPass); UniqueString(aHost); UniqueString(aPort); Wirklich Variant? Warum nicht OleVariant? Ich weiß aber nicht, wie es bei den Parametern des gwInit aussieht, also welcher Typ es genau ist. Im Variant können delphi-eigene Typen enthalten sein, welche fremde Sprachen nicht verstehen, wie z.B. AnsiString und UnicodeString. Im OleVariant gibt es nur OLE-kompatible Typen, wie z.B. WideString. vieleicht mal so probieren
Delphi-Quellcode:
var vUser, vHost, vPass: OleVariant; // oder WideString
vUser := User; vHost := '/ipa-' + Host + ' /ipp-' + Port; vPass := Pass; GwRAobj := GWobj.Login(vUser, vHost, vPass, 1); // oder GwRAobj := GWobj.Login(OleVariant(User), OleVariant('/ipa-' + Host + ' /ipp-' + Port), OleVariant(Pass), 1); // oder GwRAobj := GWobj.Login(WideString(User), WideString('/ipa-' + Host + ' /ipp-' + Port), WideString(Pass), 1); |
AW: Win11 AV in ntdll.dll
Danke, ich habe es getestet, alle drei "oder" Versionen schlagen fehl.
Code:
Seltsam ist ja auch, daß die function in einer mini console version mit bds2006 unter W-XP bis W11 funktioniert.
GWobj.Login(1) fehlgeschlagen.
Access violation at address 77500F48 in module 'ntdll.dll'. Read of address FFFF0013 GWobj.Login(2) fehlgeschlagen. Access violation at address 77500F48 in module 'ntdll.dll'. Read of address 00000014 GWobj.Login(3) fehlgeschlagen. Access violation at address 77500F48 in module 'ntdll.dll'. Read of address 00000014 Die tForm Version aber nur bis W10 und ab W11 nicht mehr, zwei Systeme mit W11 getestet. Ich baue jetzt mal eine kleine tForm mit einem Button der die function aufruft. Wenn das klappt, kann es ja nur an irgendwelchen genutzten Komponenten liegen. |
AW: Win11 AV in ntdll.dll
Muß vor dem Login die Lib vielleicht noch irgendwie ordentlich initialisiert werden?
Fehlt vielleicht noch irgendwo eine DLL? ... Die Adressen klingen nach NIL 00000014 = nil + offset $14 FFFF0013 = nil - offset $FFED bzw. = nil - $10000 + $13 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz