Windows 10 で ISequentialStream インターフェースからファイルを操作する際のパフォーマンスについて

こんにちは、Platform SDK (Windows SDK) サポートチームです。 今回は、Windows 10 における ISequentialStream インターフェースの動作についてご案内いたします。   現象 Windows 10 では以前のバージョンの Windows と比べて ISequentialStream インターフェースからファイルを操作する際の処理時間が長くなる場合があります。   これは Windows 10 で導入された UWP に対応するため ISequentialStream の内部実装に変更が加えられたことにより、 内部的なメソッド呼び出しのオーバーヘッドが増加したことに起因します。 例えば SHCreateStreamOnFileEx 関数で開いたファイルを Read メソッドで読み出す場合が該当します。特に繰り返し何度も呼び出すようなケースでは、前述のオーバーヘッドの影響を大きく受けます。   パフォーマンスを重視される場合は、メソッドを呼び出す回数が少なくなるようにアプリケーションの実装を変更するか、 ReadFile 関数や SetFilePointer 関数を直接利用する方法をご検討ください。


CDS_RESET フラグと CDS_RESET_EX フラグについて

こんにちは、Platform SDK (Windows SDK) サポートチームです。 Windows Vista および Windows Server 2008 から提供されている CDS_RESET_EX フラグについてご紹介します。   概要 Windows Vista および Windows Server 2008 から、ChangeDisplaySettingsEx 関数の第四引数 DWORD dwflags に指定可能なフラグ値として、CDS_RESET_EX (0x20000000) が Windows SDK 同梱のヘッダーファイルに追加されています。   詳細 ChangeDisplaySettingsEx 関数の第四引数に指定可能なフラグ値の一つに、CDS_RESET (0x40000000) があります。 この CDS_RESET は、要求された設定が現在の設定と同じであっても、ディスプレイ デバイスの設定を変更する (リセットする) ためのフラグです。 ところが Windows Vista および Windows Server 2008 には、要求された設定が現在の設定と同じである場合は CDS_RESET を指定してもリセット処理が有効にならない問題がありました。 この問題は、Windows…


PDH、Registry 関数でパフォーマンス情報を取得できない場合がある

こんにちは、Platform SDK (Windows SDK) サポートチームです。今回はパフォーマンス情報がシステム起動時のタイミングで取得できない場合がある現象についてお知らせします。 現象システム起動時にアプリケーション上で以下の何れかの方法でパフォーマンス情報の取得を試みると、期待される情報が取得できない場合があります。 – PDH (Performance Data Helper) 関数を使用する- Registry 関数 (RegQueryValueEx 関数で HKEY_PERFORMANCE_DATA を指定) を使用する 原因Windows OS はシステム起動タイミングでパフォーマンス情報に関する初期化処理を実施します。その際、パフォーマンス情報を管理するための情報がレジストリに一旦作成されますが、本タイミングでパフォーマンス情報の取得を行った場合に情報が取得できません。具体的には、初期化処理開始時に以下のエントリーが作成されてから初期化処理終了時に当該エントリーが削除されるまでの期間となります。 キー  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib名前  : Updating種類  : REG_SZデータ: WmiApRpl 確認方法1)下記 MSDN ドキュメントのサンプル (Example の項) をビルドします。 Title: RegQueryValueEx functionURL: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx 2) ビルドしたサンプルを実行してコンソールに結果として表示されるバッファ サイズを確認します。3) 上記 Updating エントリーを追加します。4)再度サンプルを実行し、バッファ サイズを確認します。5) 2) と比較してバッファ サイズが小さくなることを確認します。 対処方法システム起動時にパフォーマンス情報に対する初期化処理が実行されることは OS の想定された動作になります。このため、システム起動時にパフォーマンス情報を取得する場合は上記 Updating…


Windows 10 上で、MFC の CFileDialog で作成したダイアログを小さくリサイズできない

こんにちは、Platform SDK (Windows SDK) サポートチームです。 今回は、Windows 10 上で、MFC の CFileDialog クラスを利用した場合に、ダイアログのサイズを、小さくリサイズできない現象についてご紹介します。   概要 MFC では、「ファイルの保存」、「印刷」等の一般的なダイアログ ボックスをカプセル化したコモンダイアログ クラスが利用可能です。 コモン ダイアログ クラスは、Windows が提供しており、OS の動作に依存します。このコモン ダイアログ クラスにある、CFileDialog クラスでは、「ファイルを開く」と「名前を付けて保存」ダイアログの二種類のファイルダイアログを表示できます。 CFileDialog クラスを Windows 10 上で利用した場合、ダイアログのサイズを大きくリサイズすることはできますが、小さくすることができません。 また、サイズを大きくした後にアプリケーションを再起動した場合、大きいサイズのまま表示されます。 – 参考情報 各クラスの詳細については、以下の技術資料をご参照ください。   コモン ダイアログ クラス   <https://msdn.microsoft.com/ja-jp/library/5fcd0hw9.aspx>   CFileDialog クラス   <https://msdn.microsoft.com/ja-jp/library/dk77e5e7.aspx>   状況 本現象については、Windows 10 November Update にて修正されていますので、Windows Update を実施ください。  …


