2015-04-23 9 views
0

я следующий код:указатель приводится к указателю, как LPVOID *

IShellLink* psl; 
HRESULT hres = CoCreateInstance(
    CLSID_ShellLink, 
    NULL, 
    CLSCTX_INPROC_SERVER, 
    IID_IShellLink, 
    (LPVOID*)&psl); 

Он правильно составлен. Но мне нужно заменить (LPVOID*)&psl на *_cast. Какую роль я должен использовать?

static_cast<LPVOID*>(&psl) генерирует ошибку (в MSVC 2013).

Будет ли правильным использовать reinterpret_cast<LPVOID*>(&psl)?

+0

'reinterpret_cast' по существу эквивалентен C-style cast. Поэтому, если вы намерены использовать его, просто убедитесь, что знаете, что делаете. –

+0

@barakmanos есть ли способ сделать это при помощи 'static_cast'? – vladon

+1

Вы можете сделать 'static_cast (static_cast (& psl))'. –

ответ

1

Я думаю, вам, возможно, придется использовать reinterpret_cast, так как последний параметр функции CoCreateInstance используется для целей вывода. Смотрите эту ссылку: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686615(v=vs.85).aspx

Так что ли вы C-Style литой или использовать reinterpret_cast, функция просто хочет поставить значение указателя в ваш переменный «PSL» после создания объекта в куче.

1

Да, reinterpret_cast - правильный выбор. Обычно преобразование из типа * в void * должно выполняться неявным, в то время как преобразование из void * в тип * должно выполняться с помощью static_cast. Но в вашем случае вы переходите от типа ** к пустоте **, что не оставляет вам выбора, кроме как использовать reinterpret_cast. Он по-прежнему несколько «безопаснее», чем кастинг в стиле c, потому что вы не можете отбросить его.

+0

Вы и @malhotraprateek ответил одновременно в ту же минуту :-) Спасибо. Я отмечаю его ответ как ответ за то, что он дал ему репутацию (у вас уже много :)) – vladon