How to trace build time in Visual Studio 2008

Visual studio exposes some macro funcionality, what you can use to trace some studio build events. To start VBA editor in VS, go to Tools\Macros\Macros IDE (or Alt + F11)

Go to Environment Events module, and add following code:

 Dim BuildTime As Date
Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope,Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin
        BuildTime = Now()
    End Sub
Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone
        Dim win As Window = _
                  DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
        Dim ow As OutputWindow = win.Object
Dim owPane As OutputWindowPane
        ow.ActivePane.Activate()
        ow.ActivePane.OutputString("Build taken (ms): " + (Now() - BuildTime).TotalMilliseconds().ToString())
    End Sub
So the module will looks like this:
image 
 
After that, just Save Macro editor module, and after that, your Visual studio normal commands, like:
Build Solution, Build, Rebuld, etc.. will display following informations:

—— Build started: Project: csc, Configuration: Debug Any CPU ——
csc -> C:\Users\USERNAME\Documents\Visual Studio 2008\Projects\csc\csc\bin\Debug\csc.exe
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
Build taken (ms): 67

 

This could ba a good start for exact measuring of build speed improvements I wanted to do.

Jak změnit User Agent hlavičku v Google Chrome

Někdy se Vám asi stane že potřebujete přistoupit na nějakou stránku a ta vyžaduje Internet Explorer. Ve Firefoxu a opeře to není téměř problém, změnit identifikaci prohlížeče, ale v Google Chrome je na to potřeba trik.

Celý trik je v tom, že se Chrome spouští s parametrem

chrome.exe --user-agent="Your favourite User Agent String here"

A do parametru dosadíme identifikace klienta jakou chceme, například pro IE 7:

chrome.exe --user-agent="Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)"

Odkazy:

How To Change Google Chrome 1.0.154.36 User Agent String?
Podobný popis jen v angličtině.

How to Change User Agent String in Google Chrome Browser
Tady je postup jak změnit user agent na trvalo, pomocí hacku .dll souboru.

 Seznam User Agent identifikátorů a zjištění toho vašeho aktuálního

A na závěr YouTube návod

 if(window.$WebSecurity){window.$WebSecurity.FlashDetection.HandleEmbedCode(’11d72748-ec22-425d-b160-65995e11d0a3′, ‘\x3cembed height\x3d\x22349\x22 type\x3d\x22application\x2fx-shockwave-flash\x22 width\x3d\x22425\x22 src\x3d\x22http\x3a\x2f\x2fwww.youtube.com\x2fv\x2f_BcNi6H55Ro\x26amp\x3brel\x3d0\x26amp\x3bborder\x3d1\x26amp\x3bcolor1\x3d0x3a3a3a\x26amp\x3bcolor2\x3d0x999999\x26amp\x3bhl\x3den\x26amp\x3bfeature\x3dplayer_embedded\x26amp\x3bfs\x3d1\x22 pluginspage\x3d\x22http\x3a\x2f\x2fwww.macromedia.com\x2fgo\x2fgetflashplayer\x22 allowscriptaccess\x3d\x22never\x22 allownetworking\x3d\x22internal\x22 \x2f\x3e’);}else{if(window.flObj == null){window.flObj = new Object();}window.flObj[’11d72748-ec22-425d-b160-65995e11d0a3′]=’\x3cembed height\x3d\x22349\x22 type\x3d\x22application\x2fx-shockwave-flash\x22 width\x3d\x22425\x22 src\x3d\x22http\x3a\x2f\x2fwww.youtube.com\x2fv\x2f_BcNi6H55Ro\x26amp\x3brel\x3d0\x26amp\x3bborder\x3d1\x26amp\x3bcolor1\x3d0x3a3a3a\x26amp\x3bcolor2\x3d0x999999\x26amp\x3bhl\x3den\x26amp\x3bfeature\x3dplayer_embedded\x26amp\x3bfs\x3d1\x22 pluginspage\x3d\x22http\x3a\x2f\x2fwww.macromedia.com\x2fgo\x2fgetflashplayer\x22 allowscriptaccess\x3d\x22never\x22 allownetworking\x3d\x22internal\x22 \x2f\x3e’;}

How to communicate with adobe pdf object element using javascript

Recently, i have found a problem, that I need to customize displaying embedded PDF on a HTML page and communicate with it.When it goes to HTML embedded pdf object, common practise is to use following snipped:

<object data="c:\\a\\AppArchGuide2.0.pdf" type="application/pdf" width="300" height="200" name="ad">
</object>

Is there a possibility to change inner parameters of that html object ? The easiest are html exposed properties like with and height which object reacts good. But changing data attribute does not load a new document. You need to change document directly in embedded activex object. Embedded Acrobad Reader is following object AcroPDFLib.IAcroAXDocShim.

