Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

понедельник, 3 сентября 2012 г.

Только С++, только хардкор!

Перепост комментария с ДОУ. Сорри за нецензурную лексику, но как же нехило люто доставляеД =)

ПАЦАНЫ, Я КОРОЧЕ ШЕЛ СЕГОДНЯ ПО ОФИСУ И УВИДЕЛ ПРОГЕРА В МАЙКЕ «С# IS THE FUTURE», НУ Я ПОДСКОЧИЛ К ЕГО КОМПУ И РЕЗКО НАПИСАЛ «std::cout << std::endl;» И ПОЯСНИЛ ЭТО ОДНОСТРОЧНЫМ КОММЕНТОМ, ПОТОМУ ЧТО Я УГОРЕЛ ПО ПЛЮСАМ, ПАЦАНЫ ДУХ ООП ЖИВЕТ ТОЛЬКО В МНОЖЕСТВЕННОМ НАСЛЕДОВАНИИ, ГДЕ В ПЕРЕГРУЗКЕ ОПЕРАТОРОВ НА ОДИН ПАРАМЕТР МЕНЬШЕ, ГДЕ ЕБАШАТСЯ ПО СТАТИЧЕСКИМ МАССИВАМ, ГДЕ ПАЦАНЫ ЖИВУТ УКАЗАТЕЛЯМИ, ЧИСЛЕННЫМИ ЗНАЧЕНИЯМИ В УСЛОВИЯХ И ЕБУТ СБОРЩИКИ МУСОРА В РОТ! ТОЛЬКО С++, ТОЛЬКО ХАРДКОР!!! СТРАУСТРУП ХАРДКОР С++!!! пацаны ебашьте дельфикодеров, шарперов, пехапешников, жаверов, угорайте на компиляции в машинный код, любите Страуструпа, плюсокодеров и IDE! ГОВОРИТЕ ОТКРЫТО И СМЕЛО ПРЯМО В ЛИЦО! С++!

среда, 25 июля 2012 г.

Коаны о программировании

Репост с Хабра: http://habrahabr.ru/post/147148/

Глубокая мудрость в рассказах этих, прочти и проникнись, юный падаван! :-)


От переводчика: The Codeless Code — сборник побасенок о философии программирования. Побасенки в сборнике разные — некоторые весьма кровожадные, некоторые достаточно хардкорные с технической точки зрения (родной язык автора — Java), но встречаются очень емкие. Представляю вам перевод семи наиболее полюбившихся мне историй, остальные 30+ (новые добавляются каждую неделю) можно найти на сайте.


Пустяк


Три дня и три ночи мастер не появлялся из своей кельи. На четвертый день монахи отправили послушника проведать его.

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

Мастер ответил: «Здесь есть изъян, и я размышляю, как лучше его исправить.»

Послушник воскликнул: «Но вы же проповедуете важность расстановки приоритетов, как же можете вы зацикливаться на чем-то столь мелком и незначительном?»

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

Инкапсуляция


Молодой монах объявлял открытыми не только все методы классов, но также и все атрибуты. Настоятель монастыря устал делать ему замечания и обратился за советом к мастеру.

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

«Вспороть тебе живот,» — отвечал мастер, — «чтобы положить туда рис и налить чай. У меня на сегодня плотное расписание, и мне кажется, такой метод угощения гостей будет очень эффективным.»

После этого монаху не нужно было делать замечаний по этому поводу.

Бесконечности


Два монаха из клана Паутины спорили о том, вошла ли программа в бесконечный цикл.

«Сколько уже она выполняется?» спросил настоятель монастыря.

«Не больше получаса,» ответил худой бледный монах.

«Но и не меньше этого,» уточнил полный смуглый монах.

«И все это время вы бездельничали, ожидая, пока она завершится?» уточнил настоятель. Монахи пристыжено поклонились.

Настоятель рассказал об этом мастеру. Тот сказал, «Худой монах считает, что цикл не бесконечен. Дайте ему мех вина за мудрость — никакой цикл не может быть бесконечен. Однажды произойдет сбой питания, или сервер рассыпется в пыль, или солнце поглотит Землю.»

Настоятель спросил, «А как же толстый монах, который считает, что цикл бесконечен?»

«Ему дайте два меха вина, ибо он мудрее. Пользователю, который ждет за своим браузером, десять секунд кажутся агонией, минута — миллиардом лет, а все, что еще дольше, — вечностью. Когда тигр терзает антилопу, ей неважно, использует он восемь когтей или миллион.»

