안녕 strtok
함수를 사용하여 문장을 두 부분으로 나눕니다. 두 개의 개별 값을 저장하는 방법을 파악할 수없는 것 같습니다.이 함수는 단지 값을 저장하기 위해 알아야하는 순간에 문장을 성공적으로 분할합니다. 감사합니다strtok 함수에서 값 저장하기
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
될 것입니다 볼 수 있지만 나는 또한 두 번째 값을 얻을 필요가있다.
아! 지금 당장 나가십시오. 'std :: string'을 사용하십시오. – BoBTFish
'strtok'을 사용하여 첫 번째 공간을 찾는 것은 어리석은 일입니다. C++ 코드를 작성하고 있으며 현명한 문자열 클래스를 사용합니다. –
'boost :: split()'이 하나의 대체 옵션입니다 (예를 들어 http://stackoverflow.com/questions/11273989/parse-delimited-string/1174085#11274085 참조). – hmjd