Как я могу предотвратить отображение MessageBox в сторонней библиотеке? - PullRequest
16 голосов
/ 01 февраля 2010

Я интегрирую сторонний SDK на основе C в свое приложение .NET.Приложение будет работать как служба Windows на сервере, поэтому оно не должно взаимодействовать с пользователем каким-либо образом.

К сожалению, при определенных условиях ошибки оно настаивает на вызове MessageBoxA, предположительно, чтобы сообщить, что произошло что-то плохое,Когда это происходит, служба перестает отвечать на запросы.Я предполагаю, что он ждет, когда кто-то нажмет Ok?

Невозможно, чтобы продавец изменил свой код для меня.

Есть ли способ сделать этот вызов вno-op, чтобы мой код мог автоматически справиться с ситуацией?

РЕДАКТИРОВАТЬ: может быть важно упомянуть, что в моем конкретном случае служба автоматически перезапустится в случае сбоя.Изящный (насколько это возможно) и внезапный выход, вероятно, является лучшим решением для ситуации, когда в моем случае отображается MessageBox.

Ответы [ 3 ]

10 голосов
/ 01 февраля 2010

Оформить Обход из Microsoft Research Это позволяет обходить произвольные функции Windows API.Программирование на C / C ++ необходимо, чтобы оно работало.Вам не нужно много.

3 голосов
/ 01 февраля 2010

Вы можете использовать редактор, чтобы найти местоположение этого и удалить вызов из их двоичного файла. Но это может или не может быть допустимо в соответствии с ограничениями использования с программным обеспечением. Конечно, если вы будете распространять его повторно, это может вызвать проблемы - вам следует обратиться к поставщику и сообщить об этом как о дефекте и предложить, чтобы у вас был обходной путь для собственного использования.

Для людей, которые раньше занимались такими вещами (взлом лицензий или другой реверс-инжиниринг), это довольно просто, но реальный вопрос в том, что произойдет, если его игнорировать - он все еще продолжает работать?

0 голосов
/ 01 февраля 2010

Это не очень легко. Я думаю, что единственный способ - это перехватить сообщение, чтобы перехватить сообщения, прокачанные через все циклы сообщений Windows в системе. Но я даже не уверен, что служба может создать перехват сообщений, если у нее нет доступа к оконной станции по умолчанию под ее учетными данными по умолчанию (LocalSystem). Итак, задача № 1 - увидеть, сработает ли это на самом деле.

Но вот примерный набросок того, как я попытался бы сделать это вне контекста службы, и вы можете увидеть, применимо ли это:

  1. Создание окна hook для перехвата сообщений из всех очередей сообщений Windows в системе.
  2. Перехватите все сообщения WM_CREATE и проверьте параметр CREATESTRUCT на наличие сообщений, которые могут исходить из вашей сторонней библиотеки. Возможно, вам придется зарегистрировать все сообщения WM_CREATE, а затем проанализировать данные, чтобы увидеть, как вы можете отличить диалог вашей библиотеки от любого другого диалога в системе. (Много раз член "lpszName" отличается между реализациями диалога.)
  3. если вы считаете, что конкретный WM_CREATE пришел из вашей библиотеки, верните «обработанный» ответ из ловушки сообщений и не вызывайте следующий обработчик сообщений в цепочке.

Это все очень рискованно, но это тот путь, который кажется мне хоть каким-то шансом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...