Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi array [0..0] ? (https://www.delphipraxis.net/98740-array-%5B0-0%5D.html)

nitschchedu 31. Aug 2007 14:28


array [0..0] ?
 
Also aus meiner WlanAPI habe ich aus der Übersetztung ein Array das so ist:

Delphi-Quellcode:
Network: array[0..0] of Tndu_WLAN_AVAILABLE_NETWORK;
Jetzt ist aber immer nur ein Feld drin :(

Ich habe mal Test weiße das so gemacht

Delphi-Quellcode:
Network: array[0..2] of Tndu_WLAN_AVAILABLE_NETWORK;
Und da waren nun 3 Feld ausgfühlt.

Wie bekomme ich das hin das das mit dem array[0..0] richtig klapt ?

mkinzler 31. Aug 2007 14:30

Re: array [0..0] ?
 
Was willst du den erreichen 0..0 heißt nunmal nur 1 Element

angos 31. Aug 2007 14:31

Re: array [0..0] ?
 
Hi,

was ist genau dein Problem? wenn du
Delphi-Quellcode:
myArray = array[0..0]
deklarierst, hast du nur ein feld, und zwar
Delphi-Quellcode:
myArray[0]
deklarierst du hingegen
Delphi-Quellcode:
myArray = array[0..2]
hast du drei felder
Delphi-Quellcode:
myArray[0] myArray[1] myArray[2]
Gruß

[edit=schöner machen /]

nitschchedu 31. Aug 2007 14:34

Re: array [0..0] ?
 
Also in C++ sa es so aus:

Code:
typedef struct _WLAN_INTERFACE_INFO_LIST {
    DWORD dwNumberOfItems;
    DWORD dwIndex;

#ifdef __midl
    [unique, size_is(dwNumberOfItems)] WLAN_INTERFACE_INFO InterfaceInfo[*];
#else
    WLAN_INTERFACE_INFO InterfaceInfo[1];
#endif
Man gab mir den hniweiß ich solle es so übersetzten:

Delphi-Quellcode:
Network: array[0..0] of Tndu_WLAN_AVAILABLE_NETWORK;
Ich war in der Annahme das da mehr als nur ein Feld kommt !?

angos 31. Aug 2007 14:39

Re: array [0..0] ?
 
jetzt glaube ich ein bisschen zu wissen, worauf du hinaus willst... kenne mich in c halt gar nicht aus ;)

mit mehr Felder meinst du dwNumberOfItems und dwIndex?

dann brauchst du aber eigentlich kein array, irgendwas ist da falsch glaub ich... :gruebel:

versuch doch mal
Delphi-Quellcode:
var
  Network: Tndu_WLAN_AVAILABLE_NETWORK;
begin
  tu was mit Network.dwNumberOfItems;
  tu was mit Network.dwIndex;
end;

mkinzler 31. Aug 2007 14:43

Re: array [0..0] ?
 
Es handelt sich um eine dynamische Struktur
Delphi-Quellcode:
type
    WLAN_INTERFACE_INFO_LIST = Record
        dwNumberOfItems: Cardinal;
        dwIndex: Array of Cardinal
    end;
...
Network: WLAN_INTERFACE_INFO_LIST;
 
setLength( network.dwindex, network.dwNumberOfItems);

nitschchedu 31. Aug 2007 14:49

Re: array [0..0] ?
 
Und wie würde das hier aussehen ?


Delphi-Quellcode:

// Deklaration
Pndu_WLAN_PROFILE_INFO_LIST = ^Tndu_WLAN_PROFILE_INFO_LIST;
  PPndu_WLAN_PROFILE_INFO_LIST = ^Pndu_WLAN_PROFILE_INFO_LIST;
  Tndu_WLAN_PROFILE_INFO_LIST = record
     dwNumberOfItems: DWORD;
    dwIndex: DWORD;
    ProfileInfo: array[0..0] of Tndu_WLAN_PROFILE_INFO;
  end;

function WlanGetAvailableNetworkList(hClientHandle: Handle;
     const pInterfaceGuid: PGUID; dwFlags: DWORD; pReserved: PVOID;
    var pAvailableNetworkList: Pndu_WLAN_AVAILABLE_NETWORK_LIST): DWORD; stdcall;


...

// Aufruf
var
  netzworklist: Pndu_WLAN_AVAILABLE_NETWORK_LIST;
....
begin
   back := WlanGetAvailableNetworkList(hClient,
     @pInterface.InterfaceInfo[0].InterfaceGuid,
    NDU_WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,
    nil, netzworklist);
end;

sirius 31. Aug 2007 14:51

Re: array [0..0] ?
 
Diese Deklaration kann so richtig sein. Es ist der prinzipielle Hinweis, dass es sich um ein statisches Array handelt, von dem man allerdings die Länge nicht kennt. Meistens steht die Länge an einer anderen Stelle (wie man an deinem C-Code auch sieht).

du kannst jetzt auf verschiedene Art an den Feldinhalt kommen:
1. Du definierst dir ein statisches Array, was groß genug ist, und benutzt eben nur die ersten NumberOfItems Elemente.
2. Du nimmst einen Pointer von WLAN_INTERFACE_INFO und gehst damit durch die Liste.


2. ist meistens schöner und könnte so aussehen:
Delphi-Quellcode:
type PINTERFACE_INFO=^INTERFACE_INFO
     INTERFACE_INF0=packed record
      //...was auch immer
end;
type WLAN_INTERFACE_INFO_LIST=packed record
      dwNumberOfItems:DWORD;
      dwIndex:DWORD;
      WLAN_INTERFACE_INFO:array[0..0] of INTERFACE_INFO;
end;

//...

var i:integer;
    PInfo:PInterface_Info;
begin
  PInfo:=@InfoList.WLAN_Interface_Info;
  for i:=1 to InfoList.numberofitems do
  begin
    PInfo^.xyz
    //zugriff auf das Feld
     
    inc(PInfo); //aufs nächste Feld schieben
  end;
end;
Je nach Gegebenheit gibt es auch noch andere Lösungen...

nitschchedu 31. Aug 2007 15:03

Re: array [0..0] ?
 
Diese Zuweißung geht nicht wirklich
Delphi-Quellcode:
PInfo:=@InfoList.WLAN_Interface_Info;
Mein Code:
Delphi-Quellcode:
 Pndu_WLAN_AVAILABLE_NETWORK_LIST = ^Tndu_WLAN_AVAILABLE_NETWORK_LIST;
  PPndu_WLAN_AVAILABLE_NETWORK_LIST = ^Pndu_WLAN_AVAILABLE_NETWORK_LIST;
  Tndu_WLAN_AVAILABLE_NETWORK_LIST = record
     dwNumberOfItems: DWORD;
    dwIndex: DWORD;
    Network: array[0..0] of Tndu_WLAN_AVAILABLE_NETWORK;
  end;



var
 netzworklist: Pndu_WLAN_AVAILABLE_NETWORK_LIST;
 Netzwork: Tndu_WLAN_AVAILABLE_NETWORK;
begin
....
  netzworklist := WlanAllocateMemory(SizeOf(Tndu_WLAN_AVAILABLE_NETWORK_LIST));

  back := WlanGetAvailableNetworkList(hClient,
     @pInterface.InterfaceInfo[0].InterfaceGuid,
    //NDU_WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,
    0,
    nil, netzworklist);


  Netzwork := @netzworklist^.Network; <---

  for i := 0 to netzworklist^.dwNumberOfItems - 1 do
  begin
     Memo1.Lines.Add(Netzwork.strProfileName);
    inc(Netzwork);
  end;
Fehler beim "<---" = Inkompatiple Typen

sirius 31. Aug 2007 15:08

Re: array [0..0] ?
 
:oops: da fehlt anscheinend noch ein [0] dahinter und evtl noch ein pointer(...) drumrum

nitschchedu 31. Aug 2007 15:27

Re: array [0..0] ?
 
Habe das jetzt so :

Delphi-Quellcode:
Netzwork := netzworklist^.Network[0];

  for i := 0 to netzworklist^.dwNumberOfItems - 1 do
  begin
     Memo1.Lines.Add(Netzwork.strProfileName);
    inc(Netzwork);
  end;
Aber das "inc(Netzwork); " sagt er geht nicht :(

sirius 31. Aug 2007 15:31

Re: array [0..0] ?
 
Netzwork muss ja auch ein pointer sein:
Delphi-Quellcode:
Netzwork:^Tndu_WLAN_AVAILABLE_NETWORK;
bzw. du deklarierst noch einen eigenen Typ dafür.


btw: schönes Denglish

jottkaerr 31. Aug 2007 15:32

Re: array [0..0] ?
 
Dritte Möglichkeit: Du definierst weiterhin

Delphi-Quellcode:
type
  WLAN_INTERFACE_INFO_LIST = packed record
    dwNumberOfItems: DWORD;
    dwIndex: DWORD;
    WLAN_INTERFACE_INFO: array[0..0] of INTERFACE_INFO;
  end;
und schaltest beim Zugriff auf ein Element von WLAN_INTERFACE_INFO die
Bereichsüberprüfung aus

Delphi-Quellcode:
for i := 0 to InfoList.dwNumberOfItems - 1 do
begin
  {$R-}
  MachWasMit(InfoList.WLAN_INTERFACE_INFO[i]);
  {$R+}
end;
jkr

nitschchedu 31. Aug 2007 15:40

Re: array [0..0] ?
 
Jo gut das geht aber was mich jetzt noch immer verärgert ist das strProfileName immer noch leer ist :(

Delphi-Quellcode:
Tndu_WLAN_AVAILABLE_NETWORK = record
    strProfileName: array[0..NDU_WLAN_MAX_NAME_LENGTH - 1] of wchar;
    dot11Ssid: Tndu_DOT11_SSID;
    dot11BssType: Tndu_DOT11_BSS_TYPE;
    uNumberOfBssids: ulong;
    bNetworkConnectable: Bool;
    wlanNotConnectableReason: Tndu_WLAN_REASON_CODE;
    uNumberOfPhyTypes: ulong;
    dot11PhyTypes: array[0..WLAN_MAX_PHY_TYPE_NUMBER -1] of Tndu_DOT11_PHY_TYPE;
    bMorePhyTypes: Bool;
    wlanSignalQuality: Tndu_WLAN_SIGNAL_QUALITY;
    bSecurityEnabled: Bool;
    dot11DefaultAuthAlgorithm: Tndu_DOT11_AUTH_ALGORITHM;
    dot11DefaultCipherAlgorithm: Tndu_DOT11_CIPHER_ALGORITHM;
    dwFlags: DWORD;
    dwReserved: DWORD;
  end;
Hat jemand eine Idee ?

Remko 31. Aug 2007 19:32

Re: array [0..0] ?
 
This happens more in Win32 API, usually the array is defined like this:
Delphi-Quellcode:
const
  ANYSIZE_ARRAY = 1;
SomeArray: array [0..ANYSIZE_ARRAY - 1] of SomeType;
a small snippet from my LsaLogonUser sample (here on DP) shows how to use it:

Delphi-Quellcode:
var pGroups: PTOKEN_GROUPS;

  // The number of TOKEN_GROUPS we're going to insert
  MaxGroups := 2;

  // Reserve memory for MaxGroups numbur of PTOKEN_GROUPS
  pGroups := PTOKEN_GROUPS(GlobalAlloc(GPTR, sizeof(_SID_AND_ATTRIBUTES) * MaxGroups));
  pGroups^.GroupCount := MaxGroups;

  // Get and open Token from CurrentProcess
  if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hToken)) then
  begin

    // Get the Logon Sid and it to the LocalGroups parameter of LsaLogonUser
    // The Logon Sid has the form S-1-5-5-XXXXXXXX-YYYYYYYY
    // We need it to obtain access to the user's desktop
    GetLogonSid(hToken, pGroups^.Groups[0].Sid);
    pGroups^.Groups[0].Attributes := SE_GROUP_MANDATORY or
                                     SE_GROUP_ENABLED or
                                     SE_GROUP_ENABLED_BY_DEFAULT or
                                     SE_GROUP_LOGON_ID;
    // Cleanup
    CloseHandle(hToken);
  end;

  // Now get the Administrator's SID
  dwSizeSid := 0;
  dwSizeDomain := 0;
  bRes := LookupAccountName(nil, 'Administrator', nil, dwSizeSid, nil, dwSizeDomain, SidType);

  if (not bRes) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    // Reserve memory
    AdminSid := AllocMem(dwSizeSid);
    SetLength(Domain, dwSizeDomain);

    // Lookup Sid from Accountname
    // Assuming that the Admin account has not been renamed!
    bRes := LookUpAccountName(nil, 'Administrator', AdminSid, dwSizeSid, PChar(Domain), dwSizeDomain, SidType);
    if not bRes then
    begin
      // Cleanup
      FreeMem(AdminSid);
      AdminSid := nil;
    end;
  end
  else begin
    RaiseLastOSError;
  end;

    ShowMessageFmt('Administrator Sid: %s, Domain: %s', [SidToStr(AdminSid), Domain]);

  // Add the Administrator's sid to pGroups
  pGroups^.Groups[MaxGroups -1].Sid := AdminSid;
  pGroups^.Groups[MaxGroups -1].Attributes := SE_GROUP_MANDATORY or
                                              SE_GROUP_ENABLED or
                                              SE_GROUP_ENABLED_BY_DEFAULT;
Hope this helps...

Dezipaitor 31. Aug 2007 22:10

Re: array [0..0] ?
 
OFFTOPIC: Betreff Rechtschreibung


Zitat:

Zitat von Dezipaitor
hi
Könntest du vielleicht deinen Text einschließlich Titel, einmal durchlesen, bevor du es absendest (mache ich auch)?
Am besten du machst 5 bis 10 Minuten etwas anders und liest den Text dann nochmal durch.
Wörter, die dir nicht vollständig bekannt sind, schlägst du am besten in einem Duden nach.
...
Dasselbe gilt natürlich auch für deutsche Wörter. ....
Deshalb mein Tipp: Schau die Wörter nach, die dir verdächtig vorkommen. Kauf dir dazu ein Duden, dadurch lernst du auch
schnelles Nachschlagen, was z.b. in der Schule oder Studium nur Vorteile hat, da es dort oftmals digitale Information nicht gibt
(z.b. Skripte). Dann schreib dir das Wort auf Karteikarten. Schau dir die Karten öfters mal an und versuche Sätze daraus zu formen -
mit diesem Wort. Besonders in einer Fremdsprache verinnerlicht man so Wörter und kann sie auch sehr gut anwenden. Nur die Übung macht den
Meister.

Ich schreibe das nicht nur dir, sondern auch allen anderen, die Probleme mit der Sprache haben. Lernt die Sprache! Sie ist der einzige
Weg sich verständlich zu machen! Durch schlechten Stil, schlechte Wortwahl und falsche Schreibweise verdirbt man des Lesers Lust am Lesen.
Und das will man ganz sicher nicht als Autor.

Bitte verstehe meine Text als Sprungbrett zur Besserung und nicht als Kritik!!! Nur durch Fehler lernt man und daher habe ich auch nichts
dagegen, wenn manchmal mehr oder weniger Fehler im Text gemacht werden. Ich mache ja selbst welche! Ein gewisses Maß bei Fehlern kann man noch tolerieren bzw. überlesen.
Jedoch wird das Lesen bei mehr und mehr Fehlern sehr anstrengend und die Chancen sinken, dass der Autor eine Antwort bekommt.

Also bitte, wer diesen Text gelesen hat, und selbst sehen kann, wie gut oder schlecht er schreibt, der möge bitte meinen Text beherzigen.
Davon haben alle nur Vorteile.

Quelle: http://www.delphipraxis.net/internal...=770142#770142

nitschchedu 1. Sep 2007 09:05

Re: array [0..0] ?
 
Delphi-Quellcode:
.. , die dir verdächtig vorkommen. ..
Das ist zwar nett gemeint, aber das Problem bei mir ist das ich Wörter die verdächtig sind nicht erkenne :( (LRS)
Aber ich werde mir mal mühe geben (versuchen).

zurück zum Thema:

Delphi-Quellcode:
pGroups := PTOKEN_GROUPS(GlobalAlloc(GPTR, sizeof(_SID_AND_ATTRIBUTES) * MaxGroups));
an der Stelle sagst du ja schon wie groß der Speicher ist ..

Delphi-Quellcode:
netzworklist := WlanAllocateMemory(SizeOf(Tndu_WLAN_AVAILABLE_NETWORK_LIST));
das geht bei mir nicht da ich erst nach dem Funtkions aufruf die größe im "netzworklist" mitgeteilt bekomme :(.

Olli 2. Sep 2007 01:07

Re: array [0..0] ?
 
Zitat:

Zitat von nitschchedu
Delphi-Quellcode:
.. , die dir verdächtig vorkommen. ..
Das ist zwar nett gemeint, aber das Problem bei mir ist das ich Wörter die verdächtig sind nicht erkenne :( (LRS)

Ist doch kein Beinbruch. Allerdings könnte das eben auch ein Grund dafür sein, daß du das in deiner Signatur beschriebene Problem hast. Geh offener mit deiner LRS um, und ich vermute man wird dir die Fehler verzeihen und ggf. eher nochmal nachfragen statt sich über die Rechtschreibung zu beschweren. Leider gibt es nämlich nicht nur jene, die eine LRS haben, sondern auch solche die keine haben, sich aber teils schlimmer als Leute mit LRS geben.

Zitat:

Zitat von nitschchedu
das geht bei mir nicht da ich erst nach dem Funtkions aufruf die größe im "netzworklist" mitgeteilt bekomme :(.

Und ein zweiter Aufruf ist verboten? Alternativ könntest du doch auch mehr Speicher (als sizeof(...)) anfordern und bekommst dann eben nur eine bestimmte Anzahl von Ergebnissen zurück. Ich scheine da aber was zu übersehen.

nitschchedu 2. Sep 2007 17:28

Re: array [0..0] ?
 
Soll ich mal das Test Projekt Posten, vieleicht sieht man da ehr das Problem ?

Olli 2. Sep 2007 17:42

Re: array [0..0] ?
 
Wäre sicher keine schlechte Idee ;)

Allerdings habe ich bis mindestens Ende Oktober kein Delphi zur Verfügung.

nitschchedu 2. Sep 2007 18:41

Re: array [0..0] ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli
Wäre sicher keine schlechte Idee ;)

Allerdings habe ich bis mindestens Ende Oktober kein Delphi zur Verfügung.

Turbo Delphi gibts doch kostenlos soweit ich weiß ^^.

Projekt im Anhang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz