アプリケーション構成ファイルのエンコーディングを変更した場合に発生する問題について

こんにちは、Visual Studio サポート チームです。 今回は、アプリケーション構成ファイル (***.exe.config) のエンコーディング設定を変更した場合に発生する問題と対処方法についてご案内します。   現象 アプリケーション構成ファイル (***.exe.config) のエンコーディングを Shift-JIS などに変更してアプリケーションを実行すると、以下のようなエラーが発生してアプリケーションの起動に失敗します。   Visual Studio からは、次の手順で App.config のエンコーディングを変更することができますが、既定値から変更した場合は上記のようなエラーが発生する可能性があります。   手順: ソリューション エクスプローラーで App.configを選択します。 プロパティ ウィンドウの [エンコード] で “日本語 (シフト JIS)” に設定して保存します。 ※ なお、Visual Studio ホスティング プロセスを介してアプリケーションが起動されている場合は、上記のエラーは発生しません。    対処 App.config のエンコーディングに Uft-8、または Utf-16 を使用することでエラーの発生を回避することができます。 “Unicode” – <?xml version=”1.0″ encoding=”utf-16″ ?> “Unicode (UTF-8)”  – <?xml…


ActiveX コントロールに含まれるプロパティ ページの動作について

こんにちは、Visual Studio サポートチームです。 今回は、ActiveX コントロールに含まれるプロパティ ページの動作についてご案内いたします。 ActiveX コントロールには、コントロールのプロパティ値を確認したり変更するために便利なプロパティ ページを開発者が追加することができます。 1 つの ActiveX コントロールに複数のプロパティ ページを持つことも可能ですが、このプロパティ ページの遷移や、プロパティ ページ内の変更の適用を通知するタイミングは、プロパティ シート側の動作に依存します。 Visual Studio のデザイナーにおけるプロパティ シートの動作は、Visual Studio のバージョンやデザイナーの種類によっても異なっており、プロパティ ページを切り替えた際に自動的に適用されるものや、プロパティ ページを切り替えても自動的には適用されず個別に [適用] ボタンを押下する必要があるものがあります。 例として A)  .NET Framework の Windows フォーム デザイナーの場合にはプロパティ ページの切り替えで値が適用されますが、B) MFC のダイアログ エディターの場合にはページの切り替えでは変更は反映されず、「適用」ボタンを押下する必要があります。   A)  .NET Framework の Windows フォーム デザイナーの場合 B) MFC のダイアログ エディターの場合 このようなプロパティ ページ上での値の変更が適用されるタイミングを、ActiveX コントロールの開発者が制御することはできません。このため、例えば、ページの切り替えにより変更適用のためのメソッドが呼び出されることを前提としたコントロールの設計は避けていただく必要がある点にご留意ください。 また、ActiveX コントロールのご利用者様におかれましては、プロパティ…


Visual C++ の正規表現ライブラリで発生するバージョン間での動作の違いについて

こんにちは、Visual Studio サポート チームです。 今回は、Visual C++ の正規表現ライブラリ (regex) で発生するバージョン間での動作の違いについてご案内いたします。   Visual C++ では 2008 SP1 で Technical Report 1 (TR1) の regex を取り入れており、以降のバージョンでご利用いただけます。 Visual C++ の regex は C++ 標準に準拠しており、原則としてバージョン間でも互換性がございますので、以前のバージョンの Visual C++ で regex を使用していたコードは、多くの場合新しいバージョンの Visual C++ でもそのまま動作します。 ただし、不具合の修正や標準への準拠などに伴って、バージョン間で動作が異なる部分も稀にございます。特に、regex に限ったことではございませんが、いわゆる処理系依存として C++ 標準に規定されていない部分は、互換性に影響がある変更点としてのご案内なく動作が変わる可能性があります。   具体的な例を挙げると、例えば C++ の regex では正規表現の処理で発生したエラーを regex_error クラスのオブジェクトをスローして通知することとなっていますが、error_complexity、error_space、error_stack といった種類のエラーは、同一の入力条件であっても、Visual C++ のバージョンや実行環境が違えば発生状況も異なることがあります。これは、Visual Studio のバージョン間で、バックトラッキングを伴う検索処理の実装や、複雑度の基準の変更があったことなどが影響しています。…


Visual Studio 2013 が 異常終了 (クラッシュ) する

