Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

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

How to get HSTRING value in debugger

Microsoft has added yet another string type to this cruel world. Now you have HSTRING in addition to all those char*, char[], wchar_t*, wchar_t[], BSTR and various typedefs. If you want to get HSTRING's value - use Immediate Window debugger feature, type WindowsGetStringRawBuffer(rcx, nullptr) to display the value held in rcx register (function's first argument for x64).

How to properly add custom library dependencies to VC++ project

Adding libraries to your Visual Studio C++ projects might be cumbersome if you aint doing "Hello World" applications. You need to specify include paths, library paths, resource paths etc. For each individual configuration BTW. Then you start the application and realize you must copy dll/pdb/whatever files to your output directory. Sure you google the solution and end up having Custom Build Tools or Steps for each item in your library. That sucks, believe me. But there is much simpler solution! As always on thig blog...

Let's say you have reusable library in your (D)VCS repository. Codejock Xtreme Toolkit Pro is a good example of such a library. Lets make it reusable in seconds.

The answer is a property sheet file for you library:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros">
    <CodejockDir Condition="'$(CodejockDir)' == ''">$(MSBuildThisFileDirectory)</CodejockDir>
    <IsDebug>$([System.Text.RegularExpressions.Regex]::IsMatch($(Configuration), '[Dd]ebug'))</IsDebug>
    <CodejockArchSuffix Condition="'$(PlatformArchitecture)' == '64'">x64</CodejockArchSuffix>
    <UnicodeSuffix Condition="'$(CharacterSet)' == 'Unicode'">U</UnicodeSuffix>
    <DebugSuffix Condition="$(IsDebug)">D</DebugSuffix>
    <CodejockBinDir>$(CodejockDir)\Bin\vc$(PlatformToolsetVersion)$(CodejockArchSuffix)</CodejockBinDir>
    <CodejockItemName>ToolkitPro1531vc$(PlatformToolsetVersion)$(CodejockArchSuffix)$(UnicodeSuffix)$(DebugSuffix)</CodejockItemName>
  </PropertyGroup>
  <PropertyGroup>
    <IncludePath>$(CodejockDir)\Source;$(IncludePath)</IncludePath>
    <LibraryPath>$(CodejockDir)\Lib\vc$(PlatformToolsetVersion)$(CodejockArchSuffix);$(LibraryPath)</LibraryPath>
    <SourcePath>$(CodejockDir)\Source;$(SourcePath)</SourcePath>
    <LocalDebuggerEnvironment>$(CodejockBinDir);%(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
  </PropertyGroup>
  <ItemGroup>
    <CustomBuild Include="$(CodejockBinDir)\$(CodejockItemName).dll">
      <Filter>Libraries\Codejock</Filter>
      <Command>xcopy /Y "%(FullPath)" "$(OutDir)"</Command>
      <Outputs>$(OutDir)\$(CodejockItemName).dll</Outputs>
    </CustomBuild>
    <CustomBuild Include="$(CodejockBinDir)\$(CodejockItemName).pdb" Condition="$(IsDebug)">
      <Filter>Libraries\Codejock</Filter>
      <Command>xcopy /Y "%(FullPath)" "$(OutDir)"</Command>
      <Outputs>$(OutDir)\$(CodejockItemName).pdb</Outputs>
    </CustomBuild>
  </ItemGroup>
  <ItemDefinitionGroup>
    <ResourceCompile>
      <AdditionalIncludeDirectories>$(CodejockDir)\Source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ResourceCompile>
  </ItemDefinitionGroup>
  <ItemGroup>
    <BuildMacro Include="CodejockDir">
      <Value>$(CodejockDir)</Value>
    </BuildMacro>
  </ItemGroup>
</Project>

Let it have Codejock.props name and reside in you library root folder. This is just an ordinary MSBuild file which can act as a property sheet page for you C++ projects. Now you can just open Property Manager and Add Existing Property Sheet to your project. This automaticaly adds necessary environment and build process changes to make the library work for you. Thats it. And it doesnt fucking overwrite your unchanged dll files every time you hit Build command!

You probably want to understand how does this work? Well, go and RTFM for MSBuild system.

The only unpleasant thing about this -  Solution Explorer displays all those referenced files as childrens of your Visual Studio project (filter element is ignored).

Extra pdb information?

Update: code center premium. Ах, как хочется.

Visual Studio 2012 RTM leaked

Уже можно найти на обменниках. Дядко ЦЯ своровал.

Visual Studio 11 update

Апрельское обновление Visual Studio 11 Beta.

Codekana for Visual Studio

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

Codekana

ReSharper 4.1 is available

Download it here.

IdeaBlade DevForce EF released

Вышла 4-я версия ORM тулкита от IdeaBlade. Она построена на Entity Framework, небольшой обзор на сайте производителя.

StyleCop 4.3 SDK released

The SDK documentation for StyleCop 4.3 is now available for download, here.

This documentation explains how to create and install custom StyleCop rules, how to integrate custom settings into the StyleCop settings dialog, and how to create a wrapper for hosting StyleCop in a custom build environment.

StyleCop 4.3 released

Download StyleCop 4.3 here.

ReSharper 4.0 is released

Greetings from JetBrains!

We are pleased to announce the general availability of ReSharper 4.0!

This release brings you the most up-to-date support for C# 3.0, including LINQ, and Visual Studio 2008 in general. The major upgrade also features multiple new usability and productivity-boosting tools, such as standard class library annotations, solution-wide analysis (for C#), versatile code cleanup, new automated refactorings, new and improved code-editing capabilities, and more.

Complete product information about JetBrains ReSharper is available at http://www.jetbrains.com/resharper.

ReSharper 4.0 is available for a 30-day free trial download at http://www.jetbrains.com/resharper/download. No evaluation licenses are required.

New customers can purchase ReSharper 4.0 online at http://www.jetbrains.com/resharper/buy.

Please NOTE: All those who have purchased ReSharper 3.0 or ReSharper 3.1 after December 21, 2007 qualify for a free upgrade!

Wishing you develop with pleasure!! Team JetBrains

Precompiled Headers Explained

Почти все разработчики, использующие Visual C++, сталкиваются с файлом stdafx.h, в который можно положить много-много различных директив препроцессора. И так мало понимают, зачем это нужно и как с этим работать...

Precompiled Header

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

Рассмотрим программу Hello World:

#include <tchar.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[]) {
    std::cout << "Hello World!" << std::endl;
    return 0;
}