Эволюция


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

Во время следующего обзора кода послушник с удивлением увидел, что мастер крайне недоволен.

«Но мастер,» — запротестовал он, — «Я следовал вашему примеру с точностью до последней точки с запятой. Вот ваш класс, написанный в том месяце — разве не похож он на мой, как два яйца из одной кладки?»

«В этом-то и проблема,» нахмурился мастер. «Вчера я был глупцом, на прошлой неделе — идиотом, а месяц назад — имбецилом. Не показывай мне код, который я мог бы написать вчера, покажи мне код, который я мог бы написать завтра.»

Сорняки


Храму был нужен новый монах, и два потенциальных адепта претендовали на это место. Мастер велел монаху провести собеседование с обоими. В тот же вечер монах доложил:

«Они были полностью равны во всех отношениях — возраст, вес, внешность, манеры, обращение с мечом и предпочтения относительно кофеиносодержащих напитков. Тогда я дал им одну и ту же логическую задачу; один из них решил ее, второй — нет.»

Тогда мастер велел монаху отвести его в комнаты, где проводились собеседования. Вначале они отправились в комнату кандидата, который не справился с задачей. На доске еще оставались его наброски к задаче: болезненно аккуратные цифры выстроились в ровные строчки и столбики. Мастер быстро нашел ошибку в рассуждениях кандидата и сказал «Вот ростки гороха, пытающиеся пробиться через зимний снег. Если мы взрастим их, весной у нас будет славный обед.»

Затем они перешли в комнату кандидата, который решил задачу. Его записи тоже оставались на доске, расползаясь по ней без заметного порядка. Поспешно нацарапанные каракули вились зигзагами, иногда наползая друг на друга — паутина ахинеи. Мастер покачал головой: «Ты говоришь, что здесь душистый укроп и лимонная трава, но я не могу найти их среди сорняков.»

Река чая


Только мастер устроилась в своем любимом чайном доме, как к ней подошел молодой послушник узнать ее мнение о коде, который он написал.

Мастер изучила листинг и обнаружила, что каждый метод в нем тщательно задокументирован. Для метода setName класса Person было указано, что он устанавливает имя человека; метод getName подтверждал, что он возвращает имя, установленное setName; и даже метод toString клялся, что он вернет строку.

Мастер отбросила листинг и сидела в молчании. Через некоторое время послушник спросил, недовольна ли она.

«Интересный вопрос,» — ответила мастер и указала на код, — Это бумага, лежащая на татами. На бумаге чернила. Чернила складываются в много слов. На кипарисе снаружи сидит птица. У птицы два крыла с перьями и два глаза..."

Она продолжала в том же духе, пока послушник не покраснел. Он собрал свой код и удалился, пристыженный, но просветленный.

Мусор


Мастер изучала программу, написанную в удаленном монастыре. На ее мониторе большие фрагменты кода светились не черным, а зеленым — они были закомментированы.

«Любопытно,» — сказала мастер, — «Я открыла точные часы и обнаружила внутри кожуру апельсина и рыбьи кости.»

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

«Это можно понять,» — кивнула мастер.

На следующий день монахи собрались на встречу с мастером. Их беспокоило то, что настоятеля нигде не могли найти. Мастер указала им вверх, на стропила, где висело тело настоятеля.

«Услуги вашего настоятеля больше не требуются,» — сказала мастер. — «Но оставьте его тело разлагаться над вами. В конце концов, однажды его методы могут снова потребоваться, и было бы расточительно обучать нового с нуля.»

В своем отчете мастер отмечала быстрое изменение методов работы клана. Она приписывала это хорошему примеру покойного настоятеля и писала «Нам следует рассмотреть возможность его восстановления в должности.»

суббота, 14 января 2012 г.

RockScroll плагин для Visual Studio

Супермегаклассный плагин для Visual Studio - подсветка токенов в стиле Notepad++. Очень удобен, когда имеется исходник на несколько экранов - два клика на имени функции/переменной и сразу видно где еще по коду она используется + удобная навигация по коду с помощью вьюшки, которая справа в окне редактора. Скачать можно здесь, инсталлируется в один клик.

