30 8月 2012

[Code::Blocks] Compile Code::Blocks source code in Windows

Code::Blocks是一款出色的跨平台IDE,是用跨平台的語言wxWidgets所寫的,由於wxWidgets並不像Java一樣,有Virtual Machine,是可以build成原生的執行檔執行的,所以執行的速度會快很多。由於最近想寫看看Code::Blocks的PlugIn,所以就試著build CB的source code看看,用CB來build CB倒是挺有趣的。

23 8月 2012

[VisualStudio] Generate Assembly result file

VisualStudio在compile檔案過後,預設是不會產生assembly file的,但是有時候會想看看compile過後assembly code長怎麼樣,當project的Optimization有enabled的話,一樣的code在不同的Optimization level會有不一樣的結果,這就是VC對code優化處理。

要打開assember output的話,先進入Project Property Page(在project上點右鍵,選propertys)
以VS2008為例,在 Configuration Properties | C/C++ | Output Files
選擇 Assembler Output ,有一些選項可以選

  • Assembly-Only   (輸出.asm檔)
  • Assembly, Machine Code and Source (輸出.cod檔)
  • Assembly With Machine Code  (輸出.cod檔)
  • Assembly With Source Code  (輸出.asm檔)
可以選擇最詳細的Assembly, Machine Code and Source來看



最後就可以在指定的輸出路徑(ASM List Location)裡,找到各個檔案的*.asm or *.cod,打開來就可以研究一下裡面的assembly code了~

更多詳細的設定介紹 - MSDN - /Fa /FA

16 3月 2012

[Win32] Save Bitmap

Save Gdiplus::Bitmap
HRESULT GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    /*
    format support : 
        "image/png"
        "image/bmp"
        "image/gif"
        "image/jpeg"
        "image/tiff"
    */
    UINT  num  = 0;  // number of image encoders
    UINT  size = 0;  // size of the image encoder array in bytes

    GetImageEncodersSize(&num, &size);
    if(size == 0)
        return E_FAIL;  // Failure

    ImageCodecInfo* pImageCodecInfo = NULL;
    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
        return E_FAIL;  // Failure
    GetImageEncoders(num, size, pImageCodecInfo);
    for(UINT j = 0; j < num; ++j)
    {
        if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return S_OK;  // Success
        }
    }
    free(pImageCodecInfo);
    return E_FAIL;
}

void SaveBitmap(Bitmap* bitmap)
{
    // Get the CLSID of the JPEG encoder.
    CLSID clsid;
    GetEncoderClsid(L"image/jpeg", &clsid);
    
    bitmap.Save(L"C:\\test.jpg", &clsid, NULL);
}