А теперь внимание: после обработки этого файла прекомпилятором, его размер возрастает до 996 килобайт! Я повторюсь: 996 килобайт, из которых 854 составляют полезный код (остальное - комментарии), а размер рабочего кода программы - аж 142 байта. Похоже, для компиляции нашего простейшего cpp-файла компилятору прийдется изрядно потрудиться. Причем над каждым cpp-файлом проекта.

Естественно, лучше предварительно обработать неизменящиеся куски кода, превратив их в удобный и быстрый формат для последующей обработки в составе исходного кода приложения. Компиляторы Visual C++ и GCC поддерживают такую обработку и она носит имя Precompiled Header.

Использование Precompiled Header в Visual C++

Мастер создания проекта Visual C++ предлагает свои услуги по настройке Precompiled Header. В простейшем случае, среда дает разработчику возможность выбора - использовать этот механизм или нет. В большинстве случаев использование Precompiled Header настраивается автоматически.

Анализ настроек Precompiled Header мастеров Visual C++

Что же мы получаем при автоматической настройке Precompiled Header средой разработки Visual Studio?

  1. Заголовочный файл stdafx.h

    В этом файле содержатся, как правило, только директивы препроцессора, подключающие внешние заголовочные файлы.

  2. cpp-файл stdafx.cpp

    Состоит из единственной директивы #include "stdafx.h" и используется для генерации Precompiled Header. Следующая картинка демонстрирует свойства файла stdafx.cpp, раздел C/C++, подраздел Precompiled Headers:stdafx.cpp Property Pages

  3. Каждый cpp-файл проекта, использующий Precompiled Header, обязан включать этот заголовочный файл соответствующей директивой #include "stdafx.h"

    При этом компилятор игнорирует любой текст до момента включения stdafx.h! А в случае его отсутствия - выдает ошибку fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

  4. Использование Precompiled Header установлено на уровне cpp-файлов всего проекта, как показано на картинке:

    Project Property Pages

Настройка Precompiled Header вручную

