Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
DelUser01

Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von DelUser01 »

Hallo!

unter XP 32bit funktioniert "DnsRecordListFree" richtig, unter Win7 nicht:

Programmausschnitt:
/* ---------- */
nDll := MainDllLoad( "DNSAPI.DLL" )
nRet := DllCall( nDll , DLL_STDCALL , "DnsQuery_A" , cServer , nDnsType , DNS_QUERY_STANDARD , aPid , @nRR1 , @nResp )

nRet := DllCall( nDll , DLL_STDCALL , "DnsRecordListFree" , @nRR1 , 1 )

/* ---------- */

Das einzige was ich gefunden habe bei enem der auch Probleme damit hatte:
Finally, fixed it. The solution is try to make sure the win32 struct and c# struct is bit(bit size) mapping. This can be achieved by using exact c# type for win32 type.


Vielleicht het einer da auch schon gelöst oder eine Idee woran es liegen kann.
Für einen Hinweis wäre ich Dankbar!

Gruß
Roland

weitere Infos zur Funktion:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
/* DnsRecordListFree(
PDNS_RECORD pRecordList [in,out] Pointer to the list of DNS records to be freed
DNS_FREE_TYPE FreeType [in] Specifier of how the record should be freed (deep freeing only).
) */
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:

Code: Alles auswählen

nDll := MainDllLoad( "DNSAPI.DLL" )
nRet := DllCall( nDll , DLL_STDCALL , "DnsQuery_A" , cServer , nDnsType , DNS_QUERY_STANDARD , aPid , @nRR1 , @nResp )
hm ... wenn ich mir http://msdn.microsoft.com/en-us/library ... 85%29.aspx ansehe sollte aPid und nResp = NULL sein ?
pExtra [in, out, optional]
This parameter is reserved for future use and must be set to NULL.

ppQueryResultsSet [out, optional]
Optional. A pointer to a pointer that points to the list of RRs that comprise the response.
For more information, see the Remarks section.

pReserved [out, optional]
This parameter is reserved for future use and must be set to NULL.
p.s. ich würde solche speziellen API Fragen bei Pablo im Forum http://www.xbwin.com stellen.
gruss by OHR
Jimmy
DelUser01

Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von DelUser01 »

Hallo Jimmy,

weiter unten der Quellcode der gesamten Funktion.
Die Variablen müssten für XP ja stimmen - sonst würde es ja nicht gehen
(geht schon ein paar Jahre).
Die DNS-Auflösung geht ja auch unter Win 7, nur die Funktion "DnsRecordListFree" bringt Fehler (Interne Datenstruktur beschädigt).

Vielleicht hilft das weiter.

Guß
Roland

/*----------------------------------------------------------------------------*/
Function GsApiDnsQueryGetRec( cServer , nDnsType , nSekWait )

Local nDll := 0
Local aPid := 0
Local nRR1 := 0
Local nRR2 := 0
Local nResp:= 0
Local nLoop:= 0
Local nIn := ""
Local aErr := {}
Local lErr := .F.
Local nRet := dnGsInternalErrNr

If Empty( cServer )
lErr := .T.
aErr := { GsSpText( 178 ) ,;
"" ,;
"Modul: GsApiDnsQueryGetRec()",;
"" ,;
GsSpText( 117 ) }
EndIf

If !lErr
GsApiDnsQueryReset()
nDll := MainDllLoad( "DNSAPI.DLL" )
If nDll == 0
lErr := .T.
aErr := { GsSpErrWin( -999001 ) ,;
"" ,;
"DllLoad( DNSAPI.DLL )" ,;
"" ,;
GsSpText( 117 ) }
EndIf
EndIf

