Git の脆弱性に対する Visual Studio / Team Foundation Server の更新プログラムがリリースされました。

こんにちは、Visual Studio サポ―ト チームです。 先日、Git の脆弱性が確認されたことを受け、Team Foundation Server 2013 と Visual Studio 2013 に対する更新プログラムが以下のとおりリリースされました。     Team Foundation Server 2013 に対する更新プログラム <Visual Studio 2013 RTM 向け> Update for Microsoft Visual Studio 2013 (KB3023302) http://www.microsoft.com/en-us/download/details.aspx?id=45329 <Visual Studio 2013 Update 4 向け> Update for Microsoft Visual Studio 2013 Update 4 (KB3023304) http://www.microsoft.com/en-us/download/details.aspx?id=45327 ※ ドキュメントのタイトルは Visual Studio となっていますが、いずれも、Visual…


MaskedTextBox コントロールでキーボード入力を処理する場合の注意点について

こんにちは、Visual Studio サポート チームです。 今回は、MaskedTextBox コントロール (以下、MaskedTextBox) でキーボード入力を処理する場合の注意点についてご紹介します。 MaskedTextBox は、マスク パターンを指定して、入力制限を行うことができる TextBox です。 郵便番号、日時、電話番号などの標準的なマスクは、あらかじめ用意されており、マスクを設定しておくと、その形式に合わない入力を拒否できます。 入力が不可欠な文字スペース、英数字だけ受け付ける、など様々な条件を組み合わせて、マスクをきめ細かく作成することもできます。 また、パスワードなどの入力を受け付ける場合、画面に入力された文字を表示せず、代替文字を表示するような設定もできる非常に便利なコントロールです。 この MaskedTextBox の内部では、Enter キーの入力に対して他のキーとは異なる特別な処理が実装されていますので、ご注意いただく必要があります。 MaskedTextBox コントロールでの特別な処理について まず、キーが押された時に発生するキー イベントの順番は、次のようになります。    KeyDown → KeyPress → KeyUp MaskedTextBox では、 KeyDown イベントにおいて、Enter キーが検知されると、コントロール内部で特殊なフラグが設定されます。 このフラグは、KeyPress イベント内で再設定されます。 このように、MaskedTextBox が Enter キーを他のキーとは異なる特別なキーとして処理しています。 しかし、他のコントロールによるイベント処理の影響で、KeyPress イベントがキャンセルされると、上記フラグが設定されたままとなるため、次の文字入力以降で不整合が発生します。 Windows フォームでは、キーボード メッセージがコントロールに到達する前に、それらをフォーム レベルで処理できますが、この Enter キーに対する特別な処理のために、問題が発生することがあります。 注意が必要なケースについて、具体例と合わせてご説明します。 注意が必要な例 Form 上に、MaskedTextBox を配置し、Enter キーが押された際に、次のコントロールにフォーカスを移動する処理を実装します。…


[ご注意ください] 12 月 10 日に Windows Update で配信された Visual Studio 2012 対象の更新プログラム KB3002339 をインストールするとシステムのハングアップなどの問題が発生する

2014 年 12 月 10 日に公開され、Windows Update で配信された Visual Studio 2012 対象の KB3002339 の更新プログラムをインストールすると、Windows Update が完了しない、システム再起動時に更新が完了せずシステムがハングアップしてしまうという現象が発生することを確認いたしました。 KB3002339 https://support.microsoft.com/kb/3002339/ 本問題の報告を受け、Windows Update の配信は既に停止いたしましたが、Windows Server Update Services (WSUS) を使用して更新プログラムを配信されているお客様におかれましては、本更新プログラムの配信を停止していただけますようお願い申し上げます。 既に本更新プログラムを適用し、ハングアップなどの現象が発生している環境での復旧方法につきましては、システムの復元ポイントを使用して復旧したケースを確認しておりますが、その他の方法があるか現在調査中です。 進展があり次第、情報公開させていただきます。 お客様には多大なご迷惑をおかけしておりますこと、深くお詫び申し上げます。   (12/11 追記) 本現象の発生条件、ならびに弊社での本問題に対する対応状況について以下にお伝えいたします。 ・本問題は Windows Update から KB3002339 の更新プログラムをインストールした場合に発生します。KB3002339 の更新プログラムをダウンロード センターから入手し、単体でインストールした場合には発生しません。 ・KB3002339 の更新プログラムは、Visual Studio 2012 がインストールされている環境が適用対象となります。また、Visual Studio 2012 Shell (Isolated) を利用するアプリケーションがインストールされている場合も適用対象となることが想定されます。 ・今回の問題について修正した新しいパッケージをリリースする予定です。リリースの日程が決まりましたら本 Blog でご案内します。なお、既に KB3002339…


