Seite 1 von 1
C: Hilfe bei WinAPI-Prototypen
Verfasst: 26.02.2011 11:44
von Mok
Hallo!
Da die API-Funktion
RtlIpv6StringToAddress() nicht für PB geportet wurde, hab ich mich halt mal rangemacht.
In der MSDN kann man dazu folgenden Code finden:
Code: Alles auswählen
LONG NTAPI RtlIpv6StringToAddress(
__in PCTSTR S,
__out PCTSTR *Terminator,
__out IN6_ADDR *Addr
);
Mein Anlauf sieht wie folgt aus:
Code: Alles auswählen
Structure in6_addr
StructureUnion
Byte.c[16]
Word.w[8]
EndStructureUnion
EndStructure
Ws2Lib = OpenLibrary (-1,"WS2_32.DLL")
If Ws2Lib
Prototype.l pStrToAddr (S.s, *Terminator.s, *Addr.in6_addr)
Global StrToAddr.pStrToAddr = GetFunction(Ws2Lib, "RtlIpv6StringToAddress")
Else
Debug("WS2_32.DLL could not be opened!")
EndIf
;[...]
Procedure MyIPv6Connection (IPAddress$, Port.u, Mode.i = #TCP)
Protected s.SOCKET = SOCKET_(#AF_INET6, Mode, #Null)
If s <> -1
Protected inf.sockaddr_in6
Debug StrToAddr(IPAddress$, #Null, @inf\sin6_addr) ;;;;;;;;;;;;;
inf\sin6_family = #AF_INET6
inf\sin6_port = htons_(Port)
Debug connect_(s,@inf,SizeOf(inf))
Else
ProcedureReturn #False
EndIf
EndProcedure
Sobald ich die Funktion aufrufe, bekomme ich einen IMA bei 0.
Re: C: Hilfe bei WinAPI-Prototypen
Verfasst: 26.02.2011 11:50
von DarkDragon
Vermutlich ist dann StrToAddr 0, sonst wäre es wohl eher 4 oder 8 ...
Bitte poste doch mal einen Code mit dem wir selbst rumspielen können. Und -1 verwendet man in OpenLibrary nicht, sondern man nimmt #PB_Any, auch wenn der Wert gleich ist, sonst gibt's eventuell Kompatibilitätsprobleme in der Zukunft.
[EDIT]
RtlIpv6StringToAddressA oder RtlIpv6StringToAddressW sind die Namen und die Bibliothek ist auch die falsche: Ntdll.DLL und nicht WS2_32.dll
Re: C: Hilfe bei WinAPI-Prototypen
Verfasst: 26.02.2011 12:04
von Mok
@DD: Hilft alles nichts

Hier mal ein Code zum probieren:
Code: Alles auswählen
Structure in6_addr
StructureUnion
Byte.c[16]
Word.w[8]
EndStructureUnion
EndStructure
Structure sockaddr_in6
sin6_family.w
sin6_port.w
sin6_flowinfo.l
sin6_addr.in6_addr
sin6_scope_id.l
EndStructure
Macro mkword (low, high)
(low + (high << 8))
EndMacro
#IPPROTO_IPV6 = 41
#AF_INET6 = 23
#TCP = #SOCK_STREAM
#UDP = #SOCK_DGRAM
NTDLL = OpenLibrary (#PB_Any,"ntdll.dll")
If NTDLL
Prototype.l pStrToAddr (S.s, *Terminator.c, *Addr.in6_addr)
CompilerIf #PB_Compiler_Unicode
Global StrToAddr.pStrToAddr = GetFunction(NTDLL, "RtlIpv6StringToAddressW")
CompilerElse
Global StrToAddr.pStrToAddr = GetFunction(NTDLL, "RtlIpv6StringToAddressA")
CompilerEndIf
Else
Debug("ntdll.dll konnte nicht geöffnet werden!")
EndIf
Procedure MyIPv6Connection (IPAddress$, Port.u, Mode.i = #TCP)
Protected s.i = SOCKET_(#AF_INET6, Mode, #Null)
If s <> -1
Protected inf.sockaddr_in6, buf.q
Debug (StrToAddr(IPAddress$, #Null, @inf\sin6_addr) ! 1)
inf\sin6_family = #AF_INET6
inf\sin6_port = htons_(Port)
Debug connect_(s,@inf,SizeOf(inf)) ; -1 = Fehler
Else
ProcedureReturn #False
EndIf
EndProcedure
Define wsa.WSADATA
If (WSAStartup_(mkword(2,2),@wsa) ! 1)
MyIPv6Connection("0:0:0:0:0:0:0:1",6832)
WSACleanup_()
Else
Debug "Fehler bei WSAStartup"
EndIf
Re: C: Hilfe bei WinAPI-Prototypen
Verfasst: 26.02.2011 12:08
von ts-soft
Das ist schon mal blödsinn, Pointer kann höchstens eine Strukture haben, aber niemals einen nativen typen.
Re: C: Hilfe bei WinAPI-Prototypen
Verfasst: 26.02.2011 12:08
von DarkDragon
Einerseits änderst du das:
Aber dort ist es immernoch WS2Lib:
Code: Alles auswählen
CompilerIf #PB_Compiler_Unicode
Global StrToAddr.pStrToAddr = GetFunction(WS2Lib, "RtlIpv6StringToAddressW")
CompilerElse
Global StrToAddr.pStrToAddr = GetFunction(WS2Lib, "RtlIpv6StringToAddressA")
CompilerEndIf
EnableExplicit ftw!
So gehts:
Code: Alles auswählen
EnableExplicit
Structure in6_addr
StructureUnion
Byte.c[16]
Word.w[8]
EndStructureUnion
EndStructure
Structure sockaddr_in6
sin6_family.w
sin6_port.w
sin6_flowinfo.l
sin6_addr.in6_addr
sin6_scope_id.l
EndStructure
Macro mkword (low, high)
(low + (high << 8))
EndMacro
#IPPROTO_IPV6 = 41
#AF_INET6 = 23
#TCP = #SOCK_STREAM
#UDP = #SOCK_DGRAM
Define NTDLL = OpenLibrary (#PB_Any,"ntdll.dll")
If NTDLL
Prototype.l pStrToAddr (S.s, *Terminator.c, *Addr.in6_addr)
CompilerIf #PB_Compiler_Unicode
Global StrToAddr.pStrToAddr = GetFunction(NTDLL, "RtlIpv6StringToAddressW")
CompilerElse
Global StrToAddr.pStrToAddr = GetFunction(NTDLL, "RtlIpv6StringToAddressA")
CompilerEndIf
Debug StrToAddr
Else
Debug("ntdll.dll konnte nicht geöffnet werden!")
EndIf
Procedure MyIPv6Connection (IPAddress$, Port.u, Mode.i = #TCP)
Protected s.i = SOCKET_(#AF_INET6, Mode, #Null)
If s <> -1
Protected inf.sockaddr_in6, buf.q
Protected Terminator.c = '0'
Debug (StrToAddr(IPAddress$, @Terminator, @inf\sin6_addr) ! 1)
inf\sin6_family = #AF_INET6
inf\sin6_port = htons_(Port)
Debug connect_(s,@inf,SizeOf(inf)) ; -1 = Fehler
Else
ProcedureReturn #False
EndIf
EndProcedure
Define wsa.WSADATA
If (WSAStartup_(mkword(2,2),@wsa) ! 1)
MyIPv6Connection("0:0:0:0:0:0:0:1",6832)
WSACleanup_()
Else
Debug "Fehler bei WSAStartup"
EndIf
Re: C: Hilfe bei WinAPI-Prototypen
Verfasst: 26.02.2011 12:11
von Mok
Edit:
IPv6 ist für mich noch Neuland, allerdings frage ich mich, warum ich nicht zum (in der Hilfe mitgelieferten) Server connecten kann. (0:0:0:0:0:0:0:1 steht für 127.0.0.1, und die Ports sind auch dieselben)