Sous XP ou Vista, si le contrôle de compte est actif ou si vous êtes en mode non-administrateur,
vous devez d'abord avoir les droits pour modifier ou placer des fichiers dans le repertoire racinne, etc
ainsi que des permissions pour écrire dans le registre à partir de HKEY_LOCAL_MACHINE entre autres,
ainsi que les droits pour enregistrer vos OCX ou DLL dans des programmes d'installation.
Comme Visual Basic ne peut pas créer un éxecutable qui demandera automatiquement ces droits à l'utilisateur,
la function suivante peut corriger cela.
Note: Il faut faire appel à cette function de préférence à l'initialisation du programme.
ça marche dès que le projet est compilé (logiquement)
24 août 2012 à 03:07
Pour :
sFile = "C:\tmptest123test123.tmp"
En plus de la remarque (pertinente) concernant la présence où non du lecteur C, quand on a l'UAC au maximum, il est interdit de créer des fichier à la racine du disque système ; Donc même si il existe, y aura plantage.
Utilises le dossier temporaire. 2 Solution :
Soit tu met ça dans un module :
Option Explicit
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Const MAX_PATH = 260
Public Function RepTemp() As String
Dim BuffRep As String
Dim ResltatLng As Long
BuffRep = String(MAX_PATH, 0)
RepTemp = IIf(GetTempPath(MAX_PATH, BuffRep) <> 0, Left(BuffRep, InStr(BuffRep, Chr(0)) - 1), "")
End Function
Soit tu utilise :
RepTemp = Environ("TEMP")
RepTemp renverra le dossier TEMP système.
<déterrage=off/>
19 sept. 2009 à 22:57
Comme il peut avoir du monde qui a installé Windows sur un autre lecteur (D:\, E:\, jamais vu) je crois que j'aurais mieux temps d'employer l'Api GetSystemDirectory et d'éssayer d'y écrire un fichier temporaire pour le test.
Sinon:
A$="Test" & Rnd * 6666
sKey$ = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Call RegSetString(HKEY_LOCAL_MACHINE, sKey, A$, "ok")
Doevents
If RegGetString(HKEY_LOCAL_MACHINE, sKey, A$) = "ok" then
'on a tous les droits administrateur disponibles
End If
Call RegDelValue(HKEY_LOCAL_MACHINE, sKey, A$)
19 sept. 2009 à 16:14
à savoir que dans tous les cas on peut avoir des droits dans certains dossiers et pas dans d'autres malgré une application démarrée en mode administrateur
bonne continuation
19 sept. 2009 à 14:56
La création d'un fichier TEMP dont le nom est donné par l'API GetTempFileName, ne permet pas de vérifier si on a le droit d'écrire sur la racinne de C:\. Par contre, on sait à l'avance qu'on a le droit d'écrire sur le fichier dont le nom a été donné par cette API. Ce n'est pas le but.
A la place d'écrire sur un fichier pour faire des testes, on pouvait écrire quelque part sur HKEY_LOCAL_MACHINE, et tester la valeur.
T'as bien raison quant à IF THEN ELSE, j'ai du supprimer deux lignes de code superflues après THEN pour simplifier la fonction. J'ai au moins laissé le comentaire.
En tout cas, merci pour les comentaires,
19 sept. 2009 à 12:57
pas testé mais il y a au moins 2 choses à modifier :
* ne pas exécuter la fonction (quitter) si le programme n'est pas compilé. pour çà tu peux tester le mode de l'application :
http://www.codyx.org/snippet_savoir-si-on-est-dans-ide_44.aspx#194
plus approprié que de tester len(dir(chemin))
* tu testes l'écriture de "C:\tmptest123test123.tmp". rien ne dit que la partition C existe. passe plutôt par la création d'un fichier dans TEMP, soit de la même manière avec un nom de fichier fixe :
http://www.codyx.org/snippet_recuperer-chemin-temp_772.aspx#2291
soit par un fichier TMP :
http://www.codyx.org/snippet_generer-nom-fichier-temporaire-unique_619.aspx#1876
ps :
if instr(...) then 'SI VRAI => RIEN
else 'SINON => ACTION
TON_CODE
pas besoin de tester de cette manière et de ne rien faire
if intr(...) = 0 then
TON_CODE
++
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.