Création et encodage UTF8 sans nomenclature en VB.NET [Résolu]

Signaler
-
 Debelmas -
Bonjour,

Dans le cadre de mon travail je dois modifier légèrement l'utilitaire d'un de nos logiciels afin de faire un lancement de programme de mesure d'une de nos machines grâce à un lancement code-barre.

J'ai créé une routine brute de pomme à partir d'un batch sauf que je dois rendre ce fichier variable (suivant ce que je scan avec le code-barre).

Je suis métrologue de formation (mesure dimensionnelle), mais je sais me dépatouiller un peu en VB.NET. Du coup je suis allé bidouillé une solution avec Forms sous visual basic.

Pour ne pas me prendre la tête, dès que j'ai scanné le code-barre, et que le bouton de validation est appuyer, je réécrie mon .bat avec ce que je veux écrit en paramètre.
Sauf que ça ne marche pas et après quelque recherche, j'ai compris un truc : l'encodage en UTF8 se fait avec nomenclature, et l'invite de commande Windows semble lire seulement l'UTF8 sans nomenclature (et aucun autre encodage).

Voici ce que je fais pour la création de mon bat :


Sub Creation_bat(chemin_palette As String, nom_palette As String)

        If File.Exists(Chemin_bat) Then 'test si le fichier existe
            File.Delete(Chemin_bat)
        Else 'le fichier n'existe pas

        End If

        ' Create the file.
        'Dim file_bat As StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(Chemin_bat, True)


        Using writer As StreamWriter = New StreamWriter(Chemin_bat, True, Encoding.UTF8)
            'writer.Write("cd C:\")
            'writer.Write("taskkill /f /im QVPMgr.exe")
            writer.Write("REG ADD " & """" & "HKEY_LOCAL_MACHINE\SOFTWARE\Mitutoyo\QVPMgr\3.1\Folder" & """" & " /v " & """" & "LatestFolder1" & """" & " /d " & """" & chemin_palette & """" & " /f")
            'writer.Write("CD /D " & """" & "C:\Program Files\QVPMgr\" & """" & " & start QVPMgr.exe")
        End Using


        ' Add text to the file.
        'file_bat.WriteLine("cd C:\")
        'file_bat.WriteLine("taskkill /f /im QVPMgr.exe")
        'file_bat.WriteLine("REG ADD " & """" & "HKEY_LOCAL_MACHINE\SOFTWARE\Mitutoyo\QVPMgr\3.1\Folder" & """" & " /v " & """" & "LatestFolder1" & """" & " /d " & """" & chemin_palette & """" & " /f")
        'file_bat.WriteLine("@echo Set WshShell = WScript.CreateObject(" & """" & "WScript.Shell" & """" & ") > " & """" & Me.Chemin_script_vbs_focus & """" & "")
        'file_bat.WriteLine("(")
        'file_bat.WriteLine("@echo/")
        'file_bat.WriteLine("@echo WScript.Sleep 200")
        'file_bat.WriteLine("@echo/")
        'file_bat.WriteLine("@echo WshShell.SendKeys " & """" & "{TAB}" & """" & "")
        'file_bat.WriteLine("@echo/")
        'file_bat.WriteLine("@echo WshShell.SendKeys " & """" & nom_palette & """" & "")
        'file_bat.WriteLine("@echo/")
        'file_bat.WriteLine("@echo WshShell.SendKeys " & """" & "{F10}" & """" & "")
        'file_bat.WriteLine("@echo/")
        'file_bat.WriteLine("@echo WshShell.SendKeys " & """" & "f" & """" & "")
        'file_bat.WriteLine("@echo/")
        'file_bat.WriteLine("@echo WshShell.SendKeys " & """" & "o" & """" & "")
        'file_bat.WriteLine("@echo/")
        'file_bat.WriteLine(") >> " & """" & Me.Chemin_script_vbs_focus & """" & "")
        'file_bat.WriteLine("CD /D " & """" & "C:\Program Files\QVPMgr\" & """" & " & start QVPMgr.exe")
        'file_bat.WriteLine("TIMEOUT /T 3 /NOBREAK")
        'file_bat.WriteLine("\Windows\system32\cscript.exe " & """" & Me.Chemin_script_vbs_focus & """" & "")
        'file_bat.WriteLine("echo (new ActiveXObject(" & """" & "WScript.Shell" & """" & ")).AppActivate(" & """" & "QVPMgr.exe" & """" & "); > focus.js")
        'file_bat.WriteLine("cscript //nologo focus.js")
        'file_bat.WriteLine("del focus.js")
        'file_bat.WriteLine("TIMEOUT /T 1 /NOBREAK")
        'file_bat.WriteLine("del /q " & """" & Me.Chemin_script_vbs_focus & """" & "")
        'file_bat.WriteLine("del /q " & """" & Me.Chemin_script_vbs_minimized & """" & "")
        'file_bat.Close()
    End Sub


Dans mon .bat je fais 2/3 trucs et juste pour l'essai je ne laisse que ma bidouille sur une clé de registre.
Rien que cette ligne ne fonctionne pas car il y a du coup le caractère invisible de début de fichier (ou début de ligne ?) dû à l'UTF8 avec nomenclature (ou avec BOM si j'ai bien compris).

Est-ce qu'il y a un moyen en VB.NET de ne pas écrire un fichier en UTF8 avec nomenclature mais sans ? Ou existe-t-il une autre parade ? (une autre méthode pour écrire un fichier texte, il semble y en avoir plusieurs)

Dernière solution pour moi mais ça fout en l'air mon délai, c'est de faire absolument tout dans mon exe plutôt que de passer par mon bat mais je vais devoir trouver les fonctions qui vont bien (kill de processus, modifier une clé de registre, lancement de programme, lancement de vbs mais si le truc de l'UTF8 avec nomenclature m'embête aussi je dois savoir comment générer une suite de touche au clavier, récupérer le focus sur une fenêtre, etc).