Creating object programmatically (from a thick client) is a bit of trouble, due to Adobe licensing limitations (you cannot do that). But using created embedded html object is with no problem. In embedded object there is object property of desired iacroaxdocshim type.

Here is a screen of "object" property tree structure in IE8 dev. tools

image

Properties under this tree are fine to change and embedded control react on them well. For example, change a document after page was loaded is this line:

ad.object.src = 'http://www.adobe.com/products/acrobat/pdfs/pdfaccess.pdf';

where ad is name of embedded element. For example, for loading document without bookmarks etc.. is with

ad.object.SetPageMode('none');

Example file for download:


Links

A version of library for delphi
http://files.codes-sources.com/fichier.aspx?id=37353&f=AcroPDFLib_TLB.pas&lang=en

Adobe Acrobat SDK EULA (SDK contains headers and docs)
http://www.adobe.com/devnet/acrobat/sdk/eula.html

 

Brainbench C# Master Certification

Včera jsem se rozhodl vyzkoušet certifikaci kterou nabízí Brainbench. Co mě příjemně překvapilo byla kvalita testu, který je pomněrně obtížný. Takže jestli si chcete vyzkoušet jestli na to máte, právě teď běží možnost získat C# verzi zdarma se sponzorstvím Techsay.

Když se vám povede získat certifikát, je možné si ho nechat poslat a pár dolarů poštou, nebo levněji jen stáhnout v elektronické verzi.

A teď už témata:

  • Configuration and Support(CLS compliancy, compiler options,..)
  • Methods(operator overloading, parameters, user defined conversions,..)
  • Delegates(Async processing, ..)
  • Object-Oriented Programming(Aggregation, Encacpsulation, ..)
  • Properties, Indexers, and Fields
  • Developing Data Consumers and Services (Multithreading, arrays,..)
  • Value and Reference Types(object creating and lifetimes, attributes,..)
  • Grammar (operator precedence, preprocessor, ..)

A takhle vypadá výsledek 🙂

image

C# Excel Interop: Vložení obrázku z MemoryStream

Pro vložení obrázku je buď možné použít vložení ze souboru, kde je ale potřeba mít na disku uložený ten soubor.

Další možnost je použít už hotový obrázek v paměti. Pro to asi existuje jediná možnost předání a to přes Windows Clipboard. Trochu problém je ale s tím, že u vloženého obrázku nejde jednoduše nastavit velikost.

A už kod:

            Microsoft.Office.Interop.Excel.Application oXL;
            Microsoft.Office.Interop.Excel._Workbook oWB;
            Microsoft.Office.Interop.Excel._Worksheet oSheet;

            oXL = new Microsoft.Office.Interop.Excel.Application();
            oXL.Visible = true;

            try
            {
                oXL.ScreenUpdating = true;
            }
            catch (System.Runtime.InteropServices.COMException)
            {
                // Reseni problemu s anglickym excelem na ceskem prostredi
// viz http://support.microsoft.com/?kbid=320369
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
                oXL.ScreenUpdating = true;
            }


            oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(Type.Missing));
            oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;

            // nacteni obrazku
            Image i = pictureBox1.Image;

            // Bunka kam vlozit
            Microsoft.Office.Interop.Excel.Range oRange = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[1, 2];
            // Pozor, tohle ale zmeni systemovy clipboard
            System.Windows.Forms.Clipboard.SetDataObject(i, false);
            // Budu vkladat do vybrane Range
            oRange.Select();

            // Paste obrázku z clipboard
            oSheet.Paste(oRange, i);

            // Aktuálně vybraný prvek je hned po vložení obrázek, proto ho můžu načíst a přetypovat
            Microsoft.Office.Interop.Excel.Picture pict = oXL.Selection as Microsoft.Office.Interop.Excel.Picture;
            // Teď můžu obrázku nastavit velikost, případně polohu ..
            pict.Height = 100;
            pict.Width = 100;

VB6 Interop: Předání pole z C# do Visual Basicu

Na předání pole do VB6 nic není, jenom to nejde udělat automaticky, protože COM Mashaller vystaví stub jako pole typu System.Array.

Ukázka volané metody v VB6 my mohla vypadat takhle:

Public Sub Count(ByRef numbers() As Long)
Dim i As Integer
For i = 0 To UBound(numbers)
        ' do something
Next
End Sub

A příklad volání v C#:

 public void Count(List<int> numers)
        {
            System.Array arr = new int[numbers.Count];
            int i = 0;
            foreach (var item in numbers) {
                arr.SetValue(item, i++);
            }
            // Marhalling packs array as System.Array
            VB6Class.Count(ref arr);
        }