Единственное замечание - цвет подсветки можно было сделать и насыщеннее( например, зеленым как Notepad++ ), я специально демонстрирую с желтым фоном редактора потому, что на белом фоне с низкой яркостью монитора ничего не видно. Может, цвет можно настраивать самому, но я ничего подобного не нашел.



пятница, 1 июля 2011 г.

Константная ссылка на временный объект

Век живи - век учись!

Только намедни узнал о том, что привязка временного объекта к константной ссылке продлевает жизнь временного объекта до тех пор, пока живет сама ссылка. Это декларирует Стандарт(р12.2.5).

Например, в результате работы следующего кода, на экран будет выведено "temporary string". Удивительно, не правда ли!

string foo()
{
    return string("temporary string");
}

int _tmain(int argc, _TCHAR* argv[])
{
    const string& str = foo();
    cout << str.c_str(); // outputs "temporary string"

    return 0;
}

суббота, 25 июня 2011 г.

Интересные задачки для собеседований по C++

Помимо выслушивания зазубренных ответов на стандартные вопросы типа

"Что такое полиморфизм?",
"Что представляет собой STL?",
"Какое отличие между std::auto_ptr и boost::shared_ptr?",

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

Вот чтобы выявлять таких вот нерадивых кандидатов, я решил помимо  списка вопросов составить список задачек, которые буду предлагать на собеседованиях. Приглашаю всех поучаствовать в составлении.
  • Заменить в битовом представлении числа самый правый ноль на единицу.
int ReplaceLastZeroWithOne( int i )
{
    return i | ( i + 1);
}

  • Вывести число как последовательность битов в прямом и обратном порядке.
// Решение в лоб
void OutputBitsReverse( int i )
{
    while( i )
    {
        if( i < 2 )
        {
            cout << i;
        }
        else
        {
            short bit = i % 2;
            cout << bit;
        }

        i /= 2;
    }
}
 
void OutputBitsReverse(unsigned val)
{
    unsigned reverseMask = 1;
    printf("%u = ", val);

    for( unsigned i = 1; i <= 32; i++)
    {
        putchar(val & reverseMask ? '1' : '0');
        val >>= 1 ;
    }   
}

void OutputBitsForward(unsigned val)
{
   unsigned forwardMask = 1 << 31;
   printf("%u = ", val);

   for( unsigned i = 1; i <= 32; i++)
   {
      putchar(val & forwardMask ? '1' : '0');
      val <<= 1 ;
   }
}
  • Реализовать функцию atoi() для целых неотрицательных чисел в десятичном формате.
// Решение в лоб, без дополнительных проверок на переполнение
int atoi_( const char* src )
{
    if( !src )
    {
        return 0;
    }
 
    int result = 0;
    int strlen = 0;
    const char* tmp = src;
    char ch;

    while( ch = *tmp++ )
    {
        if( ( '0' > ch ) || ( '9' < ch ) )
        {
            return 0;
        }

        ++strlen;
    }

    while( *src )
    {
        int digit = *src++ - '0';
        double base = 10;
        result += digit * pow( base, --strlen );
    }

    return result;
}

вторник, 7 июня 2011 г.

Получение букв дисков приаттаченых к USB девайсам (Enum drive letters attached to USB devices)

WinAPI-шная функция GetDriveType() имеет существенный недостаток - она определяет USB hard drive'ы как фиксированные диски DRIVE_FIXED. Недавно мне понадобился функционал, который бы отличал настоящие жесткие диски от USB. Как оказалось, задача почему-то решается нетривиально - либо через WMI, либо через SetupAPI. WMI не подходил всвязи со спецификой проекта, оставался SetupAPI. Полдня изучения основ SetupApi и полдня гугления, изучения экзэмплов и чтения форумов привели меня на CodeProject, где я и нашел решение.  Так вот хочу я вам сказать, мои дорогие друзья, я бы в жизни не подумал, что эта задача решается настолько через жопу!
Но нашелся у меня в тиме человек, который буквально за полтора часа  родил компактное и лаконичное решение. Собственно, не могу не поделится.

