0

我想我做错了。我正在为 MSR 类型对象制作 SO。默认情况下(如果我没看错的话)OPOS 使用 unicode。所以我让我的 C++ 自动化类也使用 unicode,据我所知,没有办法绕过它。在 OPOS 头类中有 2 个字符串定义,第三个是我创建的:

#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 人,所以我的数据类型可能有误。以前,我只在一个超级旧的 linux 机器上用 C++ 为自己编写了简单的 hello world 程序和临时转换程序。尽管我在 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 标头中定义,此类型为charwchar_t,取决于是否UNICODE定义。如果已定义,TCHAR将是wchar_t. 如果未定义,TCHAR则为char.

这还带有一个TEXT宏,可以将字符串文字转换为 type 的字符TCHAR。也就是说,如果UNICODE已定义,TEXT("abc")则等价于L"abc",如果未定义,TEXT("abc")则等价于"abc"

字符串也被赋予了一些类型定义:

LP[C][W|T]STR

LP表示指针,表示“STR指向字符串”。如果C包含,该字符串将是一个常量。如果包含Wor 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 回答