Resources Bouton shell

NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010 - 23 juil. 2009 à 19:22
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010 - 21 août 2009 à 05:54
Kikoo, voila je cherche à exécuter un fichier registre *.reg incorporer dans l'application, lorsque je clique sur un des bouton de ma form.

J'ai donc réussi à exécuter mon fichier registre sans l'incorporer (c:\myapps\reg)

Mais lorsque que je l'incorpore dans ressource, et que je clic sur mon bouton il me dit que le fichier et introuvable.

Ma question es la suivant:

Qu'elle es le code qui me permettra d'exécuter mon fichier registre au préalable incorporer dans mes ressources ?

J'ai essayer ceci mais sa ne passe pas.

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        '    Shell("Regedit C:\MyApss\Reg\Monreg.reg") *Cette commande fonctionne)*
       ' Shell(My.Resources.Monreg) *Celle ci ne fonctionne pas*
        Shell("Regedit & My.Resources.Monreg") *Celle ci lance bel et bien l'inscription registre mais lorsque que j'accepte l'inscription, j'ai une erreur me disant qu'il ne trouve pas le fichier en question*
    End Sub


Voila je suis un peu perdu, quelqu'un pour m'éclairez ?

16 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
23 juil. 2009 à 22:42
salut,
comment veux-tu executer un fichier (executable) qui n'existe pas?...
le message d'erreur est clair

tu dois extraire le fichier pour pouvoir le lancer

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        Dim sRegPath As String = System.IO.Path.Combine(System.IO.Path.GetTempPath, "tmp_reg_vb9.reg")
        My.Computer.FileSystem.WriteAllBytes(sRegPath, My.Resources.Monreg, False)
        System.Diagnostics.Process.Start(sRegPath)
    End Sub

++
[hr]
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
24 juil. 2009 à 12:32
Mais pourquoi sont il si méchant xD PARCEQUE ! ! ! ! non je plaisante ;)

Super merci je vais essayer ceci, cependant vous me dites que le message semblai clair, oui certes il l'était, je chercher justement à faire en sorte de mettre en dossier temp le fichier reg pour pouvoir l'exécuter.

J'ai donc tester votre code et il ne fonctionne pas, il me souligne "My.Resources.Monreg" et m'indique ceci "Une valeur de type 'String' ne peut pas être convertie en 'Tableau à 1 dimension(s) de Byte'.

Sa va vous sembler évident à vous, mais personnellement je ne voit pas, je débute essayer d'être indulgent.

Merci ;)
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 juil. 2009 à 12:59
méchant? mais non

pareil, le message est clair : tu dis vouloir executer un fichier reg que tu as incorporé dans tes ressources, mais de toute évidence tu as incorporé une chaine et non un fichier
peut-être même que la chaine est le chemin du fichier, dans les 2 cas çà ne correspond pas à ta question...

le code que je t'ai donné consiste à extraire le fichier *.reg réel, intégré à tes ressources, vers TEMP, puis à l'executer avec le programme associé (regedit)

il faut que tu refasses ta ressource
++
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
25 juil. 2009 à 09:17
Ok oui j'avais bien compris l'action de ton code (quand meme :p)

Et oui je me doute que cela vient de ma ressources, j'ai incorporer mon reg via propriété de mon projet, ressource, ajouter un fichier, je lui es donc indiquez l'emplacement de mes reg, le reg apparait bien dans mes ressources (propriété du projet, ressources ) par contre mon fichier reg incorporé apparait comme fichier texte c'est normal ? (mis a part qu'il retire l'extension)

Comment je fait pour refaire ma ressources du coup si ma façon de faire n'est pas bonne ?

Je ne comprend toujours pas pourquoi j'ai cette erreur, qu'est ce que ce tableau ?
"Erreur 1 Une valeur de type 'String' ne peut pas être convertie en 'Tableau à 1 dimension(s) de Byte'. My.Resources.Monreg"

Si vous pouviez m'éclairer un peu plus svp :)

NvZ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 juil. 2009 à 09:44
ok... reportons nous (encore) au message indiqué : la ressource est prise comme du texte STRING et non BYTES()
donc :
My.Computer.FileSystem.WriteAllText(sRegPath, My.Resources.Monreg, False)
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
25 juil. 2009 à 12:43
Super merci

Ok effectivement tout bête il suffit de connaitre, donc plus d'erreur cependant, le fichier s'ouvre avec notepad au lieu de s'exécuter. Il a pas moyen de le faire passer par regedit ?
0
phila38 Messages postés 11 Date d'inscription jeudi 23 juillet 2009 Statut Membre Dernière intervention 25 juillet 2009
25 juil. 2009 à 13:49
Ben décidément...

My.Computer.FileSystem.WriteAllText(sRegPath, My.Resources.Monreg, False)
Shell("Regedit " & sRegPath)
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
28 juil. 2009 à 09:22
Arf merci mais sa ne fonctionne toujours pas, regedit s'ouvre bien pour enregistrer le fichier reg seulement il m'indique qu'il ne trouve pas le fichier, car en fait il cherche c:\document & settings\ etc etc, lui s'arrête à l'espace.