[更新: 2017年 11月 6日] 本投稿でご説明した 問題は 2017年 11月 6日時点では既に修正されております。現在はVisual Studio 2013 Update5以外のバージョンでもVisual Studio 2013の起動、サインインにおいて本問題は発生いたしません。ご不便、ご迷惑をおかけいたしまして、大変申し訳ございませんでした。 こんにちは、Visual Studio サポートチームです。 今月に入り、Visual Studio 2013 が起動直後に異常終了する、サインインができなくなったという報告をいただいています。 詳細については開発部門と協力し現在調査中ですが、Visual Studio 2013 をご使用いただく際のライセンス認証を行うサーバー側の処理での何らかの問題により発生しているものと認識し、調査を進めています。 調査状況に進捗があり次第、本 Blog も更新いたします。 なお、本問題は Visual Studio 2013 のみで確認されており、Visual Studio 2015、2017 や、オンラインでのライセンス認証を行わない Visual Studio 2012 以前のバージョンでは問題は発生していません。 また、この問題は発生する環境では必ず発生しますので、現時点で問題なく Visual Studio 2013 をご使用いただけていたり、サインインが完了している場合には、今回の問題には合致しませんのでご安心ください。   現時点での対処策について ——————————————– 現在までの調査状況では、Visual Studio 2013 に最新の Update 5 をご適用いただくことで正常に動作することを確認しています。…


リソース エディター上で ActiveX コントロールのメニューが表示されない現象について

こんにちは、Visual Studio サポートチームです。 今回は、Visual C++ 6.0 では使用できていたものの、現行の Visual C++ では使用できなくなっている機能の一つについてご案内します。   リソース編集時の ActiveX コントロールのメニューについて Visual C++ 6.0 では、リソース エディターを使用したダイアログ リソースの編集時に、ダイアログに配置された ActiveX コントロールを右クリックすることで、コンテキスト メニューに対応する Verb 表示することが可能となっていました。また、同様の機能は、現行バージョンの Visual Studio における .NET Framework アプリケーションの Windows Form のデザイン画面でも利用可能です。 しかしながら、現行バージョンの Visual C++ のリソース エディターではこの機能が廃止されており、ActiveX コントロール側で適切に EnumVerbs メソッドを実装していた場合であっても、メニューに表示することができなくなっています。このため、編集時に利用可能なメニューとして ActiveX コントロールが提供していた拡張機能などが使用できない場合があります。 この動作は、ActiveX コントロール側の実装の問題などではなく、Visual C++ における機能の廃止に起因しています。また、現在のところ リソース エディターで本機能が改めて提供される予定はありません。 Visual C++ 6.0 で本機能を利用されていたご利用者様や ActiveX…


CDatabase クラスで発生するメモリ リークの問題について

こんにちは、Visual Studio サポート チームです。 今回は、MFC の CDatabase クラスを特定の方法で使用した場合に発生するメモリ リークの問題についてご案内します。この現象は、Visual Studio 2012 以降のバージョンに含まれる MFC で発生します。   現象 CDatabase クラスの同一のオブジェクトに対して OpenEx メソッドと Close メソッドを使用するとメモリ リークが発生し、メモリ使用量が増加し続けます。   原因 この現象は Visual Studio 2012 で追加された、CDatabase クラスの接続文字列の暗号化を行う処理に起因しています。 OpenEx メソッドで接続文字列を暗号化するためのメモリが割り当てられますが、再度 OpenEx メソッドが呼び出された際にメモリを解放せず、新たに割り当てを行っていました。 なお、弊社ではこの問題を MFC の不具合と認識しており、Visual Studio の将来のバージョンで修正を検討しています。 弊社製品の不具合によりご迷惑をおかけし、大変申し訳ございません。   対処方法 以下のいずれかの方法により、メモリ リークの問題に対処することが可能です。 同一のオブジェクトに対して OpenEx メソッドを複数呼び出さないようにする。(OpenEx メソッドで割り当てたメモリはデストラクタで解放されます。) CDatabase クラスを継承し、OpenEx メソッドを修正する。 上記 2. の具体的な実装例を以下にご案内いたします。…


Visual Studio 2015 / 2017 で発生する可能性がある _snscanf_s 関数の問題について

