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 の最後の 4 つの 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

TCHAR は、UNICODE が定義されていない場合は char であり、定義されている場合は 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

編集: 実際、私が上で説明したことを実行するウィンドウで既に定義されている関数があり、それは _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、キーの最後の文字 (null ターミネータ) へのポインタになります。そのszPIDKEY + dwLen - 4前の 4 文字へのポインターも同様です。

テストされていないコード。

于 2012-08-03T06:39:44.837 に答える