28. januar 2002 - 20:43Der er
51 kommentarer og 2 løsninger
Undersøge computernavn
Jeg har en lang declaration:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Herefter har jeg en hændelse:
Private Sub Absalon_Click(Index As Integer) Call ShellExecute(0&, vbNullString, "http://www.adr01.dk", vbNullString, vbNullString, vbNormalFocus) End Sub
Denne fil vil jeg gerne lægge ud på brugernes pc'ere. Når de trykker på knappen, skal den gå på nettet, men den skal gå på deres egen hjemmeside. Hvis jeg ved hvilket computernavn maskinen har, så kender jeg også brugerens hjemmeside.
Nu er der andre brugere, som skal have denne fil, og deres pc'ere vil selvfølgelig ikke figurere på listen over computernavne. Hvis computernavnet ikke er lig med listen, skal den åbne en default side, som jeg kan angive. Håber på masser af respons :o)
If ComputerNavn = Computernavn01 Then Åbn Hjemmeside01.dk If ComputerNavn = Computernavn02 Then Åbn Hjemmeside02.dk If ComputerNavn = Computernavn03 Then Åbn Hjemmeside03.dk Else Åbn DefaultHjemmeside.dk End If End If End If
Private Const MAX_COMPUTERNAME_LENGTH = 31 Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Function VBGetComputerName() As String Dim sBuf As String, iActualLen As Long sBuf = String(MAX_COMPUTERNAME_LENGTH + 1, 0) iActualLen = Len(sBuf) GetComputerName sBuf, iActualLen VBGetComputerName = Left$(sBuf, iActualLen) End Function
Når man alligevel er i gang med at erklære API-funktioner, så vil jeg 100% foretrække en API yderligere i forhold til at skulle inddrage en eller anden OCX.
Nu bliver jeg lige i tvivl.... Det er computernavnet på den computer som applikation kører på du vilhave fat i ik?? Eller er det en metode til at start Explorer med en bestemt internet adr.??
Tjo... Jeg tror måske at der er noget her!! En af disse API'er:
Public Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName As Long) As Long
Public Declare Function WNetGetUniversalName Lib "mpr" Alias "WNetGetUniversalNameA" (ByVal lpLocalPath As String, ByVal dwInfoLevel As Long, lpBuffer As Any, lpBufferSize As Long) As Long
Public Declare Function WNetGetUser Lib "mpr.dll" Alias "WNetGetUserA" (ByVal lpName As String, ByVal lpUserName As String, lpnLength As Long) As Long
Ellers er det altså lige så smart at bruge VB's funktioner... I WinSock'en er der også en masse andre gode informationer om maskinen og evt. remote-maskinen! Det er let i hvert fald... Men det bestemmer Steen jo!!!
Det komme an på hvad, du vil. De kontroller, som leveres med VB, er meget ofte lavet oven på generiske windows kontroller og lignende. Men Microsoft har ikke givet alle deres muligheder videre til VB-programmørerne. Derfor er der mange muligheder for at fifle med kontrollerne via API.
De generiske (intrisic) kontroller som TextBox, Label osv. er standard windows kontroller. De kan gendannes 100% (og bedre) via API
Common Controls er også kald igennem til andre dll'er og kan laves 100% via API. Jeg har f.eks. leget med at lave mig eget listview gennem 100% API i VB. Det virker faktisk fint.
Jeg havde håbet på NOGET respons (har ikke haft så gode erfaringer mht. respons de seneste dag). Men det her er jo overvældende! :o)
Jeg vil gerne have, at programmet tjekker computernavnet. Når jeg (programmet) har computernavnet, ved jeg (programmet) også hvilken side, der skal være default, når man trykker på knappen. Hvis computerens navn = ComputerNavn01, skal http://www.hjemmeside01.dk starte, når man trykker på kommando-knappen. De første 18 brugere har en hjemmeside. Dermed er der 18 computernavne og 18 hjemmesider.
Hvis bruger nr. 19 (og frem) trykker på knappen, skal http://www.EnGivenSide.dk starte op, altså ikke nogen af de 18 hjemmesider, men en nittende. Håber det er forståeligt?
For at kunne finde frem til brugerens hjemmeside-adresse, skal jeg bruge pc'ens navn:
Bruger01's pc har navnet ComputerNavn01 Bruger02's pc har navnet ComputerNavn02 . . Bruger18's pc har navnet ComputerNavn18
Når Bruger03 trykker på knappen, skal programmet se efter computernavnet, som i dette tilfælde er ComputerNavn03. Derfor skal programmet så åbne brugerens egen hjemmeside, som har adressen http://www.adr03.dk.
Øverst har jeg lavet lidt kode, som peger på en given adresse. Men andet gør den ikke. Jeg vil gerne finde ud af, hvordan jeg får programmet til at se efter ComputerNavn, og ud fra det åbne http://www.adrXX.dk, alt afhængig af computerens navn.
Jeg kan ikke bare sætte en side op, for bliver pc'en flyttet, og computernavnet dermed ændret, så passer forholdene jo ikke længere. Kryptisk? :o)
- Bruger01 har en pc - Bruger01 trykker på knappen - Programmet ser efter computernavnet og finder frem til ComputerNavn01 - http://www.adr01.dk åbnes i MSIE
- Bruger02 har en anden pc - Bruger02 trykker på knappen - Programmet ser efter computernavnet og finder frem til ComputerNavn02 - http://www.adr02.dk åbnes i MSIE
etc. etc. etc....
- Bruger 19 har en 19. pc - Bruger19 trykker på knappen - Programmet ser efter computernavnet og finder frem til ComputerNavn19 - http://www.DefaultHjemmeside.dk åbnes i MSIE
- Bruger 20 har en 20. pc - Bruger20 trykker på knappen - Programmet ser efter computernavnet og finder frem til ComputerNavn20 - http://www.DefaultHjemmeside.dk åbnes i MSIE
Her har du koden der starter hjemmesiden, hvis altså computernavnet ender med et tal... og hvis den ikke gør det må du jo spørge igen og lige skrive hvordan du så ved om det er en af de 18 computere:
Option Explicit Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Const SW_SHOWNORMAL = 1
Private Sub startHjemmeside() Dim tmpName As String, valName As Integer, URL As String, Success As Long
Jeg vil så lige sige at det der API-kald GetComputerName synes jeg ikke rigtig jeg kan få til at virke så jeg har brugt komponentet: Micosoft Winsock Control 6.0 - den er smart!!! :o)
Private Const MAX_COMPUTERNAME_LENGTH = 31 Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Function VBGetComputerName() As String Dim sBuf As String, iActualLen As Long sBuf = String(MAX_COMPUTERNAME_LENGTH + 1, 0) iActualLen = Len(sBuf) GetComputerName sBuf, iActualLen VBGetComputerName = Left$(sBuf, iActualLen) End Function
Private Sub Command1_Click() MsgBox "Din computer hedder: " & VBGetComputerName End Sub
Kør programmet og tryk på Command1. Hvad skriver msgbox'en?
Det er da lige så besværligt at inkludere WinSock i projektet, huske at få den med i installationsprogram og være sikker på, at få de filer med, som den er afhængig af.
Og så er der et andet program, som lægger en ikke-kompatibel version af WinSock.ocx (?) ind :-/
Hvordan vil du så bruge programmet på en computer uden Visual Basic eller lignende (hint: MSWINSCK.OCX bliver installeret sammen med Visual Basic og er sidst rettet i Service Pack 5)
Du er forældet... MSWINSCK.OCX er med i alle nyere windows!!!!! Og hvis den ikke er er det ikke nødvendig med et langsomt installationsprogram der fylder - kun MSWINSCK.OCX!!!!!
Nå men hvis du hellere vil bruge API Steen så ser koden således ud med Benny's metode indraget:
Option Explicit Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Success = ShellExecute(0&, vbNullString, URL, vbNullString, "C:\", SW_SHOWNORMAL) End Sub
Public Function VBGetComputerName() As String Dim sBuf As String, iActualLen As Long sBuf = String(MAX_COMPUTERNAME_LENGTH + 1, 0) iActualLen = Len(sBuf) GetComputerName sBuf, iActualLen VBGetComputerName = Left$(sBuf, iActualLen) End Function
Jeg vil anbefale dig at få opdateret din viden. Jeg har lige undersøgt tre computere, hvor der IKKE er installeret VB på. Det var en Win98 SE, en Win2000 SP1 og en Win XP Pro. INGEN af disse havde mswinsck.ocx installeret.
Ud over en beta af Whistler findes der ikke nyere versioner af windows end XP.
I øvrigt er din måde at distribuere programmer ikke god med windows. Der kan være andre dll'er, som en ocx er afhængig af. De kommer ikke med, hvis du bare smider filen af sted uden videre. Desuden skal den registreres, og det tager installationsprogrammet hånd om.
Ja ja... jeg ved ikke hvor du har dine informationer fra men jeg har da i hvert fald lige stået for indkøb af 20 PC'ere hvor der er WinXP og ikke VB og her er mswinsck.ocx samt nogle andre også!!!
og lige et hint... så er mswinsck.ocx ikke afhængig af andre .dll-filer!!!
Men lad os nu koncentrere os om at hjælpe Steen! ;o)
Som jeg sagde, installation under windows er farlig uden et installationsprogram. Godt nok er der nye tider undervejs med VS.NET, men så længe, vi arbejder med VB6 eller før, så må vi mindst igennem P&D Wizard.
Alt det er ikke nødvendigt ved brug af API.
Fra MSDN om GetComputerName :
Requirements Windows NT/2000/XP: Included in Windows NT 3.1 and later. Windows 95/98/Me: Included in Windows 95 and later. Header: Declared in Winbase.h; include Windows.h. Library: Use Kernel32.lib. Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000/XP. Also supported by Microsoft Layer for Unicode.
Vi har altså 100% sikkerhed for, at GetComputerName vil virke i et VB6 program.
JAMEN! Ærgeligt, at jeg ikke jar haft tid til at deltage i debatten i dag! :o)
Ja, de 18 brugere har en hjemmeside. Når man trykker på knappen, skal deres egen hjemmeside åbne op. Fra nr. 19 og fremefter, skal http://www.DefaultSide.dk åbne op, når de trykker på knappen. Det er ikke nødvendigt med en messagebox. Det er kun Bruger01, som har computeren med ComputerNavn01, der skal kunne åbne http://www.adr01.dk op.
Jeg vil lige prøve at nærlæse Jeres svar og prøve det af efter aftensmaden. Men foreløbig en million milliard tak. Det er IMPONERENDE! :o)
Men hvis computernavnet højst må indeholde karakterer, hvad så? Det er meningen at de 18 computere skal have en DSL-forbindelse på et tidspunkt og via en VPN-klient kunne logge ind på vores server. Og her skal de benytte samme logon på deres lokale pc med Windows 2000, som de er registreret med på serveren. Og det navn må højst indeholde 8 karakterer. Derfor har alle computerne fået navnene user01 - user02 - user03 ... user18. Det er derfor jeg indledte med denne her:
If ComputerNavn = Computernavn01 Then Åbn Hjemmeside01.dk If ComputerNavn = Computernavn02 Then Åbn Hjemmeside02.dk If ComputerNavn = Computernavn03 Then Åbn Hjemmeside03.dk Else Åbn DefaultHjemmeside.dk End If End If End If
select case VBGetComputerName case "Navnet på Computer 1" Åbn Hjemmeside01.dk case "Navnet på Computer 2" Åbn Hjemmeside02.dk ... case else Åbn DefaultHjemmeside.dk end select
Jeg er ikke helt sikker på at jeg forstår dit sidste spørgsmål! Skal det forståes såden at du ikke styrer hvad bruger-computernes navne er, og hvis længden af deres navne er større end 8 så går det ikke?? Hvis det er det så kunne du registre de f.eks. 4 bogstaver i computernavnet sammen med det tal fra 1 til 18! altså:
<Database> = Left$(Computernavn, 4) & valNavn
Hvis det ikke var sådan du havde forestillet dig så kan du sende en kopi af programmet til mig, så kigger jeg gerne på det! Min e-mail er: DenRud@hotmail.com
Jeg har desværre været afskåret fra at prøve det af. Men jeg vil kigge på det, når tiden tillader det. Jeg vender lige tilbage med resultatet :o)
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.