什么是#define字符串的类型?

时间:2013-01-06 04:41:01

标签: c++ types registry

我想我错了。我正在为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家伙,所以我的数据类型可能有问题。我只在当天的一个SUPER旧linux盒子里用C ++为自己写了简单的hello world程序和临时转换程序。虽然我在C ++上的表现越来越好,但我仍然不满意。那么总结一下#define类型的数据类型是什么?如何将其与LPCTSTR结合使用?我应该这样做,以便我只能访问注册表值吗?

谢谢。

2 个答案:

答案 0 :(得分: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宏,它将字符串文字转换为TCHAR类型的字符。也就是说,如果定义了UNICODETEXT("abc")将等同于L"abc",如果未定义,则TEXT("abc")将等同于"abc"。< / p>

字符串也被赋予了一些typedef:

LP[C][W|T]STR

LP表示指针,STR表示“到字符串”。如果包含C,则字符串将是常量字符串。如果包含WT,则字符串将分别由wchar_tTCHAR类型的字符组成。

例如:

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

使用此信息,您可以正确理解使用TCHARTEXT导致您的代码与其他内容兼容的原因,无论是使用窄字还是宽字符。

以下是一个简单示例,请注意std::string,就我们而言std::basic_string<char>

std::basic_string<TCHAR> s(TEXT("abcd"));
s += TEXT("ZYXW"); //s is now `TEXT("abcdZXW")

答案 1 :(得分: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 "\\"