問題タブ [visual-c++-2015]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
visual-c++ - XP Embedded では LoadLibrary が 0xC000001D で失敗するが、XP Pro では期待どおりに動作する
以前はVC++ 2005を使用して構築された、かなり古いインプロセスATL COMサーバーがいくつかあります。
現在、これらのプロジェクトは VC++ 2015 に移植されています。
従来の Win XP システムをサポートする必要があるため、プラットフォーム ツールセットは「VS 2015 - Windows XP」です。また、this issueに従って、/Zc:threadSafeInit-
コンパイラ オプションが設定されます。
すべてのサーバーは ATL 属性を使用して記述されており、各プロジェクトには次のようなものがあります。
問題。これらのプロジェクトはすべて WinXP Pro で問題なく動作します。しかし、それらを XP Embedded マシンに登録しようとすると、LoadLibrary
呼び出し時に 0xC000001D エラー コードが表示されます。
このエラーを修正/診断するにはどうすればよいですか?
PS これが理にかなっている場合、XP 組み込みシステムは最上位の AMD Geode プロセッサ上に構築されていますが、XP Pro システムは通常の Intel プロセッサ上に構築されています。
c++ - C4503 警告ですが、名前はそれほど長くないようです
警告 4503「装飾された名前の長さを超えました。名前が切り捨てられました」という単一の問題が発生しています。大きなプロジェクト全体で 1 つしかなく、Boost テンプレートに関する限り、これは特に長い名前ではないようです!
MSVC++ コンパイラの各バージョンは制限を拡張するため、VS2015 までには Boost MPL を問題なく処理できると期待しています。
では、比較的平凡なテンプレートの使用法であるこれ (およびこれのみ) に警告が表示されるのはなぜでしょうか? CRTP を含むクラスのスマート ポインターは、非常に長くなります。
このサイトで読んだ他の回答があるため、一般的に警告を無効にすることをためらっています。特に珍しいので、どうなっているのか知りたいです。
c++ - secure _vsnprintf_s で必要なバッファー長を取得する
MSVC の最新のセキュリティ更新プログラムに準拠するように「レガシー」コードを更新しようとしていますが、 から_vsnprintf
への移行で問題に直面してい_vsnprintf_s
ます。
具体的には_vsnprintf
、null バッファーとカウント/長さのゼロで呼び出し、結果を取得し、必要なサイズ ( ) のバッファーを割り当ててから、新しく割り当てられたバッファーと既知の正しいサイズで再度return value + 1
呼び出していました。_vsnprintf
この動作は、MSDN で文書化されています。
count で指定されたバッファー サイズが、format と argptr で指定された出力を格納するには十分に大きくない場合、vsnprintf の戻り値は、count が十分に大きい場合に書き込まれる文字数になります。戻り値が count - 1 より大きい場合、出力は切り捨てられています。
で同じことをしようとしています_vsnprintf_s
が、そのドキュメントには同じが含まれていません。代わりに言う
データを格納するために必要なストレージと終端の null が sizeOfBuffer を超える場合、count が _TRUNCATE でない限り、パラメーターの検証で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 1 が返されました。
とにかく次の方法で試してみてください:
これにより、「長さ」がゼロになります。_TRUNCATE
代わりに (-1) をカウントとして渡すと、次のアサーションは失敗します。
式: buffer != nullptr && buffer_count > 0
オーバーライド_set_invalid_parameter_handler
して、どうにかして長さを調べることは可能だと思いますが、もっと簡単な方法が必要ですか?
floating-point - 浮動小数点数を丸める方法は? C++/CLI - VS2015
a、b の2 つの浮動小数点数があるとします。aの値をbに割り当てる必要があります。次に、bは関数によってテキスト文字列に変換されますが、これは変更できません。変換は、浮動小数点数の最初の 3 桁を丸めずに取得することによって行われ、他のポイントは無視されます。これは精度の低下につながります。
質問:変換後にbが丸められた場合のようになるように、 a の値を変更するにはどうすればよいですか?
問題を説明できたことを願っていますが、そうでない場合は教えてください。
c - Visual C++ 2015 の /GL (プログラム全体の最適化) および /OPT:REF (参照の最適化) により、静的初期化子が呼び出されなくなります
はじめに: C++ のグローバルな静的オブジェクトは、main()
開始前に初期化されます。検討:
および割り当てが開始前に実行されるglob = 1
ため、出力はです。コードの順序は関係ありません。calc_it()
main()
ここで、そのようなコードを含む複数のソース ファイルがあり、さらにそれらが相互に依存していると想像します (何らかの理由で、特定の実行順序が必要です。それが良い設計か悪い設計かについては触れません)。
実行の順序は標準では定義されていませんが、Visual C++ でそれらに特定の順序を課す方法は存在します。グローバルな静的オブジェクトの場合、オブジェクト定義の前に使用#pragma init_seg(SECTIONNAME)
して、特定のセクション名を指定できます。
しかし、最終的にこれは、コンパイラ(__cdecl *)(void)
が特定のリンカ セクション (すべて で始まる.CRT$XC
) の関数へのポインタを配置することにつながるだけです。セクション名は、リンカーによってメモリ レイアウトが決定される前に、辞書順に並べられます。デフォルトのセクション名は.CRT$XCU
. 次に、C/C++ の初期化コードは、 と の間のこれらのセグメントの内容を関数へのポインター.CRT$XCA
と見なし、.CRT$XCZ
それらを 1 つずつ呼び出します。
#pragma data_seg(SECTIONNAME)
これは、ディレクティブを使用して手動で行うこともできます。したがって、この:
出力します:
それはどれほどいいですか?:)
問題の説明:
私の知る限り、Visual C++ 2015 以降、/GL
オプション (プログラム全体の最適化) を/OPT:REF
リンカー オプション (未使用の関数とデータを削除する) と一緒に使用すると、これは機能しなくなります。その理由は、リンカの観点から、_init_ptr
が使用されないことが原因である可能性があります。古いバージョンの Visual Studio では、使用されていないデータは削除されず、使用されたコードのみが削除されるため、これは機能していました。
質問:単一のシンボルのみでこれを回避するにはどうすればよいですか?
visual-studio - Visual Studio の汚染からソース コード ファイルを抽出するにはどうすればよいですか?
ソース コードが存在するディレクトリには、*.user、*.vcxproj などの Visual Studio 関連のファイルもあります。そしてDebug
フォルダRelease
。
プロジェクト ディレクトリのレイアウトを次のように変更したいと思います。
たとえば、プロジェクトの名前は ProjectX です。
ProjectX のメイン フォルダーには、次の 2 つのサブフォルダーしかありません。
ProjectX/ソース
ProjectX/ビルド
ProjectX/Source には、すべてのソース コード ファイルがありますが、他には何もありません。
ProjectX/Build には、すべての Visual Studio 関連ファイルがあります。
どうすればいいですか?
c# - Windows 7 から 10 へのアップグレード後の VC2015 再頒布可能パッケージ (更新なし、更新 1、更新 2) の確認
Visual C++ 2015 x86 再頒布可能パッケージが必要な DLL を読み込んで呼び出す前に、それがインストールされているかどうかを確認するソフトウェアがあります。MsiQueryProductState
チェックは、次の宣言を使用して、への相互運用呼び出しを介して行われます
そして呼び出しは
これは以前は機能していましたが、Windows 10 と元の更新されていない再配布可能ファイルがインストールされている他のマシンでも機能します。
C# Windows デスクトップ開発用の Update 2 で VS2015 を使用します。これには、再配布可能な Update 2 が含まれています。
数週間前、Windows 7 を Windows 10 にアップグレードしたところ、昨日、チェックが戻るから戻ってきたことがわかりましINSTALLSTATE_DEFAULT
たINSTALLSTATE_UNKNOWN
。アップグレード後に初めてわかったので、これが問題と関係があるかどうかはわかりません。
グーグルで検索しても何も見つからなかったので、レジストリと再配布可能なインストール ログ ファイルを検索したところ、次のキーが見つかりました。
しかし、私がそれを正しく行っているかどうかは、まったくわかりません。最初の 2 つが返さINSTALLSTATE_UNKNOWN
れ、後の 2 つが返されINSTALLSTATE_DEFAULT
ます。これは機能しますが、それが正しいかどうかはわかりません。すべてのバージョンと更新で同じキーが使用されると思いました。
だから、私が尋ねようとしている質問は、Visual C++ 2015 x86 Redistributables の互換性のあるバージョンがインストールされているかどうかを知るために、どのキーを照会する必要があるかということです。