Windows 8.1 での GetAsyncKeyState 関数の動作変更について

  こんにちは、Visual Studio サポート チームです。 今回は、GetAsyncKeyState 関数の動作の変更についてご紹介します。 キーボードフックの処理内で、GetAsyncKeyState 関数を使用して、Shift キーが押されていることを判断している場合があると思います。 しかしながら、KB2975719 の修正の一部である KB2980433 の対応の結果、この関数の戻り値が変更されることがあります。 具体的には、Shift キーを押下した際、GetAsyncKeyState 関数の戻り値は、0x00000000 または 0x00000001 となります。 この変更に伴い、例えばアプリケーションとしての動作が変わり、予期せぬ問題が発生することが想定されます。 なお、この問題は、キーボードフックしている時のみ確認できる問題となります。 本動作変更の対処方法としては、キーボードフックした際に、GetAsyncKeyState 関数を使用せず、KBDLLHOOKSTRUCT 構造体のメンバー変数 vkCode が VK_LSHIFT か VK_RSHIFT かを判定し、メンバー変数 flags が LLKHF_UP である場合には、SHIFT キーが入力されたと判断する方法があります。 [補足] 以下は対処方法のソースコードの一例となります。 // フックコードのチェック if(nCode == HC_ACTION){        // lParam はキーボードフックされた際に渡される LPARAM             LPKBDLLHOOKSTRUCT pKey = (LPKBDLLHOOKSTRUCT)lParam;        //…


WPF アプリケーションの画面表示が不正になる件について

こんにちは、Visual Studio サポート チームです。 今回は、WPF アプリケーションでの画面が正しく表示されない問題の切り分け方についてご紹介します。 WPF アプリケーションでは、画面が真っ白になる等、不正な表示になることが稀にあるというお問い合わせをいただくことがあります。 そのような問題は、現象を再現させるための手順が定まっていなかったり、特定の PC でしか問題を確認できなかったりすることがあります。 そのため、まずは問題が、ハードウェア (ビデオ ドライバー) にあるのか、ソフトウェアにあるのかの切り分けを行います。 WPF アプリケーションは、ウィンドウやコントロールの描画を行う際に、既定では、グラフィックス ハードウェアの機能を利用します。 グラフィックス ハードウェアを利用することによって、描画のパフォーマンスの向上が期待できます。 しかしながら、この機能は、ハードウェアに依存するため、描画が正しく行われない等の問題を引き起こす場合が稀にあります。 そのような場合には、グラフィックス ハードウェアの機能を無効にすることで問題を回避できることがあります。 グラフィックス ハードウェアの機能を無効にする手順は、以下となります。   [スタート] – [ファイル名を指定して実行] に regedit と入力し、[OK] をクリックします。  レジストリ エディターが開きますので、左ペインから以下のパスを作成します。     HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics 上記パス上で右クリックし、[新規] から [DWORD 値] を選択し、以下の値を作成します。     値の名前: DisableHWAcceleration 値の種類: REG_DWORD 値のデータ: 1 アプリケーションを再起動します。   このレジストリの情報は以下の技術情報に公開されていますので、さらに詳細を知りたい場合はご確認ください。     グラフィックス レンダリングのレジストリ設定…


WPF アプリケーションでのクリックイベントについて