bool IsUsbDevice( wchar_t letter )
 {
  wchar_t volumeAccessPath[] = L"\\\\.\\X:";
  volumeAccessPath[4] = letter;

  HANDLE deviceHandle = CreateFileW(
   volumeAccessPath,
   0,                // no access to the drive
   FILE_SHARE_READ | // share mode
   FILE_SHARE_WRITE, 
   NULL,             // default security attributes
   OPEN_EXISTING,    // disposition
   0,                // file attributes
   NULL);            // do not copy file attributes

  // setup query
  STORAGE_PROPERTY_QUERY query;
  memset(&query, 0, sizeof(query));
  query.PropertyId = StorageDeviceProperty;
  query.QueryType = PropertyStandardQuery;
  
  // issue query
  DWORD bytes;
  STORAGE_DEVICE_DESCRIPTOR devd;
  STORAGE_BUS_TYPE busType = BusTypeUnknown;

  if (DeviceIoControl(deviceHandle,
   IOCTL_STORAGE_QUERY_PROPERTY,
   &query, sizeof(query),
   &devd, sizeof(devd),
   &bytes, NULL))
  {
   busType = devd.BusType;
  }
  else
  {
   std::wcout << L"Failed to define bus type for: " << letter;
  }
  
  CloseHandle(deviceHandle);

  return BusTypeUsb == busType;
 }

пятница, 4 марта 2011 г.

[ВИДЕО] Волшебники Электронной Эры

Достопочтенный хабровчанин artifex поделился очень интересным документальным фильмом "Hackers - Wizards of the Electronic Age" снятом в 1984 году, и рассказывающем о хакерах того времени.

При участии:  Steve Wozniak, Andy Hertzfeld, Bill Atkinson, Lee Felsenstein, Richard Stallman, Richard Greenblatt, Steven Levy and others.

 Фильм оказался очень интересным и весьма познавательным. Ну, во-первых, начнем с того, что в контексте фильма "хакерами" называют не тех людей, которые взламывают сайты Пентагонов или пишут вирусы, а компьютерных энтузиастов, создающих революционные продукты ради забавы. Также оказалось, что понятие share-ware и open-source software возникло в начале 80-х годов, и уже тогда люди делали на этом бизнес, сапортя ПО и занимаясь консалтингом. И уж вообще я офигел, когда некий бородатый малый продемонстрировал програмулину до боли похожую на старый добрый Paint, в которой он редактировал фотографии, залитые с цифровой камеры. Я почему-то думал, что в те годы единственным интерфейсом пользователя были зелененькие буквочки на черном экране размером меньшим чем у моего КПК. В 1995 году отец притащил с работы системник от Sinclair'a, он переделал старую ч/б Березку под моник и  раздобыл где-то квадратную клаву, похожую на печатную машинку - я думал, что это крутейший комп. Там стоял TR-DOS, был текстовый редактор, можно было катать в Принца Персии, и даже писать музыку! И теперь я понял, что являлся обладателем винтажного барахла. Немного, знаете ли обидно за трудное детство...

Ну да ладно воспоминаний - давайте смотреть кино...


понедельник, 21 февраля 2011 г.

VsBuildStatus add-in для MSVC или "Время == деньги"

Обычно, когда мне нужно сбилдить большой солюшн, я запускаю билд, сворачиваю Visual Studio и дальше занимаюсь своими делами на компьютере. Допустим, солюшн билдится минут 20, и я это знаю и считаю, что у меня есть свободных 20 минут посидеть в инете или почитать книжку. Но я не знаю, что в код закралась синтаксическая ошибка, соответственно билд свалился, но я об этом узнал только спустя 20 минут, когда решил, что пора снова начинать работать. Или же я как дурачек через каждые 2-3 минуты открываю студию и смотрю, а не свалилось ли че-нить. И в том, и в другом случае я теряю драгоценное время - в первом на то, чтобы снова запустить сборку, во втором я тупо не могу в течении 20-ти минут на что нибудь спокойно отвлечься.

VsBuildStatus add-in для Visual Studio - это прекраснейшее средство мониторинга процесса сборки. Он выглядит как окошко-тулбар, которое открывается, когда вы запускаете build/clean/rebuild, и содержит список проектов Вашего солюшна. Для каждого проекта отображается прогресс - это особенно удобно, когда у вас многопроцессорная система и несколько проектов собираются одновременно. Также отображается общий прогресс, исходя из которого Вы можете приблизтельно прикинуть сколько времени осталось, и спокойно себе пить кофе и сёрфать по Хабру, к примеру.



Также в окне отображаются проекты которые уже были собраны, какие еще нет, какие собрались с ошибками.

Но самая вкуснятина досталась счастливым обладателям Window 7 - при сворачивании Vusual Studio, прогресс сборки отображается прямо в значке студию на тулбаре.