こんにちは、Visual Studio サポート チームです。 今回は、Visual Studio 2015 / 2017 で発生する可能性がある _snscanf_s 関数の問題とその影響についてご案内します。 この問題は以下のように Stack Overflow でも報告されておりましたが、この度、複数のお客様から弊社へお問い合わせをいただきましたので本ブログでもご紹介させていただきます。より多くの開発者様のお役に立てましたら幸いです。   VC2015で、double変数ddx_textのトラブル https://ja.stackoverflow.com/questions/16592/vc2015%E3%81%A7-double%E5%A4%89%E6%95%B0ddx-text%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB   現象 _snscanf_s 関数で浮動小数点書式を指定した場合、先頭が ‘0’ で始まる場合に終端文字 ‘\0’ が正しく扱われず、_snscanf_s 関数に指定した文字数全体に対して解析が行われます。例えば、文字配列の内容が “0\02\0” であった場合、_snscanf_s 関数で期待される結果は 0 ですが、不具合により実際には 2 が返されます。 また、MFC ライブラリの DDX_Text 関数では内部で _snscanf_s 関数を使用しているため、この問題の影響を受けて、入力した値と異なる値が浮動小数点型変数に格納される可能性があります。エディット コントロールに “0” を入力した場合、文字列バッファの “0\0” 以降の値はスタックの状態によって不定となるため、DDX_Text 関数で変数に格納される値も不定となります。   原因 Visual Studio 2015 以降で利用されている新しい C ランタイム…


Windows 10 Anniversary Update 以前の OS 上で、Visual Studio 2017 を使用して .NET Framework 4.7 アプリケーションを開発する方法について

こんにちは、 Visual Studio サポート チームです。 今回は、Windows 10 Anniversary Update 以前の OS 上で、Visual Studio 2017 を使用して .NET Framework 4.7 アプリケーションを開発する方法をご紹介します。   背景 Windows 10 Creators Update (バージョン 1703) 上で Visual Studio 2017 を使用すると、特定のパッケージなどをインストールしなくても、.NET Framework 4.7 アプリケーションを開発することが可能です。これは、Windows 10 Creators Update  には .NET Framework 4.7 が同梱されているためです。 一方、Windows 10 Anniversary Update (バージョン 1607) 以前の OS には .NET Framework 4.7…


.NET Framework のコンソール アプリケーションで STA スレッドから XmlSerializer クラスを利用する場合の注意事項

こんにちは、Visual Studio サポート チームです。 今回は、.NET Framework のコンソール アプリケーションで STA 属性を指定したスレッドから、XmlSerializer クラスを利用するなどして直接、または間接的に COM コンポーネントが利用される場合の注意事項についてご案内します。   注意事項 STA に属する COM コンポーネントを作成した場合は、COM のガイドラインに則り、対象の STA スレッドでは定期的にメッセージ ポンプを動作させてウィンドウ メッセージを処理する必要があります。メッセージ ポンプの処理を実装していないと、対象 STA の外部からは COM コンポーネントにアクセスすることができません。このため、特に .NET Framework のコンソール アプリケーションでは、ファイナライザー スレッドが対象の STA スレッドと通信できずにハング アップしてしまい、メモリ リークなどの問題を引き起こす可能性があります。 STA スレッドがメッセージ ポンプを実装する必要がある点については以下のドキュメントに解説がありますのでご参照ください。 [OLE] OLE スレッド モデルの概要としくみ https://support.microsoft.com/ja-jp/help/150777/info-descriptions-and-workings-of-ole-threading-models   具体例 .NET Framework の XmlSerializer クラスでは、コンストラクタの特定のオーバーロード (*1) を利用すると、内部でアセンブリを生成してキャッシュする処理が行われます。この処理では内部的に…


Visual Studio 2017 で Visual C++ ”14” ランタイム ライブラリをインストーラーに含めた場合に発生する問題について (2)

こんにちは、Visual Studio サポート チームです。 今回は、先日ご案内した以下の記事に関連して、新しいバージョンのVisual C++ ランタイム ライブラリをご利用される際に発生する可能性がある問題とその対処方法をご案内いたします。   Visual Studio 2017 で Visual C++ “14” ランタイム ライブラリをインストーラーに含めた場合に発生する問題について https://blogs.msdn.microsoft.com/jpvsblog/2017/06/22/vs2017-vc14-installer/   現象 作成したパッケージに含まれる Visual C++ “14” ランタイム ライブラリよりも、さらに新しいバージョンの Visual C++ “14” ランタイム ライブラリが既にインストールされているにもかかわらず、インストーラーの実行時にランタイム ライブラリのインストールが求められる。   原因 Visual C++ ランタイム ライブラリ用の Product.xml では、対象の製品がインストールされているかどうかの検証に Product Code を使用します。 この検証では、対象の Product Code の製品がインストールされているかどうかを調べますが、Visual C++ ランタイム ライブラリはアップデートごとに新しい Product Code を採番しているため、インストール対象のランタイム ライブラリよりも新しいバージョンのライブラリが既にインストールされていたとしても、それらは検出されないため、ライブラリのインストールが必要と判断される動作となります。…