2016-12-20 4 views
0

Как заменить устаревший код atl (предупреждение Visual Studio 2015 C4467)?
Структура данных находится в файле DataType.hзамена устаревшего атрибута atl

struct SData4 
    { 
     SData4() { Init(); } 
     ~SData4() { Delete(); } 
     void Init(); 
     void Delete(); 
     LPWSTR m_strSomething; 
     [string] LPWSTR m_strCode; 
    }; 

Файл IDL содержит метод declerations, используя эту структуру следующим образом:

// 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] в пределах одной и той же структуры. И он работал в течение десяти лет:/Майкрософт страницу помощи https://msdn.microsoft.com/en-gb/library/8tesw2eh.aspx заявляет, что

[string] Указывает, что одномерная голец, wchar_t, байт, или эквивалентный массив или указатель на такой массив должен рассматриваться как строка.

Поэтому я должен найти способ сообщить DCOM, что это WCHAR * является строкой. Но почему и как?

Хорошо, я нашел показание в книге «Внутри распределенного COM» от Гая и Генри Эддона. Они заявляют, что атрибут [string] позволяет пользователю отправлять строки без определения фактической длины строки. Если атрибут опущен, вам необходимо реализовать управление памятью этой строки, используя CoTaskMemAlloc и CoTaskMemFree.

+0

Я не вижу контекста, поэтому немного сложно ответить. Если это просто ключевое слово MIDL, просто удалите его и добавьте в проект подходящий файл idl. – xMRi

+0

Вернувшись к проекту, я исправил контекст вопроса и добавил некоторые результаты исследований, найденные в прошлом месяце. – Melli

ответ

2

Для замены [string] или другого атрибута ATL, общее решение должно включать опцию Expand Attributed Source в настройках проекта. Затем при создании кода у вас будет непривилегированный код C++, где процессор атрибутов расширил атрибуты. Проверяя расширенный код, вы видите, какой непривязанный код соответствует тому, что у вас было на первом месте.

+0

Это действительно было бы полезно. К сожалению, это выглядит как ошибка/Fx. При установке этого параметра ожидаемые файлы .mrg.cpp/.h не создаются. Вместо этого возникают ошибки компиляции, начинающиеся с атрибута «c2337 not found». – Melli