C++ 什么是#定义字符串';s型?

C++ 什么是#定义字符串';s型?,c++,types,registry,C++,Types,Registry,我想我做错了。我正在为MSR类型的对象制作一个SO。默认情况下(如果我读得正确的话),OPOS使用unicode。因此我也让我的C++自动化类使用Unicode,从我所理解的,没有办法。OPOS head类中有两个字符串定义,第三个是我创建的: #define OPOS_ROOTKEY "SOFTWARE\\OLEforRetail\\ServiceOPOS" #define OPOS_CLASSKEY_MSR "MSR" #define OPOSMSR OPOS_ROOTKEY "\\

我想我做错了。我正在为MSR类型的对象制作一个SO。默认情况下(如果我读得正确的话),OPOS使用unicode。因此我也让我的C++自动化类使用Unicode,从我所理解的,没有办法。OPOS head类中有两个字符串定义,第三个是我创建的:

#define OPOS_ROOTKEY "SOFTWARE\\OLEforRetail\\ServiceOPOS"
#define OPOS_CLASSKEY_MSR     "MSR"
#define OPOSMSR OPOS_ROOTKEY "\\" OPOS_CLASSKEY_MSR "\\"
这是为了让一个人可以访问注册表。所以我决定让自己成为一个注册表助手类,而不是把它全部放在我的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;
}
请记住,我是一个C#和java的家伙,所以我可能有我的数据类型错误。我只写了一个简单的Hello World程序和临时转换程序,C++在一个超级旧的Linux盒子里。虽然我在C++方面越来越好,但我还是不太适应。那么总结一下#define类型的数据类型是什么?如何将其与LPCTSTR结合?我是否应该这样做,以便只能访问注册表值

谢谢。

换衣服

#define OPOS_ROOTKEY "SOFTWARE\\OLEforRetail\\ServiceOPOS" #define OPOS_CLASSKEY_MSR "MSR" #define OPOSMSR OPOS_ROOTKEY "\\" OPOS_CLASSKEY_MSR "\\" #定义OPOS\u根键“软件\\OLEforRetail\\ServiceOPOS” #定义OPOS\u类密钥\u MSR“MSR” #定义oposmssr OPOS\u ROOTKEY“\\”OPOS\u CLASSKEY\u MSR“\\” 到

#定义OPOS\u ROOTKEY L“软件\\OLEforRetail\\ServiceOPOS” #定义OPOS\u类密钥\u MSR L“MSR” #定义oposmssr OPOS\u ROOTKEY L“\\”OPOS\u CLASSKEY\u MSR“\\” 改变

#定义OPOS\u根键“软件\\OLEforRetail\\ServiceOPOS” #定义OPOS\u类密钥\u MSR“MSR” #定义oposmssr OPOS\u ROOTKEY“\\”OPOS\u CLASSKEY\u MSR“\\” 到

#定义OPOS\u ROOTKEY L“软件\\OLEforRetail\\ServiceOPOS” #定义OPOS\u类密钥\u MSR L“MSR” #定义oposmssr OPOS\u ROOTKEY L“\\”OPOS\u CLASSKEY\u MSR“\\”
您的代码在窄字符串和宽字符串之间存在不一致。文本
'A'
的类型为
char
,是一个窄字符。文字
L'A'
的类型为
wchar\u t
,是一个宽字符

接下来,我们可以将这些应用于字符串:
“abc”
是一个狭窄的字符串,类型为
常量字符(&)[4]

L“abc”
是一个类型广泛的字符串
const wchar\u t(&)[4]

为了减少支持两者的麻烦,有一种称为
TCHAR
。在Windows标头中定义,此类型为
char
wchar\t
,具体取决于是否定义了
UNICODE
。如果已定义,
TCHAR
将是
wchar\u t
。如果未定义,
TCHAR
将是
char

这还附带了一个
TEXT
宏,该宏将字符串文本转换为
TCHAR
类型的字符。也就是说,如果定义了
UNICODE
TEXT(“abc”)
将等同于
L“abc”
,如果未定义,则
TEXT(“abc”)
将等同于
“abc”

字符串还提供了一些typedef:

LP[C][W|T]STR
LP
表示指针,
STR
表示“指向字符串”。如果包含
C
,则字符串将为常量。如果包含
W
T
,则字符串将分别由
wchar\u T
TCHAR
类型的字符组成

例如:

LPSTR: char *
LPCSTR: const char *
LPWSTR: wchar_t *
LPCTSTR: const TCHAR *
使用此信息,您可以正确理解为什么使用
TCHAR
TEXT
会使您的代码与其他内容兼容,无论是使用窄字符还是宽字符

这里有一个简单的例子,请记住,
std::string
对于我们来说是
std::basic_string

std::基本字符串(文本(“abcd”);
s+=文本(“ZYXW”)//s现在是“文本”(“abcdZXW”)

您的代码在窄字符串和宽字符串之间存在不一致。文本
'A'
的类型为
char
,是一个窄字符。文字
L'A'
的类型为
wchar\u t
,是一个宽字符

接下来,我们可以将这些应用于字符串:
“abc”
是一个狭窄的字符串,类型为
常量字符(&)[4]

L“abc”
是一个类型广泛的字符串
const wchar\u t(&)[4]

为了减少支持两者的麻烦,有一种称为
TCHAR
。在Windows标头中定义,此类型为
char
wchar\t
,具体取决于是否定义了
UNICODE
。如果已定义,
TCHAR
将是
wchar\u t
。如果未定义,
TCHAR
将是
char

这还附带了一个
TEXT
宏,该宏将字符串文本转换为
TCHAR
类型的字符。也就是说,如果定义了
UNICODE
TEXT(“abc”)
将等同于
L“abc”
,如果未定义,则
TEXT(“abc”)
将等同于
“abc”

字符串还提供了一些typedef:

LP[C][W|T]STR
LP
表示指针,
STR
表示“指向字符串”。如果包含
C
,则字符串将为常量。如果包含
W
T
,则字符串将分别由
wchar\u T
TCHAR
类型的字符组成

例如:

LPSTR: char *
LPCSTR: const char *
LPWSTR: wchar_t *
LPCTSTR: const TCHAR *
使用此信息,您可以正确理解为什么使用
TCHAR
TEXT
会使您的代码与其他内容兼容,无论是使用窄字符还是宽字符

这里有一个简单的例子,请记住,
std::string
对于我们来说是
std::basic_string

std::基本字符串(文本(“abcd”);
s+=文本(“ZYXW”)//s现在是`TEX
std::basic_string<TCHAR> s(TEXT("abcd"));
s += TEXT("ZYXW"); //s is now `TEXT("abcdZXW")