If !lErr
/*
DnsQuery(
PCSTR lpstrName [in] Name of the owner of the record set being queried
WORD wType [in] Numeric represent of the type of Rec 1=0x0001=A)
DWORD fOptions [in] Query options, combined, override DNS_QUERY_STANDARD
PID4_ARRAY aipServers [in] Specifier of DNS servers, NULL=default (optional)
PDNS_RECORD* ppQueryResultsSet [in,out] Pointer to the pointer that points to the list of RRs (optional)
PVOIS* pReserved [in,out] Returned response in original wire format (optional)
)
*/
cServer := GsApiAtChr0Add( cServer )
nRet := DllCall( nDll ,;
DLL_STDCALL ,;
"DnsQuery_A" ,;
cServer ,;
nDnsType ,;
DNS_QUERY_STANDARD ,;
aPid ,;
@nRR1 ,;
@nResp )
nRR2 := nRR1
If nRet <> 0
lErr := .T.
aErr := { GsSpErrWin( 71 , nRet ) ,;
GsSpText( 103 ) ,;
"" ,;
"DNS-Name..: " + GsApiAtChr0Cut( cServer ),;
"" ,;
"Modul.....: DllCall( DnsQuery_A )",;
"Server....: " + cServer ,;
"Anfragetyp: " + GsNumTex( nDnsType ) ,;
"" ,;
GsSpText( 117 ) }
Else
Do While .T.
nLoop++
GsApiDnsQueryRrSeq( StringOf( nRR2 , dnMaxRR ) )
GsApiDnsQueryExtSeq( nLoop , nDnsType )
If GsApiDnsQueryVal( nLoop , 1 ) <> 0
nRR2 := GsApiDnsQueryVal( nLoop , 1 )
Else
Exit
EndIf
EndDo

* If !GsSysIsWin7() // nur solange Problem besteht
If .T. // nur zum Test
/*
DnsRecordListFree(
PDNS_RECORD pRecordList [in,out] Pointer to the list of DNS records to be freed
DNS_FREE_TYPE FreeType [in] Specifier of how the record should be freed (deep freeing only)
)
*/
nRet := DllCall( nDll , ;
DLL_STDCALL , ;
"DnsRecordListFree" , ;
@nRR1 , ;
1 )
If nRet <> 0
lErr := .T.
aErr := { GsSpErrWin( 71 , nRet ) ,;
"" ,;
"DllCall( DnsRecordListFree )",;
"" ,;
GsSpText( 117 ) }
EndIf
EndIf
EndIf
MainDllUnLoad( nDll )
EndIf

If lErr
GsProblemMail( "DNS-Error" , aErr )
If nSekWait <> NIL .And. nSekWait >= 0
GsMsgBox( aErr , "DNS-Error" , , nSekWait )
EndIf
EndIf
Return( nRet )
/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
E R R O R O B J E C T
oError:args:
-> VALTYPE: C VALUE: _DLLNULNULÄtPPrÄtEOTNULyNUL
-> VALTYPE: N VALUE: -1
-> VALTYPE: N VALUE: 1
oError:canDefault: N
oError:canRetry: N
oError:canSubstitute: J
oError:cargo: NIL
oError:description: Interne Datenstrukturen besch„digt
oError:filename:
oError:genCode: 41
oError:operation: dllExecuteCall
oError:osCode: 0
oError:severity: 2
oError:subCode: 5
oError:subSystem: BASE
oError:thread: 1
oError:tries: 0
/*----------------------------------------------------------------------------*/
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:weiter unten der Quellcode der gesamten Funktion.
Die Variablen müssten für XP ja stimmen - sonst würde es ja nicht gehen
(geht schon ein paar Jahre).
Die DNS-Auflösung geht ja auch unter Win 7, nur die Funktion "DnsRecordListFree" bringt Fehler (Interne Datenstruktur beschädigt).
das es "immer" schon so lief ... hm ... aber eben unter XP

ich habe mich nun noch nicht so intensive damit beschäftigt aber wenn ich mir deinen Code ansehe "denke" ich das du die "Structure" wie einen String zusammen baust.

a.) wie kommst du auf die MEMBER "Länge" wie 103 / 117 ( ungerade ??? )
b.) ich sehen kein CHR(0) als String "Abschluss"