こんにちは、Visual Studio サポート チームです。 今回は、WPF アプリケーションでのクリック イベントについてご紹介します。 Win32 アプリケーションや WinForms アプリケーションでタッチ イベントを処理する場合、WM_TOUCH メッセージを処理します。 しかし、WPF アプリケーションでは、WPF ランタイム内で独自にタッチ メッセージを処理しているので、WM_TOUCH は無効になっており、独自に TouchDown などのイベントを呼び出しています。 そのため、何か問題が発生したときに、WPF アプリケーションだけタッチできないといったご質問をいただくことがあります。 このような場合には、以下のドキュメントに従い、WPF の独自処理を無効にすることで問題を回避できる場合があります。   WPF アプリケーションのリアルタイムなスタイラス入力を無効にする <http://msdn.microsoft.com/ja-jp/library/vstudio/ee230087.aspx> 上記の対応方法を適用した場合には、独自の処理が無効になり、TouchDown のタッチやスタイラスに関するイベントは呼ばれなくなりますが、WM_TOUCH メッセージは有効となります。 このような制限はありますが、アプリケーションの実装次第で問題を解決できる可能性がありますので、ボタンをクリックしても反応しないというような問題が発生した場合には、せひ一度お試しいただくことをお勧めします。 [補足] リアルタイムなスタイラス入力を無効にするためのサンプル プログラムは既に公開されていますが、有効にする方法についてはありませんでした。 そのため、参考に有効/無効を切り替えるためのサンプル プログラムを以下に公開します。 ———-     private ObservableCollection<TabletDevice> tabletDevicesObservable = new ObservableCollection<TabletDevice>();     public void UpdateWPFTabletSupport(bool enabled)     { // InputManager のタイプの取得…


アプリケーションで、文字化けを回避するためのアプローチ

こんにちは、Visual Studio サポートチームです。 今回は、ミッシング グリフについてご案内いたします。 文字を表示したり、印刷する際に時折、文字化けに悩まされることがあります。 では、どうして文字化けが発生するのでしょうか? その要因の一つとして、このミッシング グリフが挙げられます。 グリフとは 文字コードに対応する文字の形状であり、フォント ファイルに含まれるデータとなります。 アプリケーションで、文字を表示する際には、フォントと文字コードを指定すると、Win32 API や .NET Framework の内部処理では、フォントファイルを参照し、文字コードに対応するグリフを検索をします。 この検索で、グリフが見つからない場合、文字化けが発生します。 つまり、アプリケーションが指定したフォントと文字コードのミスマッチが、文字化けの原因となります。 この状態をミッシング グリフと称します。 ミッシング グリフが発生した場合には、フォント ファイルのグリフの 0 番目に代替用のグリフを用意していますが、このグリフは、”□” であったり “・” であったり、どのようなグリフが用意されているかは決まっていません。 また、Win32 API や .NET Framework の内部処理では、ミッシング グリフが発生した場合、別のフォントを代用して、ターゲットの文字コードに対するグリフの検索を行っています。 この代用処理は、代表的なフォントに対してのみ検索しており、インストールされている全てのフォントは検索していないため、残念ながらこの代用処理でもミッシンググリフを確実に回避することはできません。 また、複数のフォントを検索するため、フォント ファイルが用意している代替用のグリフを利用せず、Win32 API や .NET Framework の Runtime が個別に用意している代替用のグリフが利用されます。 これらの代替用のグリフは Win32 API や .NET Framework ごとに共通ではなく、各関数やメソッドごとに異なるグリフが利用されます。 このため、アプリケーションがフォントと文字コードのミスマッチを起こすような処理を行うと、以下の何れかの現象が発生します。…


