運営しているサイト上で。OSのバージョンを表示させているActiveXコントロールが、 Windows8に対応していなく、かつ諸事情で既存のソースコードが無いということだったので、急遽作成することになりました。
調べても情報がほとんどなく書籍も新しいものがなかったので、思考錯誤の結果を記載しておきます。

開発環境

Visual Studio 2012
Windows7 64bit
VC++

前提

IE上でActiveXコントロールを読み込んで、JavaScriptからActiveXの関数を呼び出すことを目的としているため、
UI等々のことは記載しておりません。

プロジェクトの新規作成

Visual Studioを起動させたら、[ファイル] - [新しいプロジェクト]を選択
テンプレートから[Visual C++] - [MFC] - [MFC ActiveXコントロール]を選択

プロジェクト名を入力して[OK]をクリック
※ここでは、"AxGetOsVer"とします。

次にMFC ActiveXコントロールウィザードが表示されます。

[次へ]をクリック

[次へ]をクリック

ここも特に変更がなければ[次へ]をクリック

必要に応じて選択してください。
デフォルトは上画像のチェックが付いてますが、バージョンとか特にいらなかったので
表示時にアクティブのみ選択して[完了]をクリック

プロジェクトの作成が完了すると上記の構成で作成されます。

関数の追加

ソリューションエクスプローラーでクラスビューを表示
※表示されていない場合は、[表示] - [クラスビュー]で表示することができます。
[ <プロジェクト名>Ctrl ]クラスを選択して右クリック - [クラスウィザード]を選択


[メソッド]タブ - メソッドの追加を選択
メンバー関数の追加ウィザードが表示されます。

戻り値、関数名、パラメータ、アクセスを選択して完了をクリック
今回は"HelloWorld"という文字列を返すだけの処理にします。
完了すると、コントロールクラスのヘッダーと、ソースに関数が追加されます。

実際これだけなので、慣れれば手で書いたほうが早いです(´・ω・`)・・・
生成された関数を下記のように書換
BSTR CAxGetOsVerCtrl::GetHelloWorld(void) {
    return _T("Hello World.");
}
続いてディスパッチ インターフェイスに今作成した関数を定義します。
<プロジェクト名>.idlファイルを開いて、 dispinterface _Dの部分に下記のように追記します。
参考:MSDN
dispinterface _DAxGetOsVer{
    properties:
    methods:
        [id(1), helpstring("GetHelloWorld")] BSTR GetHelloWorld();
}
最後にディスパッチ マップ内の OLE オートメーション関数を定義します。 コントロールクラス.cppの、BEGIN_DISPATCH_MAP~END_DISPATCH_MAPの間に記載します。
DISP_FUNCTION関数については、下記のMSDNに詳しく書いてあります。
参考:MSDN
BEGIN_DISPATCH_MAP(CAxGetOsVerCtrl, COleControl)
    DISP_FUNCTION(CAxGetOsVerCtrl, "GetHelloWorld", GetHelloWorld, VT_BSTR, VTS_NONE)
END_DISPATCH_MAP()

コンパイル

最後に、ビルドをかけて正常に終了したら完了

次の記事でセットアップファイル、Cabファイルの作成、IE上で動作させる方法を記載していきます。