?

Log in

No account? Create an account

Previous Entry | Next Entry

Пожалуй, надо запомнить сегодняшний день - более странного глюка от Мелкомягких я не видел и, наверное, вряд ли увижу.
Сразу предупреждаю: этот пост некомпьютерщикам может показаться скучным, но для истинных программеров он станет настоящей детективной историей!

Итак, поехали!

Я делаю один большой проект - прикладное приложение для 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: Решение было найдено с неожиданной стороны. Что, впрочем, тоже никак не объясняет обнаруженный глюк с переименованием. Я решил поиграться с запуском от имени администратора, и вот что выяснилось: и аутлук, и мое приложение должны быть запущены с ОДИНАКОВЫМИ привилегиями: либо оба как от администратора, либо оба как не от администратора. Но во втором случае возникали проблемы доступа к рабочей папке. То есть решение однозначное - после установки Аутлука просто в явном виде указать запуск его как администратор - и проблема решена! Что, впрочем, подчёркиваю ещё раз - никак не объясняет выявленный попутно необъяснимый глюк :)))

Comments

( 23 comments — Leave a comment )
levaleva
Nov. 26th, 2014 03:35 pm (UTC)
еще в эксперимент. Любую прогу переименовать в проблемное имя и посмотреть :)
golosrazuma
Nov. 26th, 2014 03:37 pm (UTC)
Кстати, да, ради интереса надо сделать пустой проект с одной единственной строкой и называть MyProject - посмотреть, как он будет себя вести :))
(Deleted comment)
golosrazuma
Nov. 26th, 2014 03:45 pm (UTC)
Это я знал :) Но здесь можно хоть какое-то объявнение найти.
(Deleted comment)
golosrazuma
Nov. 26th, 2014 03:50 pm (UTC)
Логичного объяснения нет. Но там совпадение имён - конфликт какой-то, не знаю уж почему :))
Здесь же вообще от балды полностью получается.
(Deleted comment)
golosrazuma
Nov. 26th, 2014 04:02 pm (UTC)
Ну я ж не говорил, что У МЕНЯ есть объяснение :))
etno_exp
Nov. 26th, 2014 04:32 pm (UTC)
1) А exe-шники сильно отличаются?

2) Тут один официальный диллер некоего линукса уже неделю выпускает дистрибутив с нужной версией curl-а, который умеет TLS 1.2. Казалось бы, причём тут Микрософт?
golosrazuma
Nov. 26th, 2014 04:45 pm (UTC)
Размером вообще не отличаются.
Если сравнивать побайтно, то отличия есть :)
etno_exp
Nov. 26th, 2014 04:34 pm (UTC)
А, кстати, вспомнил. Было у нас такое же только другое. Что-то где-то как-то криво кешировалось, в результате чтобы починить переименовали функцию.
golosrazuma
Nov. 26th, 2014 04:45 pm (UTC)
Да, с кешированием тоже сталкивался. А вот с таким маразмом впервые :)
sinclair_sc
Nov. 26th, 2014 05:10 pm (UTC)
Может файл проекта коцаный? Попробуйте сравнить в текстовом виде файлы проектов.
golosrazuma
Nov. 26th, 2014 05:11 pm (UTC)
Файл проекта идентичный абсолютно.
Я несколько раз переименовывал его туда-обратно. С одним именем работает, с другим - нет.
etaceti
Nov. 26th, 2014 06:04 pm (UTC)
похоже, что проблема не в имени проекта или аппликации, а в ее идентификаторах в assembly/manifest или typelib progid/CLSID... поищите переставшие работать идентификаторы в registry. посмотрите не ликают ли у вас ключи registry в больших кол-вах. попробуйте создавать инстанс com-сервера outlook в цикле несколько раз при получении такой ошибки.
golosrazuma
Nov. 26th, 2014 06:06 pm (UTC)
Да, с манифестом тоже пришлось разбираться.
Но в конечном итоге у меня есть два ИДЕНТИЧНЫХ проекта, различающихся только именем. Один работает, другой нет.
lunohod
Nov. 27th, 2014 05:34 am (UTC)
компьютеры - неиссякаемый источник глюков
и со стороны софта и со стороны железа
вчера мне тоже такой косячный нетбук попался, изначально было полное ощущение что просто софт глючит, ан нет... жесткий диск похоже
golosrazuma
Nov. 27th, 2014 06:41 am (UTC)
Да уж, с ними точно не соскучишься! :)
anshdo
Nov. 27th, 2014 10:08 am (UTC)
Сочувствую, коллега. Проблемы с окружением -- это почти всегда самый адов адский ад в отладке.
golosrazuma
Nov. 27th, 2014 10:09 am (UTC)
Да-да :))
grisha_ovnyuk
Dec. 12th, 2014 09:33 pm (UTC)
А зачем отправлять письмо через аутлук? Проще просто через smtp. А если нужно, чтобы письмо добавилось в отправленные, использовать imap. Это стандартные протоколы, работающие с любым почтовым сервером. Вот решат они отказаться от эксченджа и всё перестанет работать.
golosrazuma
Dec. 12th, 2014 09:34 pm (UTC)
От эксченджа они точно не откажутся - он у них возведён в ранг религии практически :))
grisha_ovnyuk
Dec. 12th, 2014 09:54 pm (UTC)
Вот придёт время обновлять сервер, они посчитают, прослезятся и купят какой-нибудь коммунигейт, керио коннект или зимбру. И привет аутлуку.
Но в любом случае, использовать в своей программе для стандартных процедур и стандартных протоколов какое-то третье ПО - это очень не круто. Говорю это, как бывший админ.
golosrazuma
Dec. 12th, 2014 09:56 pm (UTC)
Дело в том, что они только что обновили сервер и поставили на него новый эксченйдж. Говорю же - религия :)
Но я рассматривал предлагаемый вами вариант и уже не помню по какой причине отмёл его.
grisha_ovnyuk
Dec. 12th, 2014 10:03 pm (UTC)
Небось ещё и подписку оформили? Теперь будут вечно MS дань платить.
Кстати, есть ведь ещё и MAPI. Насколько я помню, оно позволяет работать с эксченджем без участия аутлука.
golosrazuma
Dec. 12th, 2014 10:05 pm (UTC)
С MAPI я очень долго возился - там возникала ошибка, которую я так и не смог победить.
А с аутлуком смог :)
( 23 comments — Leave a comment )

Profile

Мечтатель
golosrazuma
Развенчатель мифов

Latest Month

January 2018
S M T W T F S
 123456
78910111213
14151617181920
21222324252627
28293031   
Powered by LiveJournal.com
Designed by Tiffany Chow