C: Hilfe bei WinAPI-Prototypen

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

C: Hilfe bei WinAPI-Prototypen

Beitrag 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.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: C: Hilfe bei WinAPI-Prototypen

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: C: Hilfe bei WinAPI-Prototypen

Beitrag 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
Zuletzt geändert von Mok am 26.02.2011 12:10, insgesamt 1-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: C: Hilfe bei WinAPI-Prototypen

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: C: Hilfe bei WinAPI-Prototypen

Beitrag 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
Zuletzt geändert von DarkDragon am 26.02.2011 12:12, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: C: Hilfe bei WinAPI-Prototypen

Beitrag 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)
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Antworten