Опираясь на вышенаписанное, последовательность действий простая:

  1. Создать файл CommonIncludes.h
  2. Создать файл CommonIncludes.cpp и добавить туда одну строчку - #include "CommonIncludes.h"
  3. Поменять нужные настройки Precompiled Headers в свойствах файла CommonIncludes.cpp
  4. Поменять настройки Precompiled Headers на уровне проекта или на уровне отдельных cpp-файлов
  5. Добавить #include "CommonIncludes.h" в начало соответствующих cpp-файлов исходного кода

Продвинутое использование Precompiled Header

Как правило, в stdafx.h, созданный визардом, лепят все, что можно влепить. В результате в каждый cpp-файл включается совершенно ненужный ему контент! Поэтому, логично включать в stdafx.h только наиболее используемые заголовочные файлы.

Директивы прекомпилятора в stdafx.h распостраняются одинаковым образом на все cpp-файлы, включающие данный заголовочный файл. Бывает, необходимо настроить поведение библиотеки (в рамках отдельного cpp-файла или группы таких файлов) путем определения каких-то символов перед включением соответствующего заголовочного файла. Первое, что приходит на ум, - определить эти символы в cpp-файле и еще раз включить заголовочный файо библиотеки. Но, нет, я же писал, что компилятор игнорирует любой исходный код до строчки #include "stdafx.h"! Соответственно, повторное включение заголовочных файлов будет просто проигнорировано. Получается, нужно удалять включения заголовочных файлов библиотек из stdafx.h и добавлять их в каждый отдельный cpp-файл.

Также, проект не ограничен одним Precompiled Header! Вполне можно содзать пару файлов Subsystem1Includes.h, Subsystem1Includes.cpp, отвечающих за отдельный Precompiled Header в рамках некоторой группы файлов исходного кода.

Компилятор Visual C++ имеет ограничение на размер pch-файла. На практике это выглядит следующим образом:

error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm130' or greater
fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit

В таком случае спасет опция компилятора /Zm: /Zm compiler option

StyleCop

Source Analysis, also known as StyleCop, analyzes C# source code to enforce a set of best practice style and consistency rules.

ReSharper 4 EAP has started

ReSharper 4 EAP

Oracle 11g ODAC

Появился Oracle 11g ODAC and Oracle Developer Tools for Visual Studio.

Состав:

  • Oracle Providers for ASP.NET 11.1.0.6.20
  • Oracle Developer Tools for Visual Studio 11.1.0.6.20
  • Oracle Data Provider for .NET 2.0 11.1.0.6.20
  • Oracle Data Provider for .NET 1.x 11.1.0.6.20
  • Oracle Database Extensions for .NET 2.0 11.1.0.6.20 -- for upgrade only
  • Oracle Database Extensions for .NET 1.x 11.1.0.6.20 -- for upgrade only
  • Oracle Provider for OLE DB 11.1.0.6.20
  • Oracle Objects for OLE 11.1.0.6.20
  • Oracle ODBC Driver 11.1.0.6.0
  • Oracle Services for Microsoft Transaction Server 11.1.0.6.0
  • Oracle SQL*Plus 11.1.0.6.0
  • Oracle Instant Client 11.1.0.6.

Visual Studio debugging tips

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

