1

我有

TCHAR szPIDKEY[255];//for product id
 DWORD dwLen = sizeof(szPIDKEY)/sizeof(szPIDKEY[0]); //calculating the size of the key
UINT res = MsiGetProperty(hInstall, _T("PIDKEY"), szPIDKEY, &dwLen); 
if(res != ERROR_SUCCESS) 
{
    //fail the installation 
    return 1; 
}

密钥字符串看起来像 xxxx-xxxx-xxxx-xxxx,我只想取 TCHAR 中的最后四个 xxxx,怎么做?

谢谢

4

3 回答 3

2
 #ifndef UNICODE  
 typedef std::string String 
 #else
 typedef std::wstring String 
 #endif

String szKey = szPIDKEY;
size_t found = szKey.find_last_of("-");
String szFind = szKey.substr (found,4);
于 2012-08-03T06:42:38.547 回答
0

如果未定义 UNICODE,则 TCHAR 只是一个字符,如果已定义,则为 wchar。因此,如果您想采用最后 4 个符号,您可以像对待这些类型一样对待。

所以也许你应该做这样的事情:

#ifdef UNICODE
#include <wchar.h>
int get_len(TCHAR[] val) {
  return wcslen(val);
}
#else 
#include <cstring>
int get_len(TCHAR[] val) {
  return strlen(val);
}
#endif

编辑:事实上,在 windows 中已经定义了一个函数,它可以执行我上面描述的操作,它是 _tcslen (感谢 jajjaj 的这个)。但是我决定保留上面的代码,以便您了解它的作用。

然后使用上面的函数,您将最后 4 个字符存储在

szPIDKEY[_tcslen(szPIDKEY-4)], ...szPIDKEY[_tcslen(szPIDKEY-1)]

希望这可以帮助。

于 2012-08-03T06:43:03.783 回答
0

这真的那么难吗?

TCHAR lastFour[5] /* 4 + 1 for null terminator */
_tcscpy(lastFour, szPIDKEY + dwLen - 4); /* copy the last four characters and 
                                        null terminator */

如果你想以 C 方式处理字符串,那么你将不得不学习如何像上面那样进行指针操作。szPIDKEY是一个数组,但它也用作指向数组第一个元素的指针,szPIDKEY + dwLen然后是指向键的最后一个字符的指针(空终止符)。szPIDKEY + dwLen - 4指向之前四个字符的指针也是如此。

未经测试的代码。

于 2012-08-03T06:39:44.837 回答