Замена устаревшего 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++, где обработчик атрибутов расширит атрибуты. Изучив расширенный код, вы увидите, какой неатрибутивный код соответствует тому, что у вас было на первом месте.

Другие вопросы по тегам