Merci d'avance pour votre aide. :)


Configuration: Windows / Chrome 87.0.4280.88

6 réponses

J'ai trouvé la solution pour avoir un encodage UTF8 no BOM. Par contre j'ai un autre soucis. Lorsque je lance mon batch depuis mon code, j'ai un accès refusé sur la modification de ma valeur de registre. Par contre si je relance le batch à la main depuis l'explorateur windows, il marche....

Voilà mon code pour générer mon .bat avec l'encodage sans BOM :
Sub Creation_bat()

        If File.Exists(Chemin_bat) Then 'test si le fichier existe
            File.Delete(Chemin_bat)
        Else 'le fichier n'existe pas

        End If

        ' Create the file.
        'Dim file_bat As StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(Chemin_bat, True)

        Dim utf8WithoutBom As New UTF8Encoding(False)
        Using writer As StreamWriter = New StreamWriter(Chemin_bat, False, utf8WithoutBom)
            writer.WriteLine("REG ADD " & """" & "HKEY_LOCAL_MACHINE\SOFTWARE\Mitutoyo\QVPMgr\3.1\Folder" & """" & " /v " & """" & "LatestFolder1" & """" & " /d " & """" & "qwerty" & """" & " /f")
            writer.WriteLine("TIMEOUT /T 8 /NOBREAK")
            writer.Close()
        End Using

    End Sub


Pour exécuter mon .bat je fais ça dans une sub :

Creation_bat()
System.Diagnostics.Process.Start(Chemin_bat)


Je suppose qu'il y a un problème de droit mais là je n'ai aucune idée d'où ça vient. Et je suppose qu'il y a aussi plusieurs manières d'exécuter un fichier externe...

Est-ce que vous savez pourquoi Process.Start ne passe pas ?

Merci

(snif)
Messages postés
15383
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 janvier 2021
642
Bonjour,

Merci pour l'info.

Je garde dans un coin, ça permet d'avoir un process start avec des options.
Par contre j'ai pu tester ce code avec les commandes que je veux exécuter et je vois que certaines commandes ne passent pas. En fait je veux modifier une valeur de la base de registre et cela ne marche pas. Si j'exécute la commande depuis mon exe, j'ai un accès refusé, si je le fais à la main ça passe.

Idem si cette commande est dans un .bat. Si je lance le bat depuis mon exe ça ne passe pas ; si je lance le bat à la main ça marche.....

Du coup mon code fonctionne très bien, c'est juste qu'il doit y avoir une restriction sur l'exe de ma solution (??).

D'ailleurs j'ai trouvé la syntaxe pour modifier une valeur d'une clé de registre en VB.NET directement, et même avec ça il n'y a pas de modification :
Imports Microsoft.Win32

Dim regKey As RegistryKey
regKey=Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Mitutoyo\QVPMgr\3.1\Folder", True)
regKey.SetValue("LatestFolder1", "test")
regKey.Close()


Je ne vois pas sur quoi je dois agir pour pouvoir modifier cette foutue valeur ><
Messages postés
15383
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 janvier 2021
642
Est ce que tu es en session administrateur et execute tu le logiciel « en tant qu’administrateur » ?
Effectivement je pense qu'il y a des problèmes de droit.
De base je suis admin de mon poste (et encore, ce que je code est au final pour des clients avec des postes utilisateurs classiques.... ><, mais admettons que l'utilisateur est admin du poste)

Aussi, de base, dans les propriétés de lancement de mon projet dans Visual Studio, "Préférer 32 bits" était cocher. Maintenant mon bat de modification de valeur de clé de registre fonctionne en partie.
Donc :
- Dans visual studio exécuté normalement ou en admin, ça marche avec le debug mode
- Sur ma release ou dans visual studio avec le mode release ça ne marche plus pour raison de sécurité et donc de droit.

Je suis allé voir ma clé de registre pour mettre le contrôle totale de partout, ça ne change rien.
Mon exception c'est bien : System.Security.SecurityException : 'Accès au registre demandé non autorisé.'

Si j'exécute ma release .exe en tant qu'administrateur, mon appli fonctionne mais la valeur de ma clé de registre ne change plus....

J'ai l'impression que c'est mort. Pourtant la valeur de cette clé que je touche est également modifié par un des modules de notre soft.... Je veux faire la même chose que lui mais via mon application externe.


Edit : il y a 2 types de lancement "release" dans visual studio, une active et l'autre non, chacune a son réglage 64 ou 32 bits... Tout à l'air de marcher maintenant. Il me restera qu'à voir le comportement sur site client avec des sessions utilisateurs classiques.
Messages postés
7196
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
13 janvier 2021
597
Bonjour à tous les 2,

j'ai été confronté à ce problème sur ce programme:

https://codes-sources.commentcamarche.net/source/view/102722/1561662

j'ai trouvé la solution ici:

https://openclassrooms.com/forum/sujet/creer-une-cle-registre-dans-hkey-local-machine

Vois si cela fonctionne pour toi!
Ok, je vois à peu près commet ça fonctionne. Je ne savais pas qu'il y avait un distinguo 32 et 64 bits de la base de registre sur un OS 64 bits.
Dans ma tête le 32 bits marchait "parce que c'est normal" sur une architecture 64 bits.

Pas encore tout compris au lien mais je saisis l'idée.

Pour l'instant mon programme est amené à fonctionner que sur du 64 bits, donc maintenant que j'ai tout forcé pour ça, ça marche. Mais j'essaierai à l'avenir de le généraliser pour les 2 architectures.

Merci.