影を付けたウィンドウの表示結果が Windows 10 上でおかしくなる

  こんにちは Platform SDK (Windows SDK) サポートチームです。Windows 10  が RTM されました!Windows 10 関連のお問い合わせも日に日に多くなっていることを実感しています。Windows SDK サポートチームは開発者およびWindowsユーザーの皆様をこれからも全力で支援させていただきます! 今回はWindows 10関連の既知の問題についてお知らせします。Windows アプリケーション開発において、ウィンドウに影を付けることができますが、Windows 10 上ではこちらの表示に問題があります。影を付ける方法の一つとしてウィンドウ クラス スタイルの CS_DROPSHADOW の設定がありますが、Windows 10 上でこちらをセットしたウィンドウを表示した場合、これまでのOSと異なる表示結果になります。 例えば Windows 8.1 上で CS_DROPSHADOW を設定したウィンドウを表示した場合、以下のような結果になります。画像では少々分かりにくいかもしいれませんが、影はウィンドウのすぐ後ろに表示されるようになっています。 一方 Windows 10 では影がウィンドウから離れて表示されます。 皆様には大変ご迷惑をおかけしますが、Windows 10 上でこの現象を回避する方法は現状用意されていません。マイクロソフトはこれをWindows 10上の問題であり、本来であればWindows 8.1 と同じような表示になるべきと認識しています。将来的には修正が行われる見込みですが、残念ながら現時点では修正時期については未定となっています。 – 参考資料 ・Window Class Styles https://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx


GetTempFileName() をご利用いただく場合の注意点

Platform SDK (Windows SDK) サポートの平田です。11 月になり、ちらちら紅葉も見られるようになってきました。私の家は高尾に比較的近いところにあるため、この時期の高尾山を見に行くのを楽しみにしております。 本日は、GetTempFileName() をご紹介させてください。こちらの API は、一時ファイルを作成するときに便利な関数です。私も仕事柄サンプルを作ったりすることが多いのですが、大体作成するログファイルの名前は“log.tmp” です。当然、サンプルを動作させる場合に、同じファイルに上書きさせてしまったことがあります。その結果、出力した結果を後日確認できなくなったりして困ったりすることがありました。皆様も私と同じ失敗をしないように、この API を利用してみてください。 GetTempFileNamehttp://msdn.microsoft.com/ja-jp/library/cc429354.aspx UINTGetTempFileName(  LPCTSTR lpPathName, // ディレクトリ名  LPCTSTR lpPrefixString, // ファイル名の接頭辞  UINT uUnique, // 整数  LPTSTR lpTempFileName // ファイル名を格納するバッファ); 一時ファイル名を作成するための規則をそれぞれの引数で指定することができ、lpPathName には、出力を行うフォルダのパスを設定します。ちなみに、”.” と設定するとカレントディレクトリに出力されます。lpPrefixString には、ファイルの接頭辞をつけます。たとえば、hir と設定した場合、出力されるファイル名は、”hir1111.tmp”といった形で先頭3 文字を設定できます。uUnique に設定する値をもとに16 進文字列が生成されますが、0 を設定するのがこの API をご利用いただく一番のメリットとなります。0 を設定した場合には、一意なファイルが作成されます。0 を設定された場合は、結果は、hir1111.tmp だったり、hir1112.tmp だったりします。この結果の文字列が lpTempFileNameが指すバッファに書き込みが行われます。 こんな動作をするGetTempFileName() の動作メカニズムについて、以下にまとめてみました。   GetTempFileName() の動作メカニズム 一番利用されるシナリオと考えられる uUnique パラメーターにて…


修正プログラムにまつわるお話

おはようございます。Platform SDK (Windows SDK) サポートの junyoshi です。今年から本ブログのライターとして加わりました。ユーザー インターフェイスやネットワーク、サービスなど、Windows 上でのさまざまなアプリケーション開発について、開発者のみなさんからのお問い合わせに対応しています。以後、お見知りおきいただけますようお願いします。 さて、まったく話は変わりますが、インフルエンザが流行っていますね。今年は A 型が、というお話をよく聞きますが、B 型にかかったという方もいらっしゃるようで、毎年のことながらどれに気を付けたらよいというのはなさそうです。当然、私は医療の専門ではありませんが、先日テレビで「手洗い、うがいは確実なものではない」と放送していました。インフルエンザは飛沫感染で、ウィルスは肌や粘膜に付着したら手洗いやうがいをするよりも早く侵入してしまうから、というのが理由でしたが、そうすると事前に準備が必要なので、予防接種しかないということですね。とは言っても、少しでも遠ざけられるなら、と考えて手洗い、うがいを続けたいと思います。 GDR と LDR って何? Windows をお使いいただいていると、よく Windows Update や Microsoft Update というウィンドウが表示されて Windows を更新するよう促されることがあると思います。OS の不具合が修正されたり、新しいモジュールが提供されたりすると、よりよい環境をご利用いただくためにプログラムが提供されます。PC からインターネットを通じて定期的にマイクロソフトのサイトをご確認いただくことで、新しいモジュールが見つかり、簡単なユーザー インターフェイスによってインストールすることが可能となっています。 でも、実際に Windows Update から PC にインストール可能なプログラムは、マイクロソフトが提供しているものの一部です。たとえ、製品の不具合を修正したものであっても、すべてがインストールされるわけではありません。それはなぜか。 マイクロソフトでは、大きく分けて以下の 2 種類の修正プログラムを提供しています。修正プログラムとは、製品の不具合を修正するプログラムのことです。 Limited Distribution Release (LDR) 以前は、Quick Fix Engineering、略して QFE と呼ばれていました。ある特定の問題を解決するために修正が行われ、その問題が解決されていることをテストにより確認した上で公開された修正プログラムです。局所的なテストとなることが多いので、修正がほかの機能に影響している可能性があります。 General Distribution Release (GDR) 広範囲のお客様に提供するために、さらに多くのプロセスを経て、追加テストなども行った上でリリースされる修正プログラムを指します。 LDR は、局所的な問題解決であり、万人向けとは言い難いため、修正される原因となった問題の影響を受けているお客様向けに提供しています。問題に関する情報は、マイクロソフトの…