J'ai essayer de mettre sRegPath entre guillemet mais sa ne change rien, mis à part que le sRegPath ne sert a rien.

J'ai opté pour la façon sw.writeline puis exécution du reg par la commande shell en attendant, si vous avez des solutions je suis preneur.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 juil. 2009 à 09:26
j'avais mis : System.Diagnostics.Process.Start(sRegPath)
s'il lance notepad, force !

System.Diagnostics.Process.Start("regedit.exe", sRegPath)
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
28 juil. 2009 à 09:57
Erf oui j'ai aussi essayer comme ceci. Bon voila ce que j'ai:

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

        Dim sRegPath As String = System.IO.Path.Combine(System.IO.Path.GetTempPath, "tmp_reg_vb6.reg")

        My.Computer.FileSystem.WriteAllText(sRegPath, My.Resources.MonReg, False)

        System.Diagnostics.Process.Start("regedit.exe", sRegPath)

    End Sub


Donc la fenêtre d'inscription registre s'ouvre bel et bien, mais il veut inscrire "C:\Documents" puis "and" puis Settings\MyAccountWindows\Local" puis "Settings\Temp\tmp_reg_vb6.reg"

Tu voit ce que je dire ? il me demande d'inscrire des morceaux de chemin parce qu'il ne calcule pas qu'il y a des espaces dans le chemin temporaire du reg.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 juil. 2009 à 10:42
alors conversion SHORTPATH ?

'http://www.codyx.org/snippet_recuperer-chemin-fichier-format-short-meme-si-fichier_443.aspx#1521
<System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError:=True, _
  CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function GetShortPathName(ByVal Path As String, _
  ByVal ShortPath As System.Text.StringBuilder, _
  ByVal ShortPathLength As Integer) As Integer
End Function
Shared Function GetShortPathName(ByVal Path As String) As String
  Dim shortPath As New System.Text.StringBuilder(255)
  GetShortPathName(Path, shortPath, shortPath.Capacity)
  Return shortPath.ToString()
End Function



System.Diagnostics.Process.Start(GetShortPathName(sRegPath))
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
31 juil. 2009 à 06:05
J'ai donc refait une form au propre avec un bouton pour essayer, et voici ce que sa donne, il trouve bien le reg et l'ouvre avec le registre cependant j'ai cette erreur:




    Shared Function GetShortPathName_CreateDestroy(ByVal Path As String) As String
        Dim fCreate As Boolean = Not System.IO.File.Exists(Path)
        If fCreate Then System.IO.File.Create(Path).Dispose()
        Dim shortPath As String = GetShortPathName(Path)
        If fCreate Then System.IO.File.Delete(Path)
        Return shortPath
    End Function
    Shared Function GetShortPathName(ByVal Path As String) As String
        Dim shortPath As New System.Text.StringBuilder(255)
        GetShortPathName(Path, shortPath, shortPath.Capacity)
        Return shortPath.ToString()
    End Function
    <System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError:=True, _
      CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function GetShortPathName(ByVal Path As String, _
      ByVal ShortPath As System.Text.StringBuilder, _
      ByVal ShortPathLength As Integer) As Integer
    End Function
    '
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim sRegPath As String = System.IO.Path.Combine(System.IO.Path.GetTempPath, "Codeur.reg")

        My.Computer.FileSystem.WriteAllText(sRegPath, My.Resources.Codeur, False)

        'System.Diagnostics.Process.Start(GetShortPathName(sRegPath)) *Celui ci ouvre le fichier avec notepad je l'ai donc "forcer".
        System.Diagnostics.Process.Start("regedit.exe", GetShortPathName(sRegPath))
    End Sub



Voici mon fichier .reg (qui fonctionne si je l'écrit manuellement dans un fichier texte)

Nom du fichier: Codeur.reg
Windows Registry Editor Version 5.00
; Test Registre Codeur
;  Codeur Registre Test


Je précise aussi que j'ai intégrée le fichier reg via l'interface ressources, ajouter un fichier... (d'ailleurs il me signal qu'il ne prend pas en charge cette extension de fichier, je ne sais pas s'il faut y prêter attention)
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 10:27
que de péripéties pour rien au final....

ton fichier est vide, comment veux tu que le registre l'importe!

reprenons depuis le début : tu veux faire quoi?
écrire dans le registre en passant par un fichier pour ne pas avoir à utiliser la classe registre du framework?
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
31 juil. 2009 à 17:13
Salut et merci pour ton aides.


tu veux faire quoi?
écrire dans le registre en passant par un fichier pour ne pas avoir à utiliser la classe registre du framework?


Voila, je souhaite dans une form avoir différent bouton avec chacun d'entre eux un fichier registre attitré. Je souhaiterai aussi que les fichiers registre soit incorporer à l'exécutable. Donc jusque la je pense que tu me suit.

Ok donc, j'ai modifier mon fichier registre avec une inscription visible sur le clic droit du poste de travail.(Bouton 1 Inscription et Bouton 2 Désinscription)
C'est donc sans danger pour le registre si tu souhaite essayer.

Les fichier registre:
MonRegInstall.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\TestBoutonRegistre]
@= "oO Test Bouton Registre Oo"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\TestBoutonRegistre\command]
@="cmd.exe"


