我想我要解决这个错误。我正在为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专家,所以我的数据类型可能不正确。以前,我只是用C ++在超级旧Linux盒子上为自己编写了简单的hello world程序和临时转换程序。尽管我在C ++方面做得更好,但是我对它仍然不满意。那么,总结一下#define类型的数据类型是什么?如何将其与LPCTSTR结合使用?我应该这样做,以便只能访问注册表值吗?
谢谢。
最佳答案
您的代码在窄字符串和宽字符串之间存在不一致。文字'a'
具有类型char
,并且是一个窄字符。文字L'a'
具有类型wchar_t
,并且是一个宽字符。
接下来,我们可以将它们应用于字符串:"abc"
是const char (&)[4]
类型的窄字符串。L"abc"
是const wchar_t (&)[4]
类型的宽字符串。
为了减少支持这两种方法的麻烦,有一种称为TCHAR
的方法。在Windows标头中定义,此类型为char
或wchar_t
,具体取决于是否定义了UNICODE
。如果已定义,则TCHAR
将为wchar_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_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")
关于c++ - #define字符串的类型是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14179365/