0

私は Windows プログラミング初心者であることを知っているので、ただ学んでいるところです。

Windows API のレジストリ関数の一部を操作するコマンド ライン ツールを作成していますがchar *argv[]配列から取得した を変換LPCTSTRして、コンテンツで変数を初期化する必要がありますが、その方法がわかりません。

これは私がこれまでに持っているコードです:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int main(int argc, char *argv [])
{
    int count;
    DWORD Reserved = 0;
    LPTSTR lpClass = NULL;
    DWORD dwOptions = REG_OPTION_NON_VOLATILE;
    REGSAM samDesired = KEY_ALL_ACCESS;
    LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
    HKEY phkResult;
    DWORD lpdwDisposition;

    if (argv[1] == 0)
    {
        printf("There are no arguments, pleas type one at least. \n");
    }
    else if (std::string(argv[1]) == "-Clave")
    {
        if (std::string(argv[2]) == "HKCU")
        {
            printf("You are going to create a HKCU sub-key \n");
            HKEY hKey = HKEY_CURRENT_USER;

            if (std::string(argv[3]) != "")
            {

                printf("You are going to create this sub-key: %s \n",argv[3]);

                //This is what I tried.

                LPCTSTR lpSubKey = TEXT("%s",argv[3]);

                RegCreateKeyEx(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, &phkResult, &lpdwDisposition);

                if (lpdwDisposition == REG_CREATED_NEW_KEY)
                {
                    printf("The registry key has been created. \n");
                }

            }
            else
                printf("No one");
        }
        else
        {
            printf("No key has been specified \n");
        }

    }

    system("Pause");

}

あなたは私を助けることができます?

どうもありがとう。

4

3 に答える 3

0

最も簡単な解決策は、Ansi バージョンのレジストリ関数 (RegCreateKeyExAなど) を明示的に呼び出し、Windows に変換を処理させることです。現在、関数の Unicode バージョン ( など) を呼び出しているRegCreateKeyExWか、そもそも変換の問題が発生していません。

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int main(int argc, char *argv [])
{
    int count;
    HKEY hkResult;
    DWORD dwDisposition;

    if (argc < 1)
    {
        printf("There are no arguments, pleas type one at least. \n");
    }
    else if (strcmp(argv[1], "-Clave") == 0)
    {
        if (argc < 3)
        {
            printf("There are not enough arguments typed in. \n");
        }
        else if (strcmp(argv[2], "HKCU") == 0)
        {
            if (strcmp(argv[3], "") != 0)
            {
                printf("You are going to create HKCU sub-key: %s \n", argv[3]);

                if (RegCreateKeyExA(HKEY_CURRENT_USER, argv[3], 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkResult, &dwDisposition) == 0)
                {
                    if (dwDisposition == REG_CREATED_NEW_KEY)
                    {
                        printf("The registry key has been created. \n");
                    }
                    else
                    {
                        printf("The registry key already exists. \n");
                    }

                    RegCloseKey(hkResult);
                }
                else
                {
                    printf("Unable to create the registry key. \n");
                }
            }
            else
            {
                printf("No HKCU sub-key has been specified \n");
            }
        }
        else
        {
            printf("No root key has been specified \n");
        }
    }

    system("Pause");
    return 0;
}

更新:政治的に正しくしたい場合は、テキスト データを処理するほとんどの Win32 API が実際に処理するためTCHAR(これを使用しようとしましたが、成功しませんでした)、単一のコードベースで Ansi と Unicode の両方でコンパイルできるようにします。 、例:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <tchar.h>

int _tmain(int argc, TCHAR *argv [])
{
    int count;
    HKEY hkResult;
    DWORD dwDisposition;

    if (argc < 1)
    {
        _tprintf(_T("There are no arguments, pleas type one at least. \n"));
    }
    else if (_tcscmp(argv[1], _T("-Clave")) == 0)
    {
        if (argc < 3)
        {
            _tprintf(_T("There are not enough arguments typed in. \n"));
        }
        else if (_tcsicmp(argv[2], _T("HKCU")) == 0)
        {
            if (_tcscmp(argv[3], _T("")) != 0)
            {
                _tprintf(_T("You are going to create HKCU sub-key: %s \n"), argv[3]);

                if (RegCreateKeyEx(HKEY_CURRENT_USER, argv[3], 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkResult, &dwDisposition) == 0)
                {
                    if (dwDisposition == REG_CREATED_NEW_KEY)
                    {
                        _tprintf(_T("The registry key has been created. \n"));
                    }
                    else
                    {
                        _tprintf(_T("The registry key already exists. \n"));
                    }

                    RegCloseKey(hkResult);
                }
                else
                {
                    _tprintf(_T("Unable to create the registry key. \n"));
                }
            }
            else
            {
                _tprintf(_T("No HKCU sub-key has been specified \n"));
            }
        }
        else
        {
            _tprintf(_T("No root key has been specified \n"));
        }
    }

    _tsystem(_T("Pause"));
    return 0;
}