浮動小数点を利用する際に知っておきたいこと

  こんにちは。Visual Studio サポート チームです。 今回は、Visual Studio でアプリケーションを開発する時にデータ型として使用できる浮動小数点数についてのお話です。 本記事の内容は Visual C++、Visual C#、Visual Basic を対象としております。 浮動小数点数を使用する際の注意点 浮動小数点数はプログラムで小数を扱うために広く利用されていますが、少し癖のあるデータ型でもあるため、その特性をよく理解して利用しないと、思わぬ落とし穴に遭遇してしまうこともあります。 浮動小数点の特性として、注意した方が良いものは主に以下の 3 点となります。   a) 浮動小数点数の演算に固有の誤差が常に生じる可能性がある。   b) ビルド環境やオプションによって、同一のソースコードでも計算結果が変わる可能性がある。   c) 実行する CPU が変われば、同一の実行モジュールでも計算結果が変わる可能性がある。 a) については丸め誤差、桁落ち、情報落ちといった現象を考慮する必要があります。 情報工学の入門で必ず扱われるトピックのため、ご存じの開発者の方も多いかと思います。 一方、b) については、弊社サポートにお問い合わせいただくことが多いトピックです。 コンパイラなどツールのバージョン、Debug / Release モード、コード最適化、対象プラットフォーム、拡張命令セット等の設定により、同一のソースコードをビルドした場合でも、生成されるプログラムが機械語レベルで異なることがあるため、浮動小数点数演算に至るまでの処理内容や演算回数等が変化し、演算結果に影響する可能性がある点に注意が必要となります。 さらに、c) のように演算処理を実行する CPU や FPU の実装が異なれば、同一の実行モジュールであっても、演算結果が異なる可能性があります。 なお、古いドキュメントですが、以下のサポート技術情報にもこれらの点についての解説がありますのでご参考ください。   [VB4] データ型と演算誤差についての注意 http://support.microsoft.com/kb/409744/ja このような特性があるため、厳密な計算が求められる金額計算などに浮動小数点数を利用する際は、特に注意が必要となります。 浮動小数点数の演算結果を完全に一致させることを保証する方法はないため、以下の 2 点に注意して設計・プログラミングを行う必要があります。  …


静的に確保するメモリ サイズが大きいアプリケーションの実行時のエラーについて

こんにちは、Visual Studio サポート チームです。 今回は、巨大なサイズのメモリを静的に確保するようなアプリケーションを実行した場合に発生するエラーについてご案内します。エラー自体は Windows OS の想定された動作に基づくものですが、Visual C++ でのビルド時に予め問題を検出できないケースもあり、注意が必要となります。    OS によるフォーマット チェックで検出されるエラーについて Windows OS では、アプリケーションを起動する際、事前に対象ファイルのフォーマットのチェックを行い、静的に確保されているメモリのサイズが大きすぎる場合に、アプリケーションの実行を制限します。 このサイズの上限は、後述の Visual C++ のリンカーが制限している 2GB とは完全に一致しておらず、アプリケーションのビルド時にエラーが検出されなかった場合でも、アプリケーションを実行できない場合があるのでご注意ください。 Windows OS によってアプリケーション実行時に検知されたエラーは STATUS_INVALID_IMAGE_FORMAT (0xC000007B) エラーとして OS 内部で通知され、以下のように「有効な Win32 アプリケーションではない」または「このアプリはお使いの PC では実行できません」といったエラー メッセージが表示されます。 Windows 7の場合 Windows 8 や Windows 8.1 の場合   サンプル コード 以下の Visual C++ コードを Visual Studio でコンパイルして実行することで、上記エラーを確認することができます。 #include<stdio.h>…


ActiveX コントロールのバージョン情報を 2 桁にすると Visual Studio 2010 以降ではイベントが表示されない

こんにちは、Visual Studio サポート チームです。 今回は ActiveX コントロールを Visual Studio で開発した場合に、コントロールのバージョンを 2 桁に設定した場合に発生する現象とその対処方法についてお伝えします。   現象 ActiveX コントロールを Visual Studio 2010 のデザイナー画面上に配置し、コントロールのプロパティを表示します。 その際、コントロールのバージョンが “1.10” のように 2 桁の数値を含む場合に、コントロールに定義されているイベントを表示できない場合があります。 本現象は Visual Studio 2010 以降のバージョンで発生いたします。 以下のように、コントロールのプロパティからイベント (雷マーク) を選択した場合に、登録されたイベントが存在した場合も表示されません。   原因 本現象は、Visual Studio IDE (統合開発環境) が対象の ActiveX コントロールのバージョン情報をレジストリから読み込む際に、コントロールのバージョン情報を 16 進数表記と仮定して扱う不具合に起因して発生いたします。 弊社製品の不具合でご迷惑をおかけいたしますこと、深くお詫び申し上げます。   対処方法 以下のレジストリに登録されているコントロールのバージョンを表す数値を、2 桁以上の場合には 16 進数表記に変更してください。 OCX の情報は以下のレジストリに登録されます。   [HKEY_CLASSES_ROOT\CLSID\{< OCX…