Если в процессе сборки была выявлена ошибка, это будет сразу же отображено в строке прогресса.


Красотища? Определённо! Теперь можно и вовсе не отвлекаться на то, чтобы открывать-закрывать IDE!

И напоследок - least but not last - еще одна приятная плюшка. Макрос для Visual Studio, который автоматически прекращает сборку при обнаружении первой ошибки

Private Sub OutputWindowEvents_OnPaneUpdated(ByVal pPane As OutputWindowPane) Handles OutputWindowEvents.PaneUpdated
        If Not (pPane.Name = "Build") Then Exit Sub

        Dim foundError As Boolean = pPane.TextDocument.StartPoint.CreateEditPoint().FindPattern(": error")
        Dim foundFatal As Boolean = pPane.TextDocument.StartPoint.CreateEditPoint().FindPattern(": fatal error")

        If foundError Or foundFatal Then
            DTE.ExecuteCommand("Build.Cancel")
        End If
    End Sub


    Private Sub BuildEvents_OnBuildProjConfigDone(ByVal Project As String, ByVal ProjectConfig As String, ByVal Platform As String, ByVal SolutionConfig As String, ByVal Success As Boolean) Handles BuildEvents.OnBuildProjConfigDone

        If Success = False Then
            DTE.ExecuteCommand("Build.Cancel")
        End If

    End Sub

Задеплоить макрос очень просто:
  1. В IDE выбираем в меню Tools->Macros->Macro IDE(или Alt+F11)
  2. В открывшемся Macro IDE в Project Explorer раскрываем список Samples
  3. В списке Samples открываем Environment Events и копипастим текст макроса между маркерами Begin Module и End Module
  4. Сохраняем
  5. PROFIT!

Ссылки:

вторник, 15 февраля 2011 г.

Джентельменский набор маньяков - Windows reverse engineering

Так как моя работа уже более полугода как связана с сабжем, приведу список инструментов без которых не обходится ни один мой рабочий день. Номер в списке с приоритетом никак не связан.
  1. Microsoft Visual Studio 2008 Professional - средство разработки и отладки. Думаю, комментировать тут нечего.
  2. Книга "Windows Internals 5th.ed." - авторства знаменитого Марка Руссиновича, рассказывает о том, что осталось за бортом официальных мануалов Microsoft'a. И, скажем так, Microsoft от этого не в восторге. Если описывать в двух словах, я бы описал ее так - "Тру кулХацкерам посвящается...".
  3. Утилита Procexp - из набора Sysinternals Suite, разработки того же Руссиновича. Представляет продвинутый Task Manager. Из всех фич, я более всего ценю следующие:
    • Список запущенных процессов представлен древовидной иерархией.
    • Список модулей, загруженных процессом
    • Списко хэндлов открытых процессом
    • Информация о запущенных потоках с возможностью просмотра стэка
  4. Утилита Procmon - из вышеупомянутого набора. Монитор активности процессов c потрясающим механизмом фильтрации событий. Составляет журнал всех операций совершенных процессом по отношению к реестру, файловой системе, операций связанных с сетевой активностью. По каждой операции можно просмотреть ее аргументы(например, имя открываемого файла, или с какими правами он открывается), результат выполнения и стэк. Незаменимая утилита при анализе ошибок в работе приложений, когда нет ни исходных кодов приложения, ни отладочной информации, ни документации - короче, черный ящик.
  5. Отладочная информация для системных dll-ок - взятая с Microsoft Symbol Server. Используется Procexp и Procmon утилитами для показа читабельного стэка вызовов. Загружается с серверов Microsoft'a по мере надобности автоматически, хотя можно скачать весь пакет сразу.
  6. Утилита WinDbg - использую для просмотра crash dump'ов. Но может использоваться и для отладки запущенных приложений. Пока не очень хорошо в ней разбираюсь, посему, скромно промолчу.
  7. Microsoft Visual Studio Remote Debugging Monitor - использую для удаленной отладки приложений вкупе с MSVC.
  8. Виртуальная машина на базе VMware Workstation - так как реверс инжинеринг - это дело весьма низкоуровневое и хачить систему приходится постоянно, то всегда существует опасноть того, что в любой момент может накрыть Синька, оно же BSOD, оно же Синий Экран Смерти, и дабы не подставлять основную ось под "Крававый Молот Рагнарёка"(кодовое название моего проекта =) ), отладка и тестирование ведется на виртуальной машине.
  9. http://www.reactos.org/ - эти хлопцы весьма успешно продвигаются в создании ОС аналогичной Windows, но с открытыми кодами. Аналогичной - мягко сказано, можно сказать, что они передирают ее один в один, с сохранением сигнатур API-шных функций и структур данных. Реализация функций тоже весьма схожа, хлопцы наверное часами сидят с декомпилятором. В эти исходники я частенько заглядываю, чтобы узнать, как работает та или иная API функция или посмотреть на структуру, на которую указывает хэндл возвращаемый? например, OpenScmManager().
  10. http://www.insidetheregistry.com/ - описание назначения всевозможных ключей реестра
  11. MSDN - как ни крути, а все же основной источник информации
  12. Много кофе
  13. Железные нервы
  14. Стена, об которую можно биться головой, если нервы таки сдают.

