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

Code: Alles auswählen

*Terminator.c
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:

Code: Alles auswählen

NTDLL = OpenLibrary (#PB_Any,"ntdll.dll")
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
:praise:

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)