そうは言っても、新しいプロジェクトを開始しているので、Ansi が存在することさえ忘れて、すべてに Unicode を使用するのが最善です。

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int wmain(int argc, WCHAR *argv [])
{
    int count;
    HKEY hkResult;
    DWORD dwDisposition;

    if (argc < 1)
    {
        wprintf(L"There are no arguments, pleas type one at least. \n");
    }
    else if (wcscmp(argv[1], L"-Clave") == 0)
    {
        if (argc < 3)
        {
            wprintf(L"There are not enough arguments typed in. \n");
        }
        else if (_wcsicmp(argv[2], L"HKCU") == 0)
        {
            if (wcscmp(argv[3], L"") != 0)
            {
                wprintf(L"You are going to create HKCU sub-key: %s \n", argv[3]);

                if (RegCreateKeyExW(HKEY_CURRENT_USER, argv[3], 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkResult, &dwDisposition) == 0)
                {
                    if (dwDisposition == REG_CREATED_NEW_KEY)
                    {
                        wprintf(L"The registry key has been created. \n");
                    }
                    else
                    {
                        wprintf(L"The registry key already exists. \n");
                    }

                    RegCloseKey(hkResult);
                }
                else
                {
                    wprintf(L"Unable to create the registry key. \n");
                }
            }
            else
            {
                wprintf(L"No HKCU sub-key has been specified \n");
            }
        }
        else
        {
            wprintf(L"No root key has been specified \n");
        }
    }

    _wsystem(L"Pause");
    return 0;
}
于 2013-08-12T23:37:43.473 に答える
0

別の可能な解決策は、次のmainように関数宣言を変更することです。

int _tmain(int argc, TCHAR* argv[])

MSDNからの引用:

TCHAR.h で定義されている _tmain を使用することもできます。_UNICODE が定義されていない限り、_tmain は main に解決されます。その場合、_tmain は wmain に解決されます。

RegCreateKeyEx の2 番目のパラメーターは*LPCTSTRです。
lpSubKeyは同じ型で宣言され、関数に引数として渡されると適切に初期化されRegCreateKeyExます。

以下は、Visual C++ でコンパイルされたソース コードで、 マルチバイト文字セット(_MBCSマクロが定義されています) を使用しています。

// RegCreate.cpp : Defines the entry point for the console application.
// VC++ Compiler Options :
// cl /W3 /MT /O2 /D WIN32 /D _CONSOLE /D _MBCS /EHsc /TP RegCreate.cpp 
#include <Windows.h>
#include <iostream>
#include <string>
#include <tchar.h>

#ifndef _MBCS
    #define _MBCS
#endif

#pragma comment(lib, "Advapi32.lib")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

    DWORD Reserved = 0;
    LPTSTR lpClass = NULL;
    DWORD dwOptions = REG_OPTION_NON_VOLATILE;
    REGSAM samDesired = KEY_ALL_ACCESS;
    LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
    HKEY phkResult;
    DWORD lpdwDisposition;
    if(argc < 3)
    {
        std::cout << "There are no arguments, pleas type one at least. " << std::endl;
        return 1;
    }
    if((std::string(argv[1]) == "-Clave") && (std::string(argv[2]) == "HKCU") && (argc == 4))
    {

        std::cout << "You are going to create a HKCU sub-key " << std::endl;
        HKEY hKey = HKEY_CURRENT_USER;

        if(std::string(argv[3]) != "")
        {
            std::cout << "You are going to create this sub-key: " << argv[3] << std::endl;
            //This is what I tried.
            LPCTSTR lpSubKey = argv[3];
            if(ERROR_SUCCESS != RegCreateKeyEx(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired,
                                               lpSecurityAttributes, &phkResult, &lpdwDisposition))
            {
                return 1;
            }
            if(lpdwDisposition == REG_CREATED_NEW_KEY)
            {
                std::cout << "The registry key has been created. " << std::endl;
            }
            RegCloseKey(phkResult);
        }
        else
        {
            std::cout << "No one";
        }
    }
    else
    {
        std::cout << "No key has been specified " << std::endl;
    }
    return 0;
}

TEXTマクロを使用して文字列をUnicodeであるかどうかを定義できますが、上記の例ではこれは必要ありません。

C++ を使用している場合は、ASCII 文字で動作するに変更printfすることをお勧めします。std::cout

于 2013-08-13T10:10:30.137 に答える
0

Windows.h の MultiByteToWideChar 関数を見てください。これは素晴らしく簡単な例です:

const char * orig = "text1";
WCHAR buffer[6];
MultiByteToWideChar(0, 0, orig, 5, buffer, 6 );
LPCWSTR text = buffer;

おっと、それは LPCWSTR 用です。LPCTSTR の場合は、次を使用します。

LPCTSTR text = _T("text1");
于 2013-08-12T18:45:36.953 に答える