MonRegUninstall.reg

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\TestBoutonRegistre]
@="oO Test Bouton Registre Oo"

[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\TestBoutonRegistre\command]
@="cmd.exe"



Si je donne au bouton 1 la fonction "click" avec comme action Shell("Regedit .\MonChemin\MonReg.reg") sa fonctionne.(bien sur en plaçant correctement les fichier reg au préalable)

Ce code ci dessous fonctionne mais je cherche à incorporer les fichier .reg dans l'exécutable.
Le code fonctionnel du bouton 1 et 2 sans incorporation:
Imports System
Imports System.IO

Public Class Form1

    'Action Bouton 1 inscrire dans le registre
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Shell("Regedit .\MonChemin\MonRegInstall.reg")
    End Sub

    'Action Bouton 2 désinscrire du registre
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Shell("Regedit .\MonChemin\MonRegUninstall.reg")
    End Sub

End Class


J'ai donc incorporer le fichier reg utiliser pour désinscrire le fichier reg utiliser avec le bouton 2, pour cette incorporation. (Ressource ajouter un fichier..)

J'ai créez un troisième bouton(bouton 3) avec prise en charge du fichier reg incorporer en ressource.
Voici donc le code que vous m'avez conseiller, modifier pour fonctionner avec l'action "click" du bouton 3.

Le code du bouton 3 avec incorporation:
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim sRegPath As String  = System.IO.Path.Combine(System.IO.Path.GetTempPath, "tmp_MonRegUninstall.reg")

        My.Computer.FileSystem.WriteAllText(sRegPath, My.Resources.MonRegUninstall, False)

        System.Diagnostics.Process.Start("regedit.exe", GetShortPathName(sRegPath))
    End Sub

Il fait bien ce que je désire (il ouvre le registre et essaie d'inscrire le fichier reg) cependant il m'indique que le fichiers registre n'en n'es pas un, qu'il faut un fichier de type binaires(cf. l'image du post précédent) je pense que le problème es qu'il réécrit totalement le fichier au lieu de le copier.

Code complet avec bouton 1 et 2 sans incorporation et bouton avec incorporation:
Imports System
Imports System.IO

Public Class Form1

    Shared Function GetShortPathName_CreateDestroy(ByVal Path As String) As String
        Dim fCreate As Boolean = Not System.IO.File.Exists(Path)
        If fCreate Then System.IO.File.Create(Path).Dispose()
        Dim shortPath As String = GetShortPathName(Path)
        If fCreate Then System.IO.File.Delete(Path)
        Return shortPath
    End Function
    Shared Function GetShortPathName(ByVal Path As String) As String
        Dim shortPath As New System.Text.StringBuilder(255)
        GetShortPathName(Path, shortPath, shortPath.Capacity)
        Return shortPath.ToString()
    End Function
    <System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError:=True, _
      CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function GetShortPathName(ByVal Path As String, _
      ByVal ShortPath As System.Text.StringBuilder, _
      ByVal ShortPathLength As Integer) As Integer
    End Function

    'Action Bouton 1 Inscrire dans le registre
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Shell("Regedit .\MonChemin\MonRegInstall.reg")
    End Sub

    'Action Bouton 2 Désinscrire du registre
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Shell("Regedit .\MonChemin\MonRegUninstall.reg")
    End Sub

    'Action Bouton 3 Désinscrire du registre (ressource incorporé)
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim sRegPath As String = System.IO.Path.Combine(System.IO.Path.GetTempPath, "tmp_MonRegUninstall.reg")

        My.Computer.FileSystem.WriteAllText(sRegPath, My.Resources.MonRegUninstall, False)

        System.Diagnostics.Process.Start("regedit.exe", GetShortPathName(sRegPath))
    End Sub
End Class


Donc je cherche à palier à ce problème.

Voila j'espère que j'ai étais assez clair.

NvZ
0
phila38 Messages postés 11 Date d'inscription jeudi 23 juillet 2009 Statut Membre Dernière intervention 25 juillet 2009
16 août 2009 à 10:10
salut,

Juste une petite remarque sur la commande
regedit.exe c:\documents and settings\...

ça ne marche évidemment pas, mais :
regedit.exe "c:\documents and settings\..."
marche bien

il suffit donc de faire :
Shell("regedit.exe """ & sRegPath & """")
ça devrait pallier au problème des espace...
0
NvZ75 Messages postés 24 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 15 juin 2010
21 août 2009 à 05:54
Merci pour vos réponse, cependant mon problème de path et résolu, j'ai actuellement le problème citez plus haut, le fichier es bien trouver mais il me dit que ce n'est pas un fichier binaire lors de la fusion avec le registre.(cf le screen plus haut)
0
Rejoignez-nous