Win 7 Problem mit DnsRecordListFree (32bit+64bit)
Moderator: Moderatoren
Win 7 Problem mit DnsRecordListFree (32bit+64bit)
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).
) */
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).
) */
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)
hm ... wenn ich mir http://msdn.microsoft.com/en-us/library ... 85%29.aspx ansehe sollte aPid und nResp = NULL sein ?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 )
p.s. ich würde solche speziellen API Fragen bei Pablo im Forum http://www.xbwin.com stellen.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.
gruss by OHR
Jimmy
Jimmy
Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)
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
/*----------------------------------------------------------------------------*/
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
/*----------------------------------------------------------------------------*/
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)
das es "immer" schon so lief ... hm ... aber eben unter XPRoland 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).
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
Jimmy
Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)
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
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
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)
wende dich an Pablo.Roland Gentner hat geschrieben:Und jetzt geht es schon wieder nicht mehr - ÜBEL!
Wenn du die "richtige" Structure erst mal hast wird es viel einfacher die ggf. zu erweitern.
hast du die 64bit Version installiert ?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...
gruss by OHR
Jimmy
Jimmy
Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)
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
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
Re: Win 7 Problem mit DnsRecordListFree (32bit+64bit)
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
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