早就听说msdn里的例子代码问题多,今天也看到一处。
例子代码url:
http://msdn2.microsoft.com/en-us/library/bb250436.aspx
问题的代码:
两个问题:
1、这里Unicode转换ANSI,如果工程没有定义为UNICODE的话,TCHAR就等于char,把实际上SysStringLen * 2大小的串往SysStringLen大小的堆内存里拷贝,就会造成一个堆溢出。
2、SysStringLen大小也不对,该申请的内存大小应该是SysStringLen + 1。
严谨的代码应该这样写:
不知道实际情况下有没有有问题的程序,赫赫。
例子代码url:
http://msdn2.microsoft.com/en-us/library/bb250436.aspx
问题的代码:
// Convert the text from Unicode to ANSI
LPTSTR psz = new TCHAR[SysStringLen(bstrHTMLText)];
lstrcpy(psz, OLE2T(bstrHTMLText));
LPTSTR psz = new TCHAR[SysStringLen(bstrHTMLText)];
lstrcpy(psz, OLE2T(bstrHTMLText));
两个问题:
1、这里Unicode转换ANSI,如果工程没有定义为UNICODE的话,TCHAR就等于char,把实际上SysStringLen * 2大小的串往SysStringLen大小的堆内存里拷贝,就会造成一个堆溢出。
2、SysStringLen大小也不对,该申请的内存大小应该是SysStringLen + 1。
严谨的代码应该这样写:
DWORD dwLen = (SysStringLen(bstrHTMLText) + 1) * (sizeof(WCHAR) / sizeof(TCHAR));
LPTSTR psz = new TCHAR[dwLen];
memset(psz, 0, dwLen * sizeof(TCHAR));
lstrcpy(psz, OLE2T(bstrHTMLText));
LPTSTR psz = new TCHAR[dwLen];
memset(psz, 0, dwLen * sizeof(TCHAR));
lstrcpy(psz, OLE2T(bstrHTMLText));
不知道实际情况下有没有有问题的程序,赫赫。