< November 2004 | December 2004 | January 2005 >

December 21, 2004

IDL ファイルのコンパイル時に MIDL2039 の警告が出る

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 として取り上げられている。

続きを読む...

December 8, 2004

VB6 API ビューアの ENUMLOGFONTEX 構造体宣言の誤り

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

のようにするのが正しいです。

続きを読む...

ログオン画面や、セキュリティダイアログを取りこむ

winFAQ より。

手順書などを作成する場合に、ログオン画面や、セキュリティダイアログ (Ctrl Alt Del キーを押した画面) をキャプチャーしたい場合があります。 2 台の Windows があれば、次の手順で簡単に取りこむことができます。

Windows 2000 PC でリモートデスクトップ共有を有効にします。
  1. Windows 2000 にログオンします。
  2. 画面の色数を 256 色に設定します。(このほうがキレイにとれます)
  3. [スタート]-[プログラム]-[アクセサリ]-[通信] から NetMeeting を起動します。
  4. [ツール]-[リモートデスクトップ共有] をクリックします。
  5. ウィザードが起動するので、「次へ」「次へ」をクリックします。
  6. スクリーンセーバーパスワードは設定せず、「次へ」をクリックします。
  7. 「完了」をクリックします。
もう一台から接続して画面を取りこみます。
  1. もう一台の Windows にログオンします。
  2. NetMeerting を起動します。
  3. 通話ボタン (電話のアイコン) をクリックし、通話先に Windows 2000 PC の IP アドレスを記入し、「この通話をセキュリティで保護する」にチェックを入れて「通話」ボタンをクリックします。
  4. [制御]-[Ctrl Alt Del の送信] をクリックするとセキュリティダイアログが表示されます。ここで「ログオフ」すると、Windows 2000 のログオン画面が表示されます。NetMeeting で表示された画面は、Print Screen キーで取りこむことができます。
PC が 1 台しかない場合、VMware などの使用を検討するといいでしょう。