0

私はこれについて間違っていると思います。私はMSRタイプのオブジェクトのSOの作成に取り組んでいます。そしてデフォルトで(私が正しく読んだ場合)OPOSはユニコードを使用します。そこで、C ++自動クラスにもUni​​codeを使用させましたが、私が理解していることから、それを回避する方法はありません。OPOSヘッドクラスには2つの文字列定義があり、3つ目は私の作成したものです。

#define OPOS_ROOTKEY "SOFTWARE\\OLEforRetail\\ServiceOPOS"
#define OPOS_CLASSKEY_MSR     "MSR"
#define OPOSMSR OPOS_ROOTKEY "\\" OPOS_CLASSKEY_MSR "\\"

これは、人がレジストリにアクセスできるようにするためです。そこで、すべてをSOに含めるのではなく、自分自身をレジストリヘルパークラスにすることにしました。最終的にこれをどのように行うべきかを理解するのに苦労しているようです。持っていた別のSOから作業コードをコピーしましたが、そのコードが正しく作成されていないと感じており、最初から正しく作成したいと思っています。

それでこれを思いついたのですが、文字列とクラス名を組み合わせる方法がわかりません。コンストラクターでパラメーターとしてクラス名を作成しました。

RegistryHelper::RegistryHelper(LPCTSTR deviceName) {
    cout << "RegistryHelper::RegistryHelper()+" << endl;
    baseOpen = true;

    CString test;
    test.Format("%s%s",OPOSMSR, theClass); //fail
    REGSAM access = KEY_READ | KEY_WOW64_64KEY;
    LONG nError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, theClass ,0, access,&hBaseKey); //not what I want, but would compile, I want test here instead of theClass

    if (nError != ERROR_SUCCESS) {
        cerr << "(E)RegistryHelper::RegistryHelper(): Failed to load base key. [" <<(int)nError << "]" << endl;
        RegCloseKey(hBaseKey);
        baseOpen = false;
    }

    cout << "RegistryHelper::RegistryHelper()-" << endl;
}

私が間違っていることについてのヒントはありますか?私はこのテーマに取り組んでいるので、このためのすべてのコードを投稿します。どれくらい悪い?

私が求めているのはこんな感じです

unsigned int baud;
char* parity;

bool MSRSO::LoadRegistryValuesIntoMemory(LPCSTR deviceName) {
    RegistryHelper reg(deviceName);
    bool required = reg.LoadDWORD("BaudRate", 19200, baud);
    required = required && reg.LoadREGSZ("Parity", "NONE", parity);
    //other values
    reg.Close();
    return required;
}

私はC#とJavaの人なので、データ型が間違っている可能性があることに注意してください。昔は、SUPERの古いLinuxボックスでC++で簡単なHelloWorldプログラムと一時変換プログラムを作成しただけでした。私はC++で良くなっていますが、それでもまだ慣れていません。では、#define型のデータ型は何ですか?LPCTSTRと組み合わせるにはどうすればよいですか?レジストリ値にのみアクセスできるようにするために、これを行う必要がありますか?

ありがとうございました。

4

2 に答える 2

2

コードに、狭い文字列と広い文字列の間に矛盾があります。リテラル'a'のタイプcharは、で、幅の狭い文字です。リテラルL'a'のタイプwchar_tは、で、ワイド文字です。

次に、これらを文字列に適用できます。
"abc"は、型の狭い文字列ですconst char (&)[4]
L"abc"タイプの幅の広い文字列ですconst wchar_t (&)[4]

両方をサポートする煩わしさを軽減するために、として知られているものがありTCHARます。Windowsヘッダーで定義されているこのタイプは、定義されているかどうかに応じて、charまたはです。定義されている場合は、になります。定義されていない場合は、になります。wchar_tUNICODETCHARwchar_tTCHARchar

TEXTこれには、文字列リテラルをタイプの文字に変換するマクロも付属していますTCHAR。つまり、UNICODEが定義されている場合はTEXT("abc")と同等になりL"abc"、定義されていない場合はTEXT("abc")と同等になり"abc"ます。

文字列にもいくつかのtypedefが与えられました:

LP[C][W|T]STR

LPポインタを示し、STRは「文字列へ」を示します。が含まれている場合C、文字列は定数になります。Wまたはが含まれている場合T、文字列はタイプwchar_tまたはTCHARそれぞれの文字で構成されます。

例えば:

LPSTR: char *
LPCSTR: const char *
LPWSTR: wchar_t *
LPCTSTR: const TCHAR *

この情報を使用するTCHARと、使用する理由を正しく理解できTEXT、コードが狭い文字を使用するか広い文字を使用するかに関係なく、コードが他のコードと互換性を持つようになります。

std::stringこれは簡単な例です。これは、私たちの目的のために、次のことを念頭に置いてstd::basic_string<char>ください。

std::basic_string<TCHAR> s(TEXT("abcd"));
s += TEXT("ZYXW"); //s is now `TEXT("abcdZXW")
于 2013-01-07T21:00:25.983 に答える
1

変化する

#define OPOS_ROOTKEY "SOFTWARE \\ OLEforRetail \\ ServiceOPOS"
#define OPOS_CLASSKEY_MSR "MSR"
#define OPOSMSR OPOS_ROOTKEY "\\" OPOS_CLASSKEY_MSR "\\"

#define OPOS_ROOTKEY L "SOFTWARE \\ OLEforRetail \\ ServiceOPOS"
#define OPOS_CLASSKEY_MSR L "MSR"
#define OPOSMSR OPOS_ROOTKEY L "\\" OPOS_CLASSKEY_MSR "\\"

于 2013-01-06T04:47:09.160 に答える