Пожалуй, надо запомнить сегодняшний день - более странного глюка от Мелкомягких я не видел и, наверное, вряд ли увижу.
Сразу предупреждаю: этот пост некомпьютерщикам может показаться скучным, но для истинных программеров он станет настоящей детективной историей!
Итак, поехали!
Я делаю один большой проект - прикладное приложение для Windows. Как это обычно бывает у программистов, то, что планировалось как небольшое приложение максимум на полгода, вылилось в грандиозный проект, который продолжается уже 4-й год, и список "хотелок" от заказчика не иссякает. А мне и хорошо - деньги платят, пусть и дальше хотят :))
Есть в этом приложении момент, где оно автоматически отправляет через Outlook электронное письмо-подтверждение клиенту из базы данных. И всё было прекрасно, всё работало на любых виндах и на любой версии аутлука. До вчерашнего дня. Один компьютер заказчик обновил до Windows 8.1 и впендюрил на него Outlook 2013. И оказалось, что при запущенном аутлуке приложение не может отправить сообщение, вылетая с ошибкой:
OLE Error Code 0x80080005 Server Execution Failed.
Я перерыл весь инет и ничего полезного для себя не нашел. Усугублялась ситуация тем, что проверить всё это у себя я не мог ввиду отсутствия у меня как восьмых форточек, так и 13-го аутлука. Но делать нечего - пришлось мне спецом ради такого установить себе на дополнительный ноут восьмёрку с соответствующим офисом, потратив полдня.
И вот случилась первая большая радость программиста - мне удалось воспроизвести ошибку! Считай, это значит, я уже на полпути к решению проблемы :))
Итак, с чего начать "ремонт"? Самое простое - создать новый проект с одним единственным модулем с одной единственной операцией, которая бы при запущенном аутлуке отправляла письмо на мой адрес посредством аутлука же. Здесь всё сработало безукоризненно. Тогда я начал вставлять эту строку в свое приложение, которое неизменно грохалось. В попытках определить, в каком месте кода находится тот самый "рубикон", после которого возникает этот глюк, я стал ставить эту строку всё ближе и ближе к началу, пока не поставил её самой первой строкой в приложении - оно по-прежнему грохалось.
Тогда я решил зайти с другой стороны. Я создал совершенно новый проект с новым именем (назовем его MyProj) и потратил почти час, кропотливо добавляя в него каждый модуль, который присутствовал в оригинальном проекте (назовем его MyProject). Скомпилировал новый проект и получил экзешник myproj.exe. Запустил - ура, работает! Убрал первую строку и проверил систему уже в реальном действии - письмо отсылается, всё прекрасно!
И тут начинается самое интересное. Воодушевлённый, я переименовал оригинальный проект в MyProject_OLD, новый проект MyProj обозвал привычным MyProject и радостно скомпилировал myproject.exe. Запустил его, и вижу знакомый глюк. Первая мысль была - старые версии файлов где-то в кэше остались. Поэтому я очистил кэш, перезапустил рабочую среду, полностью перекомпилировал myproject.exe - тот же глюк. Я начинаю понимать, что я чего-то не понимаю, но чего именно я не понимаю, я пока ещё не понимаю :)))
Переименовываю этот же проект обратно в MyProj, компилирую myproj.exe - он работает без единой помарки. Абсолютно тот же самый проект, названный MyProject, скомпилированный в myproject.exe, даёт ошибку. Беру рабочий myproj.exe, переименовываю в myproject.exe - всё прекрасно работает. А скомпилированный из MyProject, он работать отказывается. Итак, резюме: MyProj, скомпилированный в экзешник с любым именем, работает. А тот же самый проект, переименованный в MyProject и скомпилированный в экзешник с любым именем, работать отказывается.
Как такое вообще возможно??? Впрочем, на этот вопрос вряд ли есть вразумительный ответ :) Для меня же главное - решение найдено, но не перестают удивлять ребята из Микрософта :))))
UPD: Внезапное продолжение истории. Через некоторое время MyProj тоже перестал работать. Зато переименовываю его во что угодно другое, компилирую, переименовываю экзешние - и всё работает! Это какой-то немыслимый пипец! Похоже, мне предстоит долгая ночка :)))
UPD2: Решение было найдено с неожиданной стороны. Что, впрочем, тоже никак не объясняет обнаруженный глюк с переименованием. Я решил поиграться с запуском от имени администратора, и вот что выяснилось: и аутлук, и мое приложение должны быть запущены с ОДИНАКОВЫМИ привилегиями: либо оба как от администратора, либо оба как не от администратора. Но во втором случае возникали проблемы доступа к рабочей папке. То есть решение однозначное - после установки Аутлука просто в явном виде указать запуск его как администратор - и проблема решена! Что, впрочем, подчёркиваю ещё раз - никак не объясняет выявленный попутно необъяснимый глюк :)))