运行时错误:`szDeviceType`周围的堆栈已损坏

时间:2012-10-04 15:59:21

标签: c++

嗨我得到一个运行时错误说szDeviceType周围的堆栈已损坏但我不知道,我对c ++很新,所以我不会有最多的知识。非常感谢任何帮助。

HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
int szDeviceType = 0;
char lpszString[MAX_PATH];
LPWSTR szComport = NULL;
LPWSTR szNumChannels = NULL;
char szChannels[MAX_PATH];
char szPort[MAX_PATH];

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

WcaLog(LOGMSG_STANDARD, "Initialized.");

hr = WcaGetIntProperty(L"DEVICETYPE",&szDeviceType);
ExitOnFailure(hr, "failed to get Device Type");

hr = WcaGetFormattedProperty(L"COMPORT",&szComport);
ExitOnFailure(hr, "failed to get Com Port");

wcstombs(szPort, szComport, 500);

hr = WcaGetProperty(L"NUMCHANNELS",&szNumChannels);
ExitOnFailure(hr, "failed to get Com Port");

wcstombs(szChannels, szNumChannels, 500);

    if(szDeviceType == 2)
    {
        strcat(lpszString, "datascan");
        strcat(lpszString, szPort);
        strcat(lpszString, "DATASCAN 7000,DS:");
        strcat(lpszString, szChannels);

    }
    if (szDeviceType == 3)
    {
        strcat(lpszString, "solo");
        strcat(lpszString, szPort);
        strcat(lpszString, "DATASCAN SOLO,SA:");
        strcat(lpszString, szChannels);

    }
    if (szDeviceType == 4)
    {
        strcat(lpszString, "dataweb");
        strcat(lpszString, szPort);
        strcat(lpszString, "DATAWEB,DW:");
        strcat(lpszString, szChannels);
    }

    hr = MsiSetProperty(hInstall, "DATASCANINFO",  lpszString);
    ExitOnFailure(hr, "failed to set DATASCANINFO");


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

1 个答案:

答案 0 :(得分:1)

这看起来很糟糕:

wcstombs(szPort, szComport, 500);

最后一个参数是要写入的最大字符数,但是您的数组的大小仅为MAX_PATH,即260。

您还使用strcat附加到lpszString,而不检查是否溢出。您应该切换到使用已检查边界的strcat_s