Vista」タグアーカイブ

Vista 以降で CFileDialog において SetTemplate が使えない場合の代替方法


Mimura です。
先ほど、STEP_M 1.053 をリリースしました。

 

今回のネックは CFileDialog において Vista 以降の新しいファイルダイアログでは、
SetTemplate が使用できないことでした。

 

そこで、私もこの情報を見つけるまでにかなり時間がかかりましたので、
メモとして、また同じ悩みを抱えている人に有用な物となればいいかなと思います。

 

(あらかじめ断っておきますと、あんまりMFC を使いたくない人です。私。)

 

 

SetTemplate を使用する場合、大体が以下のようなコードとなっていると思います。

CMyFileDialog::CMyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
        DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
        CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
    SetTemplate(0, IDD_CUSTOM_FILE_OPEN);
}

(STEP_M ソースコード MyFileDialog.cpp より)

XP,2000 ではこのコードで通りますが、

Vista, 7 では「サポートされていない機能を実行しようとしました。」
というエラーダイアログが表示されてしまいます。

 

 

そこで考えたくなるのが、Vista 以降のOSで SetTemplate を使う方法ですが、
現時点ではあきらめた方がいいと思います。

 

Visual C++ Team Blog  Vista-style File Dialogs with MFC
Microsoft 社の Visual C++ Team のブログでも、

the new Vista dialogs no longer supports hwnd template customization, your CFileDialog object will throw CNotSupportedException if SetTemplate is called on it. 

適当訳:[英語苦手なので、あまりにも訳が違っていたら指摘お願いします]
Vista の新しいダイアログは、テンプレートによるカスタマイズには対応しません。SetTemplate を CFileDialog で呼び出したら、CNotSupportedException をスローするよー。

というようなことが書かれています。

 

 

それではどうするかですが、
Vista 以降のダイアログにはそれの為の弄る方法が用意されています。

 

CMyFileDialog::CMyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
        DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
        CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{

    IFileDialogCustomize* custom;
    custom = this->GetIFileDialogCustomize();
    if(custom != NULL){
            // チェックボックスを追加する場合は以下のように。
            custom->AddCheckButton(IDC_CH_FILE_ADDPEND,L"ボタンのついか。",false);
        }
        custom->Release();
    }
}

 

抜粋して書きますと上記のようになります。

this->GetIFileDialogCustomize();

で IFileDialogCustomize のインスタンスを取得し、
custom->Add****

によって、ボタンやエディットボックス、ラベルやらを追加していきます。

なお、IFileDialogCustomize 系は、WINVER が 0x0600 以上でないと利用できません。
StdAfx.h 等で設定している方はご注意下さい。

 

設置した内容を取得する場合、上記の例のサンプルで行きますと、

 

IFileDialogCustomize* custom;
custom = this->GetIFileDialogCustomize();
custom->GetCheckButtonState(IDC_CH_FILE_ADDPEND,&checkstate);
custom->Release();

 

上記にありますように、
custom->Get****

によって、値を取得します。

 

どのような命令があるか、また、オブジェクトが使えるかということにつきましては、

IFileDialogCustomize Interface (Windows)
上記リンクを参照して下さい。

 

最後に、XP,2000 上でも、Vista 以降のWindows でも、両方で動くようにするソースですが、

CMyFileDialog::CMyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
        DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
        CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
    IFileDialogCustomize* custom;
    custom = NULL;
    TRY {
        // Legacy OS [ – Windows XP]
        SetTemplate(0,IDC_CH_FILE_ADDPEND);
    } CATCH (CNotSupportedException,e){
        // New OS [ Windows Vista – ]
        custom = this->GetIFileDialogCustomize();
        if(custom != NULL){
            custom->AddCheckButton(IDC_CH_FILE_ADDPEND,L"ちぇっく。",false);
        }
        custom->Release();
    }
    END_CATCH
}

(STEP_M ソースコード MyFileDialog.cpp より)

というような、上記のコードはいかがでしょうか。
MFC 上では try – catch 構文は使えないらしく、TRY – CATCH – END_CATCH を使うようです。

そこで、まずは SetTemplate を動かし、
非対応エラー(CNotSupportedException) が発生してしまったら、
Vista 以降の IFileDialogCustomize を用いたカスタマイズを行う。という形です。

 

 

