Безопасность и стабильность SetParent() и getParent()

#c# #.net #winapi #pinvoke

#c# #.net #winapi #pinvoke

Вопрос:

Я использую следующие функции в своей программе:

 [DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr GetParent(IntPtr hWnd);
 

Мой вопрос таков: является ли этот подход безопасным и стабильным? Моя машина для разработки — Windows XP, и до сих пор я не обнаружил никаких проблем с ее использованием. Интересно, могут ли у меня быть проблемы в разных версиях (например, Windows Vista, Windows 7, что угодно), разных процессорах (x64) и т. Д. Можете ли вы, ребята, предоставить некоторые отзывы по этому поводу, и если есть какие-то потенциальные проблемы, как я могу их преодолеть?

Заранее спасибо.

Зубровка

Комментарии:

1. SetParent — довольно неприятная функция, ею часто злоупотребляют, чтобы склеивать окна, принадлежащие разным потокам или процессам. Который умеет превращать процесс в кататонический, когда склеенный перестает отвечать на сообщения. Безопасность потоков тоже становится неясной. Имеет ли это отношение к вам, невозможно догадаться из вопроса. Вам нечего бояться версий Windows, поддержание стабильности winapi — это хлеб с маслом Microsoft.

2. Молодец, Ганс, спасибо. Я собираюсь сделать краткий обзор кода, касающийся пунктов, которые вы упомянули!

Ответ №1:

Эти объявления P / invoke верны для всех версий Windows. Никаких проблем с XP / Vista / 7 и никаких проблем с 32/64 битами. IntPtr плавает между 32 и 64 битами в зависимости от разрядности процесса. Это именно то, что вам нужно, чтобы произошло для HWND .

Комментарии:

1. 1 для IntPtr плавает между 32 и 64 битами в зависимости от разрядности процесса 🙂