Я пытаюсь просмотреть все окна (используя Windows API) и получить список окон, но когда я пытаюсь передать вектор как LPARAM, я получаю сообщение об ошибке:
- непримитивное приведение: *mut Vec<isize> as LPARAM выражение as может использоваться только для преобразования между примитивными типами или для приведения к определенному типу-объекту
Код:
unsafe {
let windows: Vec<isize> = vec![];
let _ = WindowsAndMessaging::EnumWindows(Some(enum_window), &mut windows as *mut Vec<isize> as LPARAM).ok();
};
Если не может, то как мне передать LPARAM
@MichaelChourdakis, в вопросе нет закрытий, поэтому я не понимаю вашего комментария.
Пожалуйста, отредактируйте свой вопрос, чтобы добавить полный минимально воспроизводимый пример . В частности, что такое enum_windows и откуда берется WindowsAndMessaging::EnumWindows? Единственный EnumWindows, который я смог найти в winapi, это winuser::EnumWindows…
Это отвечает на ваш вопрос: stackoverflow.com/questions/38995701/…?
LPARAM(&mut windows as *mut Vec<isize> as isize) для создания LPARAM, который обертывает указатель.





Диагностика ошибок содержит две важные части информации:
*mut Vec<isize> as LPARAM
an as expression can only be used to convert between primitive types
Любой из них точен. Любой *mut _ примитивный тип обязательно означает, что LPARAM им не является. И это тоже правильно. Как и большинство типов, которые появляются в преобразованной поверхности API, представленной ящиком windows , LPARAM следует идиоме newtype.
Это предотвращает распространенные ошибки, когда разные типы используют один и тот же базовый тип (например, HWND и HDC), но также требует, чтобы клиенты создавали значения типа-оболочки. Кастинг не будет работать, как это было бы с крейтами winapi или windows-sys (вместо этого они используют псевдонимы типов для примитивных типов).
Второй аргумент EnumWindows должен быть
LPARAM(&mut windows as *mut Vec<isize> as isize)
Стандартные вызовы winapi не могут принимать закрытия.