開発のご参考になりましたら幸いです。

Vista 版 Bootvis


そんなわけで、ちょっと検索したらすぐヒットしましたので適当に書いてみることにします。

とりあえず、記事に入る前に「Bootvis」とはなんぞや。と言う方へ。
適当に言えば、起動プロセスを分析して、高速化までやってくれるツール。

XPの時にあったのですが、不具合があるだかですぐに公開停止されましたが、動かしてみて、未だに目立った問題に当たっていないので、平和なのかそれとも安全なのか。むー。

 

そんなわけで、もちろん Vista でもなんかやってみたくなるわけです。

かといって、レジストリクリーナーはやった後、必ず不具合が出てくるという苦い経験を何度も経験しているので、やりません。

あと、システムも別に重いって訳ではないですし、何となく、暇だからやってみたくなるわけです。

ダウンロード

とりあえず、Vista 版 Bootvis とくるのは
Windows Performance Analysis Developer Center
ここからダウンロードできる Windows Performance Tool Kit となります。

(右の真ん中あたりにある Downloads にある 「WPT Kit ・・・」からダウンロードできます。 ・・お使いのアーキテクチャはわかりますよね。

・・わからなければ x86 をとってくれば大丈夫だと思いますが、わからない人はやらない方がいいかもしれません。止まったときの責任が私にはもてませんので。

 

2009/10/22 修正:
どうも単体での公開をやめてしまったようです。

公式の文章を深くまでよく見れば、「Windows 7 SDK を取ってきてくれ」という内容が出ていますので、
Download details Microsoft Windows 7 SDK

こちらのリンクより、 Windows SDK をダウンロードしてインストールしてください。

 

SDKのインストール

image

必要最小限のインストールのみ(WPT のみをインストール出来るようにする。)とする場合は

image

このインストール設定でインストールを行います。

終了しますと、スタートメニューの(すべての)プログラム内に、
「Microsoft Windows SDK v7.0」 という項目。その下に「Tools」という項目が出来、
その中に「Install Windows Performance Tool Kit」という項目が存在しますので、
それをクリックしますと、WPFのインストールが開始されます。

 

インストールっ

image インストール開始。

インストールしますと、スタートメニューの(すべての)プログラム内に
「Microsoft Windows Performance Toolkit」 というメニューが作成されます。

 

最適化してみる

そんなわけで、コマンドプロンプトを 右クリック –> 管理者として実行 で実行する。

 

起動を高速化する場合は、

xbootmgr -trace boot –prepSystem

と入力して実行、

 

再起動を高速化する場合は、

xbootmgr –trace reboot –prepSystem

と入力して実行します。

 

image

image

この画面が出て、あとは何度か再起動されるのを待つ

やってみた結果

ログイン画面までの時間は変わりませんでした。(元々早かったことがあると思います。

ログイン後の、デスクトップまでの時間が短縮されたように感じました。

 

とりあえず、ネタ。ですが、起動時間が長いと感じている人は試してみてはいかがでしょうか。

PSXPAD を Vista で使った時のエラーを消す方法。


エラーの出るときにどこを参照しているか。ということを追ってみていると、
やっぱり予想通り、通常のプロセスがいじれないようになっている部分をさわっていました。

いじっている部分だけさわれるようにアクセス権限を設定し直したら、問題なく動き始めた・・。
というところです。

これの設定を変更すると、

Effect PresetRenew とか、
Load Effect CurrentName とか、
SaveCurrentMode Open とか、
Save Effect CurrentName とか
Set FF Rec とか。

また、ゲーム起動中に出てくる、このパッドドライバからのエラーも消えます。
ただ、レジストリをいじるので自己責任で。

続きを読む

MIDI仮想デバイスをVistaで使う。


ちょっとした用で、MIDI OUTの信号をMIDI INに戻す、
いわゆるMIDI Loopback Driverっちゅうのを探していました。

探してみたところ、
Vistaでの動作は厳しく、
動かない・・。と思っていたところ、発見しました。

http://www.hurchalla.com/Maple_driver.html

この Maple Virtual Midi Cable っていうのを使用すれば、
Vistaでも使用できます。
それも、フリーウェア。
さらに、5ポートぐらい置いてあるんで、
これは実においしいなと。

というわけで、覚書も含めて書いておきます。