2013-01-06 63 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你試過了嗎?它工作嗎? –

相關問題