четверг, 27 января 2011 г.

Debug Visual C++ Redistributable Package своими руками

Довольно частое явление когда у клиента девственно чистый компьютер - в смысле без Visual Studio, а вам необходимо запустить debug версию вашего приложения на C++ для отладки например. Если ваша сборка использует динамическую линковку системных DLL, то почти наверняка ваше приложение не загрузится. Скорее всего причина кроется в том, что у клиента не установлен Visual C++ Redistributable Package. На сайте Microsoft лежат такие package, но только для release, для debug вы их там не найдете:

Microsoft Visual C++ 2005 Redistributable Package (x86)
Microsoft Visual C++ 2005 Redistributable Package (x64)
Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)
Microsoft Visual C++ 2005 SP1 Redistributable Package (x64)
Microsoft Visual C++ 2008 Redistributable Package (x86)
Microsoft Visual C++ 2008 Redistributable Package (x64)
Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)
Microsoft Visual C++ 2008 SP1 Redistributable Package (x64)


Так как же быть? Создадим такой package сами. Открываем Visual Studio, создаем новый solution. В диалоге выбора типа проекта выбираем Other Project Typoes
Setup Project. Потом добавляем необходимые merge module в проект и компилируем. Учтите, что для каждой платформы будь то x86 или x64 необходимо создать свой project в solution. Не забываем добавлять соответствующие policy. В х64 вариант обьязательно добавляем merge module для x86. Ниже приведен список необходимых merge module для:

Visual Studion 2005 (DebugCRT x86)
Microsoft_VC80_DebugCRT_x86.msm
policy_8_0_Microsoft_VC80_DebugCRT_x86.msm
Visual Studion 2005 (DebugCRT x64)
Microsoft_VC80_DebugCRT_x86.msm
Microsoft_VC80_DebugCRT_x86_x64.msm
policy_8_0_Microsoft_VC80_DebugCRT_x86.msm
policy_8_0_Microsoft_VC80_DebugCRT_x86_x64.msm
Visual Studion 2008 (DebugCRT x86)
Microsoft_VC90_DebugCRT_x86.msm
policy_9_0_Microsoft_VC90_DebugCRT_x86.msm
Visual Studion 2008 (DebugCRT x64)
Microsoft_VC90_DebugCRT_x86.msm
Microsoft_VC90_DebugCRT_x86_x64.msm
policy_9_0_Microsoft_VC90_DebugCRT_x86.msm
policy_9_0_Microsoft_VC90_DebugCRT_x86_x64.msm

Если вы используете MFC, то дополнительно добовляете MFC merge module в соответствующий проект по аналогии - имена должны содержать DebugMFC.

Остается только скомпилировать ваш solution и в результате вы получите msi для установки на компьютере клиента. Рекомендую также правильно и солидно назвать исталляцию и сменить имя msi файла, чтобы на стороне клиента это все не выглядело поделкой на коленке.

P.S. Стиль когда нужные сисетмные DLL кладутся в проект рядом с вашим приложением на мой взгляд является анахронизмом, хоть и работает. С другой стороны мне несложно придумать конфигурацию, когда такой фокус уже не прокатит. Самый простой пример: ваше приложение для x86 и для x64 лежат в одном каталоге.

P.P.S Все доступные merge module хрянятся в "%CommonProgramFiles%\Merge Modules".


Cсылка на источник: http://workblog.pilin.name/2009/02/debug-visual-c-redistributable-package.html

Автору огромный Респект!