0

こんにちはstrtok、文を 2 つの部分に分割する関数を使用しています。私は2つの別々の値を保存する方法を理解していないようです.関数は、値を保存するために知る必要がある瞬間に文を正常に分割しています. ありがとう

extern "C" UINT __stdcall GetProductName(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
char szProductName[MAX_PATH];
TCHAR* szValueBuf = NULL;
DWORD cchValueBuf = 0;
char * pch;
std::vector<std::string> parts;


hr = WcaInitialize(hInstall, "GetProductName");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");

UINT uiStat =  MsiGetProperty(hInstall, TEXT("ProductName"), TEXT(""), &cchValueBuf);

if (ERROR_MORE_DATA == uiStat)
{
    ++cchValueBuf; 
    szValueBuf = new TCHAR[cchValueBuf];
    if (szValueBuf)
    {
        uiStat = MsiGetProperty(hInstall, TEXT("ProductName"), szValueBuf, &cchValueBuf);

    }
}
if (ERROR_SUCCESS != uiStat)
{
    if (szValueBuf != NULL) 
        delete[] szValueBuf;
    return ERROR_INSTALL_FAILURE;
}

if (Orc_Create_Product_Key(szValueBuf))
    hr = S_OK;
else
    hr = ERROR_INSTALL_FAILURE;

pch = strtok (szValueBuf," ");
parts.push_back(pch);

  while (pch != NULL)
  {
       pch = strtok (NULL, " ");
       parts.push_back(pch);
  }


strcpy(szProductName, szValueBuf);

hr = MsiSetProperty(hInstall, "PRODUCTNAME",  szProductName);
ExitOnFailure(hr, "failed to set PRODUCTNAME");

LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
 }

ご覧のとおり、最初の値は になりますszProductNameが、2 番目の値も取得する必要があります。

4

1 に答える 1

1

ベクトルに保存しないのはなぜですか?

std::vector<std::string> parts;
pch = strtok (szValueBuf," ");
parts.push_back(pch);

while (pch != NULL)
{
   pch = strtok (NULL, " ");
   parts.push_back(pch);
}
于 2012-09-26T09:16:23.743 に答える