У меня есть EXE, который я хочу вызвать из службы.Этот EXE-файл был разработан на C #, но с помощью COM-взаимодействия он вызывает разработанные нами библиотеки DLL.Некоторые из этих DLL используют кучу рабочего стола, потому что у них есть окна / меню / и т. Д., Которые созданы, но никогда не видны.Поверьте мне, это слишком много, чтобы предотвратить это.
Мы разработали ATL-серверы до того, как их вызвали из службы.Для службы ATL мы можем создать новый рабочий стол с большей кучей, используя вызовы CreateDesktopEx()
.После создания рабочего стола мы можем вызвать SetThreadDesktop()
, чтобы изменить рабочий стол.Файлы ATL EXE работают годами.
Теперь появился другой C # EXE.Мы хотим быть в состоянии сделать то же самое с кучей рабочего стола.Я написал функции PInvoke и убедился, что они работают, чтобы иметь возможность создавать рабочие столы и устанавливать их - до тех пор, пока поток не является STA.
Теперь все, что мне нужно для вызова, должно выполняться в SingleРезьбовая квартира (STA).Итак, для функции Main () в EXE я добавляю атрибут [STAThread]
.В течение года все работало нормально, но теперь мы хотим иметь возможность изменить кучу рабочего стола / рабочего стола.
В моем STAThread я могу успешно создать рабочий стол, используя CreateDesktopEx()
, но когда я пытаюсь установитьрабочий стол использует SetThreadDesktop()
, затем происходит сбой с кодом ошибки Win32 170, который задокументирован в документации SetThreadDesktop()
.
Если в потоке были созданы какие-либо хуки или окна, рабочий стол изменить нельзя.Я предполагаю , что эффект атрибута STAThread заключается в вызове CoInitialize/Ex()
под колпаком, и что CoInitialize/Ex()
создает невидимое окно для обработки входящих вызовов или устанавливает какой-то тип перехвата.
Я уже пытался создать новый поток с именем Thread.SetApartmentState()
со значением STA и запустить поток, но я все еще не могу изменить кучу рабочего стола / десктопа.
Я хочу знать, есть личто-нибудь, что я могу сделать, чтобы отложить это, или отменить это, чтобы я мог установить кучу рабочего стола?