ich habe mir vorhin mal die Structure angesehen http://msdn.microsoft.com/en-us/library ... 85%29.aspx ... uuuuuffff
es wäre nun möglich das für Win7 weitere MEMBER dazu gekommen sind sodass ihm nun dein String als "zu kurz" erscheint ... siehe "Windows 7 or later: "

Anmerkung : genau das ist das Problem wenn man Structure per String nachbilden will und Änderungen kommen.
man sollte auf ot4xb erweitern um mit "echten" Structure zu arbeiten. da muss man dann "nur" die neuen Member eintragen.
gruss by OHR
Jimmy
DelUser01

Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von DelUser01 »

Hallo Jimmy

Möglicher Weise hast Du mit Deiner Vermutung der geänderten DNS Struktur recht. Das würde bedeuten dass ich die vorher ablaufenden Funktionen prüfen muss und nicht die letzt in der jetzt der Fehler auftritt.
Das Ganze begeistert mich überhaupt nicht - das war damals ein riesen Act das DNS-Zeugs zum Laufen zu bringen. Und jetzt geht es schon wieder nicht mehr - ÜBEL!

Zudem habe ich noch einige andere Probleme mit Win7 und 64bit zu bearbeiten.
Z.B. funktionieren Methoden nach dem Aufruf von
CreateObject( "InternetExplorer.Application" )
nicht mehr oder nicht mehr richtig, und, und, und...

Nun ja - dann suche ich mal weiter...
...und inzwischen ist ja auch Vatertag - dann mache ich mir jetzt ein Bier auf!

MfG,
Roland
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:Und jetzt geht es schon wieder nicht mehr - ÜBEL!
wende dich an Pablo.
Wenn du die "richtige" Structure erst mal hast wird es viel einfacher die ggf. zu erweitern.
Roland Gentner hat geschrieben:Zudem habe ich noch einige andere Probleme mit Win7 und 64bit zu bearbeiten.
Z.B. funktionieren Methoden nach dem Aufruf von
CreateObject( "InternetExplorer.Application" )
nicht mehr oder nicht mehr richtig, und, und, und...
hast du die 64bit Version installiert ?
gruss by OHR
Jimmy
DelUser01

Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von DelUser01 »

Guten Morgen Jimmy ;-)

Ja, auf der neuen Workstation des Kunden ist Win 7 64bit.
Nach CreateObject und Navigate wird der Browser + Webseite angezeigt.
Danach möchte ich noch :width(), height() usw. anpassen - da schmiert Xbase dann ab.
Meist mit
automationobject:setnoivar(xxxx)
oder
automationobject:nomethod(xxxx)

Das Programm bricht auch ab mit einem der oberen Meldungen wenn ich
ieo:busy() abfrage
sleep(50) und nochmal
ieo:busy() abfrage

Allerdings - wenn auch sehr selten kam einer dieser Fehler auch schon unter XP 32bit vor.

MfG,
Roland
DelUser01

Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)

Beitrag von DelUser01 »

Ergänzungen zur Problemstellung DnsRecordListFree:

1) Das Problem besteht auch unter Windows 8

2) Die Fehler-Nr. 1 heißt "falsche Funktionsnummer". Vermutlich kein Strukturfehler (die anderen DNS-Funktionen gehen ja). Die DNS-Struktur wurde aber tatsächlich erweitert, das hat aber nichts geändert.

3) Im Internet steht 1 Text der darauf hindeutet, dass die falsche DLL geladen wird (ntdll.dll). Die 64bit dll und nicht die 32bit dll aus SysWow64.
Bei DLLLOAD gebe ich ja überall nur den DLLNAMEN an und keinen Pfad. Warum soll dann ausgerechnet hier Xbase++ etwas falsch machen?

Nun ja - vielleicht gibt es ja doch einmal eine Lösung.

Gruß
Roland
Antworten