sjensen>> Tak, men problemet er bare, at jeg ikke ved hvordan man bruger det. Jeg slog op i win32.hlp, og fandt det du skrev, men jeg ved ikke hvad jeg skal gøre med de ting der står. Jeg har tit hørt om Win API men har ikke vidst hvad det var, og hvordan det skal bruges. Håber du gider at svare mig med et eksempel, eller en instruktion i hvordan man bruger alle de der API funktioner.
Vedr. brugen af Win API funktioner. Du har ganske ret i, at det kan være en noget skræmmende oplevelse for en uøvet Delphi programmør at skulle gå igang med programmering Win API'et. Heldigvis skjuler Delphi selv langt de fleste Win API funktioner og variable - hvor tit har man fx. brug for at arbejde direkte med et Window handle. Næh dengang med "Borland Pascal for Windows v. 1.0"....
Selvom Win32.Hlp kan virke noget uforstålig så er den en ganske udemærket kilde, når man skal søge efter hvilke muligheder man har via Windows. Man skal ved en sådan søgning være klar over, at man tit skal sætte ordene Get eller Set foran det man søger. Fx. vil en søgning i Win32.Hlp på 'GetUser..' hurtigt give en henvisning til:
BOOL GetUserName( LPTSTR lpBuffer, // address of name buffer LPDWORD nSize // address of size of name buffer );
Og hvad er så det? - det er ihvertfald ikke Pascal! En erfaren programmør vil se at det der er C-syntax. Ikke så underligt, for Windows er skrevet i C og Win32.HLP er en helpfile skrevet af Microsoft til Windows programmøre, dvs. C-programmøre. I det aktuelle tilfælde vil man kunne se, at GetUserName er en funktion, der returnere en Boolean og tager to parametre: en pointer til en streng (null-terminated) og en 32 bit integer konstant. Hvad så med dem der ikke kan C og hvad med Delphi, der ikke kender den slags data typer - ihvertfald ikke med de samme navne? Her er svaret, at Borland har implementeret alle Win32API kald, datatyper og standard konstanter i Delphi. Langt de fleste er deklareret i Windows.Pas uniten. Hvordan finder man så ud af det? Nemt nok!. Man skriver først navnet på den pågældende funktion i Delphi editoren. Derefter Venstre-trykker man så med musen på navnet, mens man holder CTRL på tastaturet nede. Delphi vil nu springe til det sted i kildekoden hvor funktionen er erklæret, altså som regel til Windows.Pas. Her finder man linien:
function GetUserName; external advapi32 name 'GetUserNameA';
Denne linie fortæller at GetUserName ligger i et bibliotek kaldet AdvAPI32.DLL. Desuden er GetUserName et alias og at funktionens rigtige navn i biblioteket er GetUserNameA. I Windows.Pas søger man nu efter GetUserNameA. Dette resulterer i linien:
function GetUserNameA(lpBuffer: PAnsiChar; var nSize: DWORD): BOOL; stdcall;
Nu er vi endeligt ved noget der er mere alm. Delphi/pascal syntax. Funktionen har to parametre: lpBuffer er en PAnsiChar. Det er en anden måde at sige PChar, hvilket er en null-termineret string. Dette er i praksis det samme som addressen på en variabel der er erklæret som Array[0..x] Of Char; Delphi tilader desuden typecasts mellem String og PChar (Se i nedenstående eksempel).
Den anden parameter, nSize, er et DWORD. Venstre Click på dette ord (med CTRL nede), og man vil med det samme se, at en DWord er det samme som et LongWord, der er en standard Delphi type.
Tilsvarende kan man finde hvad BOOL egentligt er for en størrelse.
Nu hvor både funktionsnavnet og parameter typerne er på plads, kan vi lave et lille test program:
procedure TForm1.Button1Click(Sender: TObject); var nSize : LongWord; Buf : Array[0..50] Of Char; begin nSize := 50; // Sæt max-længde af buffer If GetUserName(@Buf, nSize) Then // Læs UserNavne via WinAPI og.. Label1.Caption := 'User: ' + String(Buf); // ..skriv det i Label1. end;
Hvis du, som jeg, hovedsagelgt arbejder under NT, så downloadede jeg engang nogle komponenter. Jeg kan ikke huske om jeg nogensinde fik brugt dem til et engentligt projekt, men de ser rimeligt imponerende ud. Sættet som jeg har hedder NTSet106_D4. Der er masser af eksempler og source kode med i sættet. Følgende er et udklip fra Help filen.
<Inset>
Contact information
TNTService, TNTEventLog, TNTUserMan, TNTShare, TNTFileSecurity, TNTRegSecurity are first in a row of components designed to use specific features of Windows NT™. This is the shareware version. Full version with source code is available for registered users.
sjensen >> Du skrev at det var en besværlig måde at få IP adressen, men ved du hvordan man gør, så vil jeg gerne høre... Det må du selvfølgelig også Delphi ;-)
Her er lige indholdet af en FAQ fra Inprise, der vedr. hvordan man finder IP-adressen på den maskine man arbejder på:
Question:
How do I get the local internet machine name and IP address?
Answer:
Getting the local machine name and IP address is a straight forward process that is most easily accomplished using the TCP component. Simply drop a TCP component from the internet page of the component palette on to a form, and access the following members of the TCP component:
If you prefer not to use the TCP component, here is an example that interfaces directly with your winsock layer:
uses Winsock;
procedure TForm1.FormCreate(Sender: TObject); var wVersionRequested : WORD; wsaData : TWSAData; begin {Start up WinSock} wVersionRequested := MAKEWORD(1, 1); WSAStartup(wVersionRequested, wsaData); end;
procedure TForm1.Button1Click(Sender: TObject); var p : PHostEnt; s : array[0..128] of char; p2 : pchar; begin {Get the computer name} GetHostName(@s, 128); p := GetHostByName(@s); Memo1.Lines.Add(p^.h_Name); {Get the IpAddress} p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^); Memo1.Lines.Add(p2); end;
procedure TForm1.FormDestroy(Sender: TObject); begin {Shut down WinSock} WSACleanup; end;
Det var noget af det.
Samtidig ved jeg at der findes TCP/IP sniffer programmer der viser de pakker der transporteres på netværket. Ved at nalysere dem kan man se hvilke ip-adresser der er aktive. Men jeg kan ikke huske hvor jeg har set det. Jeg kigger lidt mere og du hører fra mig senere.
SJensen> Hvis du kigger længere op, så vil du se, at: 1: Det svar allerede var givet en gang før og 2: Speedy ønsker at vide hvem der ellers er på nettet og deres IP addresser.
I øvrigt har jeg ladet mig fortælle, at Internet VCL komponenterne ikke altid er akurate. I et miljø med dynamisk tildeling af adresser, kan man tilsyneladende risikere, at den adresse komponenterne fortæller man har ikke er aktuel, men er den forrige adresse. Først hvis man sender/modtager med sin komponent, vil den opdatere sig selv og dermed vise den korrekte adresse.
Vedr. 2 så er jeg opmærksom på det og jeg prøver p.t. at huske hvor jeg har set det.
Det med at adrs. ikke altid er korrekte er der nok noget om, men når man får info. fra serveren bør de være korrekte.
Med winsock kan man lave et lille server program der kan vise alle forbundne IP-adresser, men det skal jo så køre på serveren og det har jeg ikke indtryk af at Speedy ønsker.
Det er jo muligt med små forskellige utility-programmer, hvor man kan sende en kort message af pop-up typen til en eller flere andre brugere på nettet, at se hvem der er logget på. Hvis disse programmer kan se hvem der er på nettet, så må det selvsagt også være muligt selv at få de tilsvarende oplyninger. Jeg ved at det er rimeligt nemt i et Novel net, men jeg har aldrig selv foretaget noget tilsvarende i NT-verdenen og jeg har desværre ikke tid til lige at rode med det her og nu.
Funktionen NetQueryDisplayInformation vil kunne give en liste over en masse ting, bl.a. brugere på nettet. Rutinen kræver, som de fleste andre Net-rutiner, adgang til NetAPI32.Dll, hvilket er ensbetydende med WinNT, og administrator rettigheder.
Andre interessante rutiner er NetGetAnyDCName // Find Server/domain name information. NetWkstaUserEnum // Info vedr. brugere på specifik workstations NetUserEnum // Få et hav af oplysninger om brugere på en server.
Umiddelbart er der ikke de store muligheder under Win95 med de alm. Win API kald. Der findes muligvis nogle rutiner på Delphi Superbase mv.
Tak for hjælpen igen, men nu accepterer jeg jer lige, for i gjorde hvad i kunne! Tak endnu engang!
Selvfølgelig må i gerne hvis i finder ud af noget skrive det herinde, men ellers er der ikke noget at gøre ved det.
Jeg synes bare det var smart hvis man kunne. Det er fordi jeg er ved at lave sænke slagskibe over netværk, og der ville det jo være rart for brugerne at de kunne se navnene på dem de kunne spille imod, i stedet for at de selv skal indtaste IP adressen på den de vil spille mod.
Se det kunne du jo bare ha' sagt. I såfald er løsningen bare at bruge en MailSlot component. Martin Djernæs har en på hans hjemmeside. Den har jeg omtalt i et tidligere svar (http://www.eksperten.dk/spm.asp?id=8120). Med en sådan komponent, kan har alle pc'ere i nettet, der køre samme application/mailslot, mulighed for at have et fælles 'kontakt punkt'. Det er så bare et spørgsmål for dig om at lave din application, således at de benytter en fælles protokol. Fx.: Programmet skal kunne placere en forespørgelse i mailsloten om at alle andre maskiner skal give sig tilkende. De andre programmer vil se denne besked og svare med deres lokale IP-addresse/bruger navn. Disse oplysninger benytter du så vidre i dit program...
NiP
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.