#post-id: 3780-06-15
#original-date: 1.12.2010 Wed
#original-time: 6:15 AM
#original-day:  3780
#original-host: WinXP Home SP3 (Build 2600)

Я не знаю как описывать сегодняшнее "приключение". Попробую по порядку =_=

Сначала я хотела релизить Dropbox IM. Ради интереса зашла в абаутбокс, но увидела что полупрозрачная иконка рисуется абы как. Хотя в CommonFunctions.DLL я это исправляла. Баг! Надо разбираться.

Смотрю ченджлог библиотеки - версия соответствует. Потм глянула в файл проекта, а там билд на несколько цифер выше. Меня это насторожило, но мало ли... Открываю проект - всё работает. Ну, значит не откомпилировала, хотя странно. Компилирую - не работает. Компилирую ещё раз - та же фигня. Пошла смотреть версию файла, а она не изменилась. Даже цифровая подпись осталась.

Думала, что не туда компилируется - нет, именно туда, куда нужно. Долго ломала голову, что бы это могло быть, пока наконец подозрение не пало на Link Hack и возможную ошибку из-за несовпадения расширения и библиотеки с ожидаемым EXE.

Открываю Link Hack - всё прекрасно, парсится несмотря на расширение, передаётся и даже линковщик запускается. Командная трока не трогается. Стало быть дело в линкере VB.

Тут я пробовала вызывать разными способами, например с ожиданием, мало ли - не помогло.

Тут я начинаю долгую охоту за сообщением, которое выводит линкер. Окно быстро исчезает, а вывод перенаправлять лень. Наконец с энной попытки удалось разглядеть, что он там пишет. А писал он это:

Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK : fatal error LNK1104: cannot open file "I:\Disk\Output\CommonFunctions0301.DLL"


Мозг взрывается, и я пишу пост, который появился ранее. Я думала, что это VB хватает файл и не отпускает. Поэтому я пошла учить командную строку Unlocker и принудительно освобождать файл перед вызовом линкера. Не помогло!

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

Тут и случается BSOD. настроения никакого, перезагружаюсь и начинаю выяснять, кто виноват, и что это за код такой 0x1000007E. Оказалось, что это что-то про испорченный драйвер, а WinDbg из малого дампа вытащил только ntoskrnl.exe. Не густо. Думаю, что кирдык, надо откатываться, а ведь ничего и не ставила в последнее время, даже обновлений.

Начинаю экспериментировать. Вызов линкера из FAR приводит к падению системы. Включаю полный дамп памяти (не лише, да и вопреки утверждению IT Happens полный дамп создаётся всего один и не засирает ничего) и получаю новый код ошибки - 0x000000C5. В принципе тоже самое. Но на этот раз анализ говорит про SandBox.SYS, который относится к Аутпосту.

Пробую отключать Аутпост, но фиг - дрова-то висят в памяти. Форумы пугают смертью памяти или мамы, всё плохо, пишу в саппорт.

Тут у меня появляется идея. Я копирую командную строку линковщика и пытаюсь выполнить в окне Run - не влезает! Открываю CMD и прозреваю - вот это командная строка! Но BSOD происходит на пятый запуск, а перед этим каждый раз выдаётся исключение. Решив, что может быть линковщику командная строка слишком длинная, я перенесла файлы в другую папку и сильно укоротила пути - бесполезно.

Думаю, что надо ставить вместо SP5, который я когда-то поставила, SP6. Мысли разные, раз проблема локализована, можно не так опасаться. Ну и ещё появилась пара идей. Пока открывается бэкап домашней машины и и оттуда распаковывается виртуалка с NT4 (на ней есть VB и нет Аутпоста), я сравниваю версию домашнего линковщика и здешнего - одна и та же. Плохо.

Попутно выясняется, что линковщик повредился, но есть бэкап. Версии всё равно разные. А ещё выясняется, что ни VPC, ни сервиспака у меня нет - качаем ^^

http://www.microsoft.com/downloads/en/details.aspx?FamilyId=28C97D22-6EB8-4A09-A7F7-F6C7A1F000B5&displaylang=en

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=A8494EDB-2E89-4676-A16A-5C5477CB9713&displaylang=en

Ставлю сервиспак. Помнится, при компиляции из IDE проблем не было, только сообщение об ошибке. Проверяю именно так - бесполезно.

Разворачиваю виртуальную машину. Тут оказывается, что сети у меня нет (сетевой кабель не подключен, физический интерфейс в коме), поэтому приходится ставить Loopback Adapter. Наконец всё есть, машина работает просто прекрасно. Преодолев несколько организационных моментов я сталкиваюсь всё с той же проблемой - не работает хоть тресни, теперь уже в NT4 выдаётся сообщение о том, что DLL не может быть открыта.

И тут я в отчаянии понимаю, что раз он не может открыть существующую DLL, то нужно сделать её несуществующей. Также я вспоминаю про папку Unsupport на диск с VB. Там было много интересных утилит от индусов из Microsoft, а также я увидела технику обеспечения двоичной совместимости.

Делалось это так. Сначала делалась ActiveX DLL с нужными интерфейсами. Потом она компилировалась и переименовывалась в DllName.CMP. Далее она назначалась как библиотека для двоичной совместимости, а сам проект компилировался в отдельную DLL.

У VB5 был глюк, когда при назначении самой DLL как двоично совместимой, компилятор не мог её перезаписать. Поэтому использовался такой трюк. Но вот в VB6 вроде бы глюк убрали и я про технику забыла. А зря! Проделала тоже самое, и всё прекрасно откомпилировалось! И никаких бсодов.

Проверила на боевой машине - тот же результат! Теперь буду знать, где подводный камень. Получила, называется, опыт.

Мне только обидно, что на это я потратила больше шести часов.