Искаженная строка LPCTSTR, возвращенная из функции - PullRequest
1 голос
/ 13 января 2012

У меня есть два проекта, A и B

Проект A скомпилирован с:
1. Стандартными библиотеками Windows
2. Многобайтовый набор символов
3. НЕТ поддержки общего языка

Проект B скомпилирован с:
1. MFC как динамическая dll
2. Многобайтовый набор символов
3. WITH с использованием поддержки общего языка

СледующееФункция определена в проекте A:

LPCTSTR CAppProxy::DriverName(IDriverAgent *driver)  
{  
  BSTR bstr;  
  HRESULT hr = driver->get_Name(&bstr);  
  CString str = CString(bstr);  
  return(str);  

}

и вызывается из проекта B с использованием:

CString name = appProxy->DriverName(driver);

, но когда вызывается имя драйвера, содержимое«имя» - это мусор

1 Ответ

4 голосов
/ 13 января 2012

Классическая ошибка: вы возвращаете указатель на локальный объект, срок действия которого истекает в конце функции. Стек, содержащий строку, освобождается и перезаписывается случайным материалом.

В частности, вы возвращаете указатель на структуру данных внутри объекта CString, которая становится недействительной при уничтожении CString.

Если оба проекта используют одну и ту же версию CString, вы можете вернуть одну из них вместо LPCTSTR.

...