|
| Sytemdir Fra : Anders Lund |
Dato : 29-05-01 13:14 |
|
Med Environ("windir") kan jeg finde windows mappen, hvad hedder det når jeg
vil finde system mappen.
| |
Chris (29-05-2001)
| Kommentar Fra : Chris |
Dato : 29-05-01 14:06 |
|
On Tue, 29 May 2001 14:13:57 +0200, "Anders Lund"
<webmaster@123grin.dk> wrote:
>Med Environ("windir") kan jeg finde windows mappen, hvad hedder det når jeg
>vil finde system mappen.
Med API kan du bruge denne funktion: GetSystemDirectory
Så simpelt som at klø sig i r****.
Hygge
Chris
| |
Anders Lund (29-05-2001)
| Kommentar Fra : Anders Lund |
Dato : 29-05-01 22:34 |
|
"Chris" <dsl3353@vip.cybercity.dk> wrote in message
news:3b139e6e.27641480@news.cybercity.dk...
> On Tue, 29 May 2001 14:13:57 +0200, "Anders Lund"
> <webmaster@123grin.dk> wrote:
>
> >Med Environ("windir") kan jeg finde windows mappen, hvad hedder det når
jeg
> >vil finde system mappen.
>
> Med API kan du bruge denne funktion: GetSystemDirectory
> Så simpelt som at klø sig i r****.
Og,, lige precis hvordan????? Jer er rimelig newbie
mvh
Anders Lund
| |
Bjarke Walling Peter~ (29-05-2001)
| Kommentar Fra : Bjarke Walling Peter~ |
Dato : 29-05-01 23:38 |
|
"Anders Lund" <webmaster@123grin.dk> skrev i en meddelelse
news:9f14l4$2fn$1@sunsite.dk...
>
> "Chris" <dsl3353@vip.cybercity.dk> wrote in message
> news:3b139e6e.27641480@news.cybercity.dk...
> > On Tue, 29 May 2001 14:13:57 +0200, "Anders Lund"
> > <webmaster@123grin.dk> wrote:
> >
> > >Med Environ("windir") kan jeg finde windows mappen, hvad hedder det
når
> jeg
> > >vil finde system mappen.
> >
> > Med API kan du bruge denne funktion: GetSystemDirectory
> > Så simpelt som at klø sig i r****.
> Og,, lige precis hvordan????? Jer er rimelig newbie
Jeg vil umiddelbart mene at følgende eksempel skulle give en messagebox med
stien til system-mappen...
Private Declare Function GetSystemDirectory Lib "kernel32" _
Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Sub Form_Load()
Dim mappe As String
GetSystemDirectory mappe, 256
If InStr(mappe, vbNullChar) <> 0 Then
mappe = Left(mappe, InStr(mappe, vbNullChar) - 1)
End If
MsgBox mappe
End Sub
.... men af en eller anden grund giver den ikke noget resultat ved mig. Jeg
får bare en tom streng (dvs. mappe="" )...
- Bjarke Walling Petersen
> mvh
> Anders Lund
>
>
| |
Chris (30-05-2001)
| Kommentar Fra : Chris |
Dato : 30-05-01 07:25 |
|
On Wed, 30 May 2001 00:37:31 +0200, "Bjarke Walling Petersen"
<bwp@bwp.dk> wrote:
>Jeg vil umiddelbart mene at følgende eksempel skulle give en messagebox med
>stien til system-mappen...
>
>Private Declare Function GetSystemDirectory Lib "kernel32" _
> Alias "GetSystemDirectoryA" _
> (ByVal lpBuffer As String, _
> ByVal nSize As Long) As Long
>Private Sub Form_Load()
> Dim mappe as String
> GetSystemDirectory mappe, 256
> If InStr(mappe, vbNullChar) <> 0 Then
> mappe = Left(mappe, InStr(mappe, vbNullChar) - 1)
> End If
> MsgBox mappe
>End Sub
>
>... men af en eller anden grund giver den ikke noget resultat ved mig. Jeg
>får bare en tom streng (dvs. mappe="" )...
Jeg kan desværre ikke lige prøve dit eksempel, da jeg ikke har min VB
compiler installeret.
Dog lavede jeg nummeret i C uden alle mulige dikkedarer:
TCHAR mappe[256];
GetSystemDirectory (mappe, 256);
MessageBox (NULL, mappe, "Sti til System", MB_OK);
....og det virker fint.
Mon ikke det burde kunne klares så simpelt:
Dim mappe as String
GetSystemDirectory mappe, 256
MsgBox mappe
GetSystemDirectory returnerer en nultermineret streng, så det burde
ikke være nødvendigt at lede efter NULL pointeren i 'mappe'.
Hygge
Chris
| |
Bo Larsson (30-05-2001)
| Kommentar Fra : Bo Larsson |
Dato : 30-05-01 10:43 |
|
On Wed, 30 May 2001 06:24:32 GMT, dsl3353@vip.cybercity.dk (Chris)
wrote:
>On Wed, 30 May 2001 00:37:31 +0200, "Bjarke Walling Petersen"
><bwp@bwp.dk> wrote:
>
>>Jeg vil umiddelbart mene at følgende eksempel skulle give en messagebox med
>>stien til system-mappen...
>>
>>Private Declare Function GetSystemDirectory Lib "kernel32" _
>> Alias "GetSystemDirectoryA" _
>> (ByVal lpBuffer As String, _
>> ByVal nSize As Long) As Long
>>Private Sub Form_Load()
>> Dim mappe as String
>> GetSystemDirectory mappe, 256
>> If InStr(mappe, vbNullChar) <> 0 Then
>> mappe = Left(mappe, InStr(mappe, vbNullChar) - 1)
>> End If
>> MsgBox mappe
>>End Sub
>>
>>... men af en eller anden grund giver den ikke noget resultat ved mig. Jeg
>>får bare en tom streng (dvs. mappe="" )...
Da vi snakker om et API-kald (med C-strenge) skal du initialisere
strengen, inden du sender den over til funktionen. Fx:
mappe = String(256, 0) ' string with 256 NULLs
>
>Jeg kan desværre ikke lige prøve dit eksempel, da jeg ikke har min VB
>compiler installeret.
>
>Dog lavede jeg nummeret i C uden alle mulige dikkedarer:
>TCHAR mappe[256];
>GetSystemDirectory (mappe, 256);
>MessageBox (NULL, mappe, "Sti til System", MB_OK);
>
>...og det virker fint.
>
>Mon ikke det burde kunne klares så simpelt:
>Dim mappe as String
>GetSystemDirectory mappe, 256
>MsgBox mappe
>
>GetSystemDirectory returnerer en nultermineret streng, så det burde
>ikke være nødvendigt at lede efter NULL pointeren i 'mappe'.
>
VB arbejder ikke med nulterminerede strenge (men med BSTR). Derfor er
det nødvendigt at lede efter NULL'et - man kunne dog også bruge den
returværdi, som du får fra GetSystemDirectory, som netop indeholder
længden på den returnerede streng.
--
Bo Larsson
| |
Bjarke Walling Peter~ (30-05-2001)
| Kommentar Fra : Bjarke Walling Peter~ |
Dato : 30-05-01 18:05 |
|
"Bo Larsson" <booglea@isa.dknet.dk> skrev i en meddelelse
news:3b16bfcc.129975024@news.inet.tele.dk...
> On Wed, 30 May 2001 06:24:32 GMT, dsl3353@vip.cybercity.dk (Chris)
> wrote:
>
> >On Wed, 30 May 2001 00:37:31 +0200, "Bjarke Walling Petersen"
> ><bwp@bwp.dk> wrote:
> >
> >>Jeg vil umiddelbart mene at følgende eksempel skulle give en messagebox
med
> >>stien til system-mappen...
> >>
> >>Private Declare Function GetSystemDirectory Lib "kernel32" _
> >> Alias "GetSystemDirectoryA" _
> >> (ByVal lpBuffer As String, _
> >> ByVal nSize As Long) As Long
> >>Private Sub Form_Load()
> >> Dim mappe as String
> >> GetSystemDirectory mappe, 256
> >> If InStr(mappe, vbNullChar) <> 0 Then
> >> mappe = Left(mappe, InStr(mappe, vbNullChar) - 1)
> >> End If
> >> MsgBox mappe
> >>End Sub
> >>
> >>... men af en eller anden grund giver den ikke noget resultat ved mig.
Jeg
> >>får bare en tom streng (dvs. mappe="" )...
>
> Da vi snakker om et API-kald (med C-strenge) skal du initialisere
> strengen, inden du sender den over til funktionen. Fx:
>
> mappe = String(256, 0) ' string with 256 NULLs
Nu virker det sørme! Men så vidt jeg ved er det ikke alle funktioner, hvor
man først skal initialisere strengen. Hvordan kan det være?
- Bjarke Walling Petersen
> >
> >Jeg kan desværre ikke lige prøve dit eksempel, da jeg ikke har min VB
> >compiler installeret.
> >
> >Dog lavede jeg nummeret i C uden alle mulige dikkedarer:
> >TCHAR mappe[256];
> >GetSystemDirectory (mappe, 256);
> >MessageBox (NULL, mappe, "Sti til System", MB_OK);
> >
> >...og det virker fint.
> >
> >Mon ikke det burde kunne klares så simpelt:
> >Dim mappe as String
> >GetSystemDirectory mappe, 256
> >MsgBox mappe
> >
> >GetSystemDirectory returnerer en nultermineret streng, så det burde
> >ikke være nødvendigt at lede efter NULL pointeren i 'mappe'.
> >
>
> VB arbejder ikke med nulterminerede strenge (men med BSTR). Derfor er
> det nødvendigt at lede efter NULL'et - man kunne dog også bruge den
> returværdi, som du får fra GetSystemDirectory, som netop indeholder
> længden på den returnerede streng.
>
> --
> Bo Larsson
| |
Tomas Christiansen (30-05-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 30-05-01 22:54 |
|
Bjarke Walling Petersen skrev:
> "Bo Larsson" <booglea@isa.dknet.dk> skrev i en meddelelse
> news:3b16bfcc.129975024@news.inet.tele.dk...
> > On Wed, 30 May 2001 06:24:32 GMT, dsl3353@vip.cybercity.dk (Chris)
> > wrote:
> >
> > >On Wed, 30 May 2001 00:37:31 +0200, "Bjarke Walling Petersen"
> > ><bwp@bwp.dk> wrote:
> > >
> > >>Jeg vil umiddelbart mene at følgende eksempel skulle give en
messagebox
osv. osv. osv...
Ku' du ikke lige cutte lidt i det, som du quoter?
Det er et hestearbejde at finde det, som DU faktisk skriver!
> Nu virker det sørme! Men så vidt jeg ved er det ikke alle funktioner, hvor
> man først skal initialisere strengen. Hvordan kan det være?
Tjaaa... der ER jo forskel på de enkelte API-kald.
Det er derfor at man altid skal læse beskrivelsen af et API-kald inden man
bruger det.
Om GetSystemDirectory(lpBuffer,uSize) står der bl.a. tre ting, som jeg
finder interessante:
1. uSize bør være MINDST lige så stor som MAX_PATH (som i øjeblikket er sat
til værdien 260).
2. Hvis længden af den streng, som skal returneres, er større end bufferen
(værdien i uSize), returneres længden på den buffer, som skal til for at
indeholde hele strengen. Bemærk at normalt returneres ikke længden af
bufferen, men derimod længden af strengen (bufferen er 1 større p.gr.a.
null-termineringstegnet).
3. Hvis man bruger "a shared version of the operating system" (det tolker
jeg som Terminal Services), har applikationer ikke skriveadgang til
system-biblioteket, men skal i stedet bruge GetWindowsDirectory.
-------
Tomas
| |
Bjarke Walling Peter~ (31-05-2001)
| Kommentar Fra : Bjarke Walling Peter~ |
Dato : 31-05-01 18:18 |
|
Tomas Christiansen skrev:
> Ku' du ikke lige cutte lidt i det, som du quoter?
> Det er et hestearbejde at finde det, som DU faktisk skriver!
Jeg kan da prøve!
> Om GetSystemDirectory(lpBuffer,uSize) står der bl.a. tre ting, som jeg
> finder interessante:
>
> 1. uSize bør være MINDST lige så stor som MAX_PATH (som i øjeblikket er
sat
> til værdien 260).
Er MAX_PATH-værdien bare et tal man selv skal slå op eller er det noget man
kan få programmet til at hente?
Og hvis man kan få programmet til at hente det: Hvordan henter man det?
> 2. Hvis længden af den streng, som skal returneres, er større end bufferen
> (værdien i uSize), returneres længden på den buffer, som skal til for at
> indeholde hele strengen. Bemærk at normalt returneres ikke længden af
> bufferen, men derimod længden af strengen (bufferen er 1 større p.gr.a.
> null-termineringstegnet).
>
> 3. Hvis man bruger "a shared version of the operating system" (det tolker
> jeg som Terminal Services), har applikationer ikke skriveadgang til
> system-biblioteket, men skal i stedet bruge GetWindowsDirectory.
Hvad er Terminal Services helt præcis?
Er "a shared version of the operating system" ikke bare Win2k eller NT, hvor
der kan være flere brugere der bruger det?
- Bjarke Walling Petersen
| |
Tomas Christiansen (31-05-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 31-05-01 22:57 |
|
Bjarke Walling Petersen skrev:
> Jeg kan da prøve!
Ingen er jo forpligtet over evne...
> Er MAX_PATH-værdien bare et tal man selv skal slå op eller er det noget
man
> kan få programmet til at hente?
> Og hvis man kan få programmet til at hente det: Hvordan henter man det?
En C-programmør ville jo straks sige at det er en værdi, som programmet
"selv" kan hente, idet det er én af de mange konstanter, som er defineret i
én af de mange header-filer, som man bruger, når man ønsker at benytte sig
af Microsofts API'er. For VB-folk er det straks lidt sværere.
Hvis du starter programmet API Viewer, og indlæser filen WIN32API.TXT, har
du under API Type=Declares mulighed for at se den aktuelle værdi af
MAX_PATH. Værdien kan jo meget vel tænkes at ændre sig i fremtiden, men så
er der sikkert så meget andet, som skal laves om.
Den "rigtige" måde at gøre det her på må vel være selv at definere en
konstant:
Public Const MAX_PATH As Long = 260
og benytte den i sine programmer. Derved signalerer man overfor andre
programmører (og over for sig selv en gang i fremtiden) at man har undersøgt
sagerne, og at man ved hvad man gør.
> Hvad er Terminal Services helt præcis?
> Er "a shared version of the operating system" ikke bare Win2k eller NT,
hvor
> der kan være flere brugere der bruger det?
De to mest aktuelle versioner er "Windows NT Server 4.0, Terminal Server
Edition" og "Terminal Services" under Windows 2000. Der kan være tale om et
add-on produkt som kører ovenpå Terminal Server/Terminal Services, f.eks.
Citrix MetaFrame.
Princippet i det er at mange brugere kan logge på den samme server på samme
tid, og man afvikler sine programmer på serveren i stedet for på sin egen
computer. Kun tastetryk, billeder (og evt. lyd m.m) sendes mellem klient og
server.
Det giver noget værre rod, hvis det er muligt at opdatere
system-biblioteket, idet det bruges af alle (på samme tid). I stedet har
alle hver deres egen kopi af Windows biblioteket - eller rettere: de filer
som er brugerspecifikke, ligger i et brugerspecifikt Windows bibliotek.
Grunden til at jeg nævner det er, at der efterhånden er mange (og der kommer
hele tiden flere til), som benytter sig af Terminal Services, og der er ikke
noget, som er mere irriterende end når man skal prøve at få et program til
at fungere, som f.eks. absolut VIL opdatere system biblioteket, absolut VIL
have at der skal være et C-drev eller andre "sjove" ting.
Hvis man ønsker at lave kommercielle programmer gør man klogt i at læse
Microsofts specifikationer og anvisninger - og følge dem. Ellers vil de ikke
virke ordentligt på mange installationer.
Hvis man blot laver programmer for egen fornøjelses skyld, nå, ja, så har
jeg da i det mindste gjort opmærksom på at der kan være visse problemer, men
ikke mere end at det jo naturligvis kan løses hen ad vejen, hvis man en dag
står i situationen (hvis nogen overhovedet har gidet læse så langt i denne
smøre...
-------
Tomas
| |
Chris (01-06-2001)
| Kommentar Fra : Chris |
Dato : 01-06-01 16:35 |
|
On Thu, 31 May 2001 21:57:10 -0000, "Tomas Christiansen"
<toc@blikroer.removethis.dk> wrote:
>En C-programmør ville jo straks sige at det er en værdi, som programmet
>"selv" kan hente, idet det er én af de mange konstanter, som er defineret i
>én af de mange header-filer, som man bruger, når man ønsker at benytte sig
>af Microsofts API'er. For VB-folk er det straks lidt sværere.
I virkeligheden er MAX_PATH ikke en konstant, og det er IKKE noget
programmet selv kan hente.
I C er MAX_PATH en makro, som preprocessoren (en del af compileren)
bruger under oversættelsen af programkoden til binær kode. Selve
værdien af MAX_PATH er platform-afhængig, og for tiden er MAX_PATH på
en Windows platform meget rigtigt nævnt, 260.
Skal man være helt præcis, så findes MAX_PATH kun i Windows API. I C
hedder makroen skægt nok, PATH_MAX.
Men indtil Microsoft bestemmer sig til andet, så kan man blot roligt
erklære MAX_PATH til 260, som Tomas viste:
Public Const MAX_PATH As Long = 260
Hygge
Chris
| |
Tomas Christiansen (03-06-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 03-06-01 00:17 |
|
Chris skrev:
> I virkeligheden er MAX_PATH ikke en konstant, og det er IKKE noget
> programmet selv kan hente.
Nåe? Kan man måske ikke tildele en konstant eller en variabel denne værdi og
så bruge værdien den vej?
Okay, værdien kan så kun ændre sig ved en re-kompilering, meen...
> I C er MAX_PATH en makro, som preprocessoren (en del af compileren)
> bruger under oversættelsen af programkoden til binær kode.
....
> Skal man være helt præcis, så findes MAX_PATH kun i Windows API. I C
> hedder makroen skægt nok, PATH_MAX.
I mit MSDN Library fandt jeg under _MAX_PATH følgende tekst:
"Path Field Limits
#include <stdlib.h>
....cut...
_MAX_PATH Maximum length of full path"
og i den STDLIB.H fil, som er på min computer, står der:
#define _MAX_PATH 260 /* max. length of full pathname */
Det ser i øvrigt ud til at hvis _MAC er defineret er _MAX_PATH kun 256.
Jeg har ikke været i stand til at finde hverken MAX_PATH (uden underscore
som første tegn) eller PATH_MAX defineret nogen stedet, men kan flere steder
finde at MS selv refererer til MAX_PATH i deres C headerfiler, f.eks:
WCHAR lpwszName[MAX_PATH + 1]; // DLL name
-------
Tomas
| |
Bjarke Walling Peter~ (29-05-2001)
| Kommentar Fra : Bjarke Walling Peter~ |
Dato : 29-05-01 14:52 |
|
"Anders Lund" <webmaster@123grin.dk> skrev i en meddelelse
news:9f03qb$rs3$1@sunsite.dk...
> Med Environ("windir") kan jeg finde windows mappen, hvad hedder det når
jeg
> vil finde system mappen.
Man kan finde både windows-mappen og system-mappen sådan her:
Set fso = CreateObject("Scripting.FileSystemObject")
mappe = fso.GetSpecialFolder(x)
' x er et tal... jeg tror nok det er 1 og 2 du skal bruge.
Set fso = Nothing
.... dog forudsat at du har "Scripting.FileSystemObject"...
Men man kan selvfølgelig også bruge API, som Chris skriver.
- Bjarke Walling Petersen
| |
Asbjørn Sloth Tønnes~ (29-05-2001)
| Kommentar Fra : Asbjørn Sloth Tønnes~ |
Dato : 29-05-01 20:03 |
|
"Anders Lund" <webmaster@123grin.dk> skrev i en meddelelse news:9f03qb$rs3$1@sunsite.dk...
> Med Environ("windir") kan jeg finde windows mappen, hvad hedder det når jeg
> vil finde system mappen.
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As
Long) As Long
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As
Long) As Long
| |
|
|