Замена устаревшего atl атрибута
Как заменить устаревший код atl (предупреждение Visual Studio 2015 C4467)?
Структура данных находится в файле DataType.h
struct SData4
{
SData4() { Init(); }
~SData4() { Delete(); }
void Init();
void Delete();
LPWSTR m_strSomething;
[string] LPWSTR m_strCode;
};
Файл IDL содержит описания методов с использованием этой структуры следующим образом:
// interface version 6.0
[
object,
uuid(...-.-.-.-.),
helpstring("IData4 Interface"),
pointer_default(unique)
]
interface IData4 : IUnknown
{
[helpstring("method SetData")] HRESULT SetData([in] long lLen, [in, size_is(lLen)] SData4* s);
};
Чего я не понимаю, так это того, что есть LPWSTR
определения без [string]
атрибут в той же структуре. И это работает в течение десяти лет:/ Страница справки Microsoft https://msdn.microsoft.com/en-gb/library/8tesw2eh.aspx утверждает, что
[string]
Указывает, что одномерный массив char, wchar_t, byte или эквивалентный массив или указатель на такой массив должен рассматриваться как строка.
Поэтому я должен найти способ сообщить DCOM, что это WCHAR *
это строка Но почему и как?
Хорошо, я нашел указание в книге "Внутри распределенного COM" от Гая и Генри Эддона. Они утверждают, что [string]
Атрибут позволяет пользователю отправлять строки без определения фактической длины строки. Если атрибут пропущен, вы должны реализовать управление памятью этой строки, используя CoTaskMemAlloc
а также CoTaskMemFree
,
1 ответ
Заменить [string]
или другой атрибут ATL, общее решение состоит в том, чтобы включить опцию Expand Attributed Source в настройках проекта. Затем при построении кода у вас будет не атрибутируемый код C++, где обработчик атрибутов расширит атрибуты. Изучив расширенный код, вы увидите, какой неатрибутивный код соответствует тому, что у вас было на первом месте.