Share via


Direct2D SDK Coding Conventions

This topic describes the coding conventions used by Direct2D SDK samples. It contains the following sections.

  • Macros
    • Versioning Macros
    • Assert Macro
    • HINSTANCE Macro
  • Functions
  • Header Files
  • HeapSetInformation

Macros

Versioning Macros

The Windows header files use macros to indicate which versions of Windows support many programming elements. Therefore, you must define these macros to use new functionality introduced in each major operating system release.

Direct2D samples use the following versioning macro definitions.

#pragma once

// Modify the following definitions if you need to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER              // Allow use of features specific to Windows 7 or later.
#define WINVER 0x0700       // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows 7 or later.
#define _WIN32_WINNT 0x0700 // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used items from Windows headers

Assert Macro

Direct2D SDK samples use the following Assert macro.

#ifndef Assert
#if defined( DEBUG ) || defined( _DEBUG )
#define Assert(b) if (!(b)) {OutputDebugStringA("Assert: " #b "\n");}
#else
#define Assert(b)
#endif //DEBUG || _DEBUG
#endif

HINSTANCE Macro

Direct2D SDK samples use the following macro for accessing the HINSTANCE of the current module. This macro is used to provide the hInstance parameter for the CreateWindow function.

#ifndef HINST_THISCOMPONENT
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
#endif

Functions

Direct2D samples use the following SafeRelease function for releasing interfaces.

template<class Interface>
inline void
SafeRelease(
    Interface **ppInterfaceToRelease
    )
{
    if (*ppInterfaceToRelease != NULL)
    {
        (*ppInterfaceToRelease)->Release();

        (*ppInterfaceToRelease) = NULL;
    }
}

The following example uses the SafeRelease function to release several interfaces.

//
// Release resources.
//
DemoApp::~DemoApp()
{
    SafeRelease(&m_pD2DFactory);
    SafeRelease(&m_pDWriteFactory);
    SafeRelease(&m_pRenderTarget);
    SafeRelease(&m_pTextFormat);
    SafeRelease(&m_pBlackBrush);

}

Header Files

Direct2D samples use the following headers:

// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <wchar.h>
#include <math.h>

#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>
#include <wincodec.h>

HeapSetInformation

All applications should use the HeapSetInformation method and specify the HeapEnableTerminationOnCorruption setting to enable the terminate-on-corruption feature. Doing so ensures that heap corruptions do not go unnoticed and therefore do not introduce opportunities for security exploits. Failure codes from this call are ignored because a correct application can proceed successfully even in the unlikely event of failure.

Direct2D samples call the HeapSetInformation from the WinMain function. The following example shows a typical Direct2D WinMain function.

int WINAPI WinMain(
    HINSTANCE /*hInstance*/,
    HINSTANCE /*hPrevInstance*/,
    LPSTR /*lpCmdLine*/,
    int /*nCmdShow*/
    )
{
    // Ignore the return value because we want to run the program even in the
    // unlikely event that HeapSetInformation fails.
    HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    if (SUCCEEDED(CoInitialize(NULL)))
    {
        {
            DemoApp app;

            if (SUCCEEDED(app.Initialize()))
            {
                app.RunMessageLoop();
            }
        }
        CoUninitialize();
    }

    return 0;
}

 

 

Send comments about this topic to Microsoft

Build date: 1/22/2012