VC++6.0 (5.0もらしいけど) で、ATL COM AppWizard プロジェクトを作成し、挿入 - ATLオブジェクトの新規作成を選択して、何かコントロールを追加する。コントロールの設定で、ストックプロパティを追加するときに、Font を含めてみよう。
warning MIDL2039 : interface does not conform to [oleautomation] attribute : [ Parameter 'pFont' of Procedure 'putref_Font' ( Interface 'IMyControl' ) ] warning MIDL2039 : interface does not conform to [oleautomation] attribute : [ Parameter 'pFont' of Procedure 'put_Font' ( Interface 'IMyControl' ) ] warning MIDL2039 : interface does not conform to [oleautomation] attribute : [ Parameter 'ppFont' of Procedure 'get_Font' ( Interface 'IMyControl' ) ]
とまあ、警告がずらずら。この件は、MS のサポート技術情報にも、FIX: MIDL2039 Warning with IFontDisp/IPictureDisp Parameter Type として取り上げられている。
VB6 より Windows API を利用する場合に、APIビューアは便利ですが、しばしば宣言等に誤りがあります。
今回は、フォントファミリの列挙を行う EnumFontFamiliesEx 関数を使おうとして、ENUMLOGFONTEX 構造体の宣言をコピーしたのですが、
' API ビューアの宣言
Private Type ENUMLOGFONTEX
elfLogFont As LOGFONT
elfFullName(LF_FULLFACESIZE) As Byte
elfStyle(LF_FACESIZE) As Byte
elfScript(LF_FACESIZE) As Byte
End Type
のようになっていました。WinGDI.h には
// WinGDI.h (Microsoft Platform SDK February 2003) Line:1220 #if(WINVER >= 0x0400) typedef struct tagENUMLOGFONTEXA { LOGFONTA elfLogFont; BYTE elfFullName[LF_FULLFACESIZE]; BYTE elfStyle[LF_FACESIZE]; BYTE elfScript[LF_FACESIZE]; } ENUMLOGFONTEXA, FAR *LPENUMLOGFONTEXA; typedef struct tagENUMLOGFONTEXW { LOGFONTW elfLogFont; WCHAR elfFullName[LF_FULLFACESIZE]; WCHAR elfStyle[LF_FACESIZE]; WCHAR elfScript[LF_FACESIZE]; } ENUMLOGFONTEXW, FAR *LPENUMLOGFONTEXW; #ifdef UNICODE typedef ENUMLOGFONTEXW ENUMLOGFONTEX; typedef LPENUMLOGFONTEXW LPENUMLOGFONTEX; #else typedef ENUMLOGFONTEXA ENUMLOGFONTEX; typedef LPENUMLOGFONTEXA LPENUMLOGFONTEX; #endif // UNICODE #endif /* WINVER >= 0x0400 */
となっていますので、VB6 では、
' 正解
Private Type ENUMLOGFONTEX
elfLogFont As LOGFONT
elfFullName(LF_FULLFACESIZE - 1&) As Byte
elfStyle(LF_FACESIZE - 1&) As Byte
elfScript(LF_FACESIZE - 1&) As Byte
End Type
のようにするのが正しいです。
手順書などを作成する場合に、ログオン画面や、セキュリティダイアログ (Ctrl Alt Del キーを押した画面) をキャプチャーしたい場合があります。 2 台の Windows があれば、次の手順で簡単に取りこむことができます。
Windows 2000 PC でリモートデスクトップ共有を有効にします。もう一台から接続して画面を取りこみます。
- Windows 2000 にログオンします。
- 画面の色数を 256 色に設定します。(このほうがキレイにとれます)
- [スタート]-[プログラム]-[アクセサリ]-[通信] から NetMeeting を起動します。
- [ツール]-[リモートデスクトップ共有] をクリックします。
- ウィザードが起動するので、「次へ」「次へ」をクリックします。
- スクリーンセーバーパスワードは設定せず、「次へ」をクリックします。
- 「完了」をクリックします。
PC が 1 台しかない場合、VMware などの使用を検討するといいでしょう。
- もう一台の Windows にログオンします。
- NetMeerting を起動します。
- 通話ボタン (電話のアイコン) をクリックし、通話先に Windows 2000 PC の IP アドレスを記入し、「この通話をセキュリティで保護する」にチェックを入れて「通話」ボタンをクリックします。
- [制御]-[Ctrl Alt Del の送信] をクリックするとセキュリティダイアログが表示されます。ここで「ログオフ」すると、Windows 2000 のログオン画面が表示されます。NetMeeting で表示された画面は、Print Screen キーで取りこむことができます。