2013-01-06 67 views
0

我想我正在讨论这个错误。我正在为MSR类型对象制作SO。并且默认情况下(如果我正确读取它)OPOS使用unicode。所以我让自己的C++自动化类使用unicode,并且据我所知,这是无法实现的。在OPOS头类有2所字符串定义,第三个是我的创作:什么是#define字符串的类型?

#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程序和temp转换程序。虽然我在C++上越来越好,但我仍然不舒服。那么总结一下#define类型的数据类型是什么?我如何将它与LPCTSTR结合?我是否应该这样做,以便我只能访问注册表值?

谢谢。

+1

你问一个字符串类型?这是'const char(&)[N]'。 '#define'在编译前做文本替换/ – chris

+0

是的,但是数据类型是什么?我可以做LPCTSTR x = OPOS_ROOTKEY吗?或者它是char * x = OPOS_ROOTKEY; –

+2

@RobertSnyder:它实际上是文本替换,所以类型是文字的隐式类型。 –

回答

2

你的代码有狭义和广义串之间的不一致。字面'a'的类型为char,并且是一个窄字符。字面上的L'a'的类型是wchar_t,并且是宽字符。

接下来,我们可以运用这些字符串:
​​是const char (&)[4]类型的窄字符串。
L"abc"是类型为const wchar_t (&)[4]的宽字符串。

为了减少支持两者的麻烦,有TCHAR。根据是否定义了UNICODE,在Windows标头中定义此类型为charwchar_t。如果定义,TCHAR将是wchar_t。如果没有定义,TCHAR将是char

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

字符串也分别给予一些类型定义,以及:

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

变化

 
#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 "\\" 

+0

我不能改变第一个2 ...但我可以改变第三个,因为这是我的 –

+1

你也可以改变它们,不用担心在C++中的字符串之前的字符串会使它变成unicode这是你的问题 –

+0

did你试过了吗?它工作吗? –

相关问题