Довольно часто приходится вставлять куски кода вида hr = GetLastError();, запускать Error Lookup чтобы прочитать человеческим языком что же произошло. Я уже давно пользуюсь одним из более удобных способов:

  1. Если статический тип переменной - HRESULT, то окошки дебаггера Visual Studio (Watch #, Autos, Locals etc) автоматически отображают в колонке Value строку ошибки вместо кода.
  2. Псевдопеременная err или @err отображает текущее числовое значение GetLastError(). А для отображения строки вместо числа нужно применить форматирование - добавить через запятую hr. Пример: @err,hr.

    Visual Studio поддерживает множество форматов. Подробнее - Visual Studio Debugger --> Format Specifiers in C++

  3. При вызове COM-метода возвращаемое значение HRESULT попадает в регистр eax, поэтому @eax,hr расскажет нам в чем беда.

Есть и другие псевдопеременные - $handles, $vframe, $TID, $ENV, $CMDLINE, @registername или $registername, $clk, $user. Приятно, а?

Visual Studio debugger and referenced libraries

Допустим, в своем проекте MyProgram Вы используете некую библиотеку MyLibrary. Как обычно, подключаете MyLibrary.h, MyLibrary.lib. Все компилируется отлично, а вот при попытке запуска...

---------------------------
MyProgram.exe - Unable To Locate Component
---------------------------
This application has failed to start because MyLibrary.dll was not found. Re-installing the application may fix this problem.
---------------------------
OK
---------------------------

Если вы столкнулись с этой ошибкой - читайте дальше.

Сообщение об ошибке говорит, что MyLibrary.dll was not found. Windows ищет dll в следующих местах:

  1. The directory where the executable module for the current process is located.
  2. The current directory.
  3. The Windows system directory. The GetSystemDirectory function retrieves the path of this directory.
  4. The Windows directory. The GetWindowsDirectory function retrieves the path of this directory.
  5. The directories listed in the PATH environment variable.

Вероятно, ни в одном из вышеперечисленных источников MyLibrary.dll не была найдена. Соответственно, для решения проблемы следует положить MyLibrary.dll в одно из этих мест. Пункты 3 и 4 отшибаем сразу, а остальные случаи разберем подробнее.

  1. The directory where the executable module for the current process is located.

    Наверное, это папка bin/Debug проекта, где линкер создает MyProgram.exe. MyLibrary.dll туда можно скопировать путем создания Post Build Event. Мне эта идея не нравится.

  2. The current directory.

    Можно попросить отладчик менять стартовый каталог запускаемого приложения. Для этого есть настройка проекта Debugging->Working Directory. Мне эта идея тоже не нравится.

  3. The directories listed in the PATH environment variable.

    Можно изменить пользовательскую (или системную) переменную PATH (System Properties->Advanced->Environmental Variables->User variables for %USERNAME%), добавив туда каталог с MyLibrary.dll.

    Но мне больше всего нравится следующий трюк: Visual Studio Debugging Environment

Microsoft Line Of Code Counter

Microsoft Line Of Code Counter - порядочно полезная утилита!

Из названия понятно, что считает строчки кода. Но это не аналог Project Line Counter т.к. позволяет

  • использовать источник файлов (TFS, VSS или каталог файловой системы)
  • выполнять подсчет изменений содержимого файлов
  • считать метрики по различным методологиям

Гибко настраивается через XML файл. Изначально поддержка всех основных MS-языков. Работает как в составе Visual Studio 2005 так и отдельно.

Releasing the Source Code for the .NET Framework Libraries

Товарищ, работающий менеджером в Microsoft, сообщил, что Visual Studio 2008 зарелизится где-то в декабре 2007-го года (что, в принципе, отражает догадки о дате релиза). А, вместе с релизом, мы получим возможность посмотреть исходники .NET Base Class Libraries (System, System.IO, System.Collections, System.Configuration, System.Threading, System.Net, System.Security, System.Runtime, System.Text, ...), ASP.NET (System.Web), Windows Forms (System.Windows.Forms), ADO.NET (System.Data), XML (System.Xml), WPF (System.Windows) и даже с комментариями! Спустя месяц планируют добавить WCF, Workflow и LINQ.

Исходники можно будет скачать, как отдельный пакет, или же позволить Visual Studio 2008 скачивать их (вместе с файлами отладки) по мере надобности.

Должен заметить, что я, как и любой другой любопытный разработчик, потратил много времени как на декомпиляцию фреймворковских библиотек, так и на изучение Rotor Shared Source. Часто, без этого тяжело понять, как работают некоторые классы. Скажем, хорошие знания Remoting появились у меня только после просмотра исходников.

Единственное, чего бы не хотелось, - так это good old MFC development style, когда разработчик проводит 90% своего времени в исходных кодах MFC, тщетно пытаясь понять в чем проблема и как это работает.

Назойливые дефекты Visual Studio 2005/2008

Мучительно неприятно, что некоторые вещи не исправляются даже с выходом новой версии. Не говоря уже о сервис паках! Предыдущий пост, новый дефект:
Окна задочены наверху, включен Auto Hide - списки "Modules" и "Processes" пустые!
Убираю Auto Hide - строчки появляются в обоих окошках.
Ставлю Auto Hide - список "Processes" опять пустой, "Modules" заполнен.
Картинка снята с Visual Studio 2008 B2. В 2005SP1 ситуация аналогичная. А в 2005 без SP1, кажется, все нормально.
Copyright 2007-2011 Chabster