問題タブ [crt]

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.

0 投票する
2 に答える
2382 参照

c++ - 問題が見つかりました: Visual Studio CRT ライブラリ: FLS_GETVALUE

今日、Visual Studio 2008 と 2010 の CRT ライブラリのソース コードを調べていたら、mtdll.h ファイルにバグが見つかりました。問題はマクロ FLS_GETVALUE にあります。x86 システムでは、このマクロは、変数 gpFlsGetValue に割り当てられた関数を呼び出す代わりに、TlsGetValue を直接呼び出します。

まず第一に、FlsAlloc、FlsGetValue、FlsFree、および FlsSetValue がすべてのシステム (Windows Vista 以降および Windows Server 2003 以降) で使用できるわけではないため、これは問題です。これらの関数は、TlsAlloc、TlsGetValue、TlsFree、および TlsSetValue のように動作しますが、ファイバー (一種のユーザー スレッド) をサポートします。Tls 関数の代わりに Fls* 関数を使用する必要があるため、VS の C ランタイム ライブラリは、プロセスまたは dll がロードされたときに Fls 関数が使用可能かどうかをチェックし、gpFls* 変数を初期化します。Fls* が利用できない場合、CRT はこれらの変数を同等の Tls* 関数で初期化します。

ランタイム ライブラリによって内部的に使用されるため、マクロ FLS_GETVALUE をコード内で直接使用することはできません。ランタイムは、このマクロを使用して、ランタイム ライブラリのスレッド データごとに初期化します。

私の質問は、このバグの影響についてです。ファイバーが広く使用されていないことは承知していますが、ファイバーを使用するアプリケーション内で使用される DLL を開発すると、どのような影響がありますか? このバグはアプリケーションのクラッシュを引き起こす可能性がありますか、それとも誤った結果しか生成しませんか? この問題は、SQL Server のような広く使用されているアプリケーションで問題を引き起こす可能性がありますか? どう思いますか?このバグはセキュリティ上のリスクになる可能性がありますか? IIS または ASP.Net は、クラッシュの原因となるファイバーを使用していますか?

好奇心旺盛な人のために、mtdll.h の問題のある行の現在のソースを以下に示します。

#define FLS_GETVALUE ((PFLS_GETVALUE_FUNCTION)TlsGetValue(__getvalueindex))

以下は、マクロ FLS_GETVALUE の修正版です。

#define FLS_GETVALUE (((PFLS_GETVALUE_FUNCTION)DecodePointer(gpFlsGetValue))(__getvalueindex))

今のところ、Microsoft にバグを送信する方法を見つける必要があります。

0 投票する
1 に答える
321 参照

msvcrt - Vista (SP2) 64 ビットの場合: C/C++ ランタイム (CRT) アセンブリ キャッシュがアプリに表示されないのはなぜですか?

VC++ および Windows のエキスパートの皆様、こんにちは。;)

まず、私のバックグラウンド: Vstudio、C & C++、Windows。あらゆる種類の可能性、フォーラム、修正、さらには O/S プラットフォームの変更を 5 日間試した後、ここに投稿する (またはウィンドウから飛び出す!) ことにしました。私の実際の開発作業を保持 !! . :)

Soo.. シナリオ: 問題が発生している開発マシン: OS: SP2 を適用した Windows Vista 64 ビット (ただし、VMWare を使用して実行している 32 ビット XP SP2 仮想マシンで同じ問題が発生しています。開発 IDE: SP1 を適用した Visual Studio 2008出力 Binary type: .DLL (開発用のプラグインになる運命です。IDE は RealStudio と呼ばれます)

問題/問題: VStudio 2008 を使用して 32 ビット C++ DLL を開発しています。これには、ASDCP (オーディオ/ビデオ コーデック処理に使用される) と呼ばれる中規模から大規模な C++ ライブラリが含まれます。 Win32、Linux、MacOS などでビルドするためのビルトイン サポート。

現在、ASDCP ライブラリは C++ 標準ライブラリ (MSVCP90.dll および .lib ファイルに格納されています) を利用しています。そのため、独自のプラグイン (DLL) を作成し、ASCP ライブラリを使用せずに呼び出し元アプリ (RealStudio、別の開発 IDE と呼ばれる) を許可すると (したがって、C++ 標準ライブラリがリンクされる必要はありません)、正常に動作します。 . しかし、ASDCP ライブラリからコードを追加し、C++ ランタイム ライブラリの STATIC Link(/MT) を選択してから、プラグインをロードして RealStudio を実行すると、メモリ リークが発生し、おそらく「アクセス違反」が発生します。おそらく、さまざまな DLL 間の不一致が原因です。


さて、この投稿に対する私の質問は、VStudio 2008 で CRT を動的にリンクしてから、RealStudio を実行してプラグインを読み込もうとすると、Microsoft.CRT の Side-by-Size ASSEMBLY CACHE を見つけることができないということです。 .VC90!! すべてのマニフェスト ファイルを操作し、マニフェスト ファイルを DLL に埋め込み、WinSxs アセンブリ キャッシュ内の CRT のバージョンを (約 10 回!) チェックし、マニフェスト ファイル/依存関係のニーズに対応しました。

しかしどういうわけか... RealStudio (RunAs Admiistrator) が CRT 9 DLL (特に MSVCP90.dll) をロードできません。私は MSDN や他のフォーラムで約 15 時間を費やして、同様の問題や解決策を検討し、Microsoft のフォーラム モデレーターが推奨する解決策を実装しました。しかし、役に立たない。

では、関連する CRT 依存関係の Assembl キャッシュを「参照」してロードするために、64-Windows (Vista SP2) で実行される 32 ビット C++ DLL をどのように取得しますか??????

ヘルプ!?!?!お願いします..

私が再び正気になるのを助けてくれて、前もって深く感謝します!

ディネシュ

0 投票する
2 に答える
140 参照

c++ - 別の CRT ライブラリで std::clog を再ルーティングする方法は?

私は VS2008 でビルドされた Win32 プログラムを持っているので、私のコードは MSVCR90.DLL と MSVCP90.DLL にリンクされています。ただし、VS2005 でビルドされた DLL (私は変更できません) でコードを実行しており、その DLL のコードが clog ストリームに出力されると、MSVCR80.DLL および MSVCP80.DLL を介して実行されます。問題は次のとおりです。コードで std::clog を再ルーティングすると、crt 9.0 ライブラリに対してビルドされたコードにのみ影響し、古い crt 8.0 を使用するコードでは出力が再ルーティングされません。古い CRT に対してビルドされた DLL で clog ストリームを再ルーティングする方法はありますか?

古い CRT DLL での GetModuleHandle() と GetProcAddress() の呼び出しを調査し、(_open_osfhandle と _dup2 を介して) C stderr ストリームを再ルーティングすることに成功しましたが、C++ の詰まりストリームはまだ影響を受けていないようです。古い CRT ライブラリで ios_base::sync_with_stdio() も呼び出す必要があると思いますが、その関数への有効なアドレスを取得できませんでした。どんな助けでも大歓迎です。

ありがとう。

0 投票する
2 に答える
4144 参照

c++ - VS 2008 で _osfile() を呼び出す CRT のアサーション エラー?

長い間機能している C++ コード ベースがあります。コード ベースは、私が最近 VS 2008 に移行した従来の VS 2003 プロジェクト セットでした。結果のプログラムがビルドされ、実行されるという点で、移行は成功したように見えました。

OS とすべてのアプリケーションを新しいドライブに再インストールしましたが、デバッガー内でプログラムをデバッグしようとすると、CRT 内でアサーション エラーが発生しますchsize(実際には_chsize_s)。具体的には(安全チェックを無視して、必需品にトリミング):

デバッグ アサーションはchsize、具体的には CRT のソース コード ファイル chsize.c 内の次の行で発生します。

...どこにfiledes一致しますかfilehandle

一部のサードパーティ ライブラリでは再配布可能な VS 8.0 が必要なため、新しいシステム (VS 2008 のみ) に古いバージョンの VS がインストールされていないことが原因で問題が発生する可能性があると考えました。 VS 2008を使用しても問題ありません。したがって、VS 2005をインストールしました(2003ではありません)。ただし、問題は引き続き発生します。

どんな提案でも大歓迎です。

*更新 - この問題は とは無関係chsizeです。以下の私の答えを見てください。

0 投票する
3 に答える
1064 参照

c - 他のdllからのCRTのインスタンスからのCRTチェックを抑制または傍受します

私のプログラムはいくつかのdllをロードし、それらの関数を呼び出します。dllは、さまざまなバージョンのCRTを使用できます。

Cランタイムは、引数の有効性をチェックして問題を見つけると、無効なパラメーターハンドルを呼び出します。これにより、[送信-送信しない]ダイアログの有無にかかわらず、アプリケーションが閉じられます。

* _set_invalid_parameter_handler *を呼び出してみましたが、不正なdll内から呼び出された場合にのみ機能します。SetErrorModeを試しましたが、ダイアログなしでプロセスを強制終了することができました。

それらの例外を処理する方法はありますか?一部のリソースが危険にさらされてもかまいません。私が欲しいのは、ユーザーが構成を保存できるようにすることだけです。ダイアログが表示されたら、それをクリックしてプロセスを強制終了します。


編集 すべてのバージョンのCRTをロードするか、すべてのDLLを列挙するソリューションは失敗します。すべてを明確にするために、これは遊ぶための小さな例です:

これが私のメインアプリケーションになります(ファイルapplication.cと呼びましょう):

このアプリケーションは、悪いことをするdllをロードします(それは私によって開発されていないので、そこでバグを修正するように指示する解決策を受け入れません)。そのファイル拡張子を呼び出しましょう。c 。

コンパイルするには、次のようにします。

問題は、関数fixMyProblem()で何をするかです。これにより、XPで送信/送信しないダイアログが表示されないか、アプリケーションが7でダイアログの動作を停止します

David Gladfelterによると、私はやるべきです

また、利用可能なバージョンCRTごとにこれを実行します。1つのバージョンのCRT(exeとdllの両方に同じものを使用しています)を使用しても、機能しないことがわかりました。どちらも同じバージョンのCRTを使用していますが、同じCRTを使用していないようです。

この場合、変更する必要があるものはDLL内にあると思います。もちろん、* _set_invalid_parameter_handler*はエクスポートされません。

しかし、David Heffernanに公平を期すために、彼のソリューションの実装は次のとおりです。

このテストではなく、実際のアプリケーションでは、1つのdllが修正されました(msvcp90.dll)。それでも私の問題は解決しません。

これを解決するために助けていただければ幸いです。

0 投票する
1 に答える
81 参照

ssl - csrを生成して送信した後、sslキーのパスコードを削除できますか?

生成されたSSLキーのSSLパスコードを削除したいのですが、パスコード化されたキーからCSRをすでに生成しています。パスコードを削除した場合、CSRを再生成する必要がありますか、それともパスコードされていないキーでcrtは正常に機能しますか?

0 投票する
5 に答える
457 参照

c++ - c-strings 配列を初期化する方法 (stl なし)

MSVC2010でC文字列の配列をゼロポインタで初期化したい

初期化を修正するにはarr_?STLやMFCなどは使えませんでした。

0 投票する
1 に答える
286 参照

windows - Windows で日付をロケールの文字列に変換する

これは単純なものかもしれませんが、簡単な解決策を見つけることができないようです。ロケールの完全な形式で表されるように、日付を文字列としてフォーマットする必要があります。例:

2011 年 5 月 28 日 (米国ロケールの場合)

_strftime_l(_T("%#x")) も同様のことができますが、前もって平日を追加する必要はありません。

0 投票する
1 に答える
991 参照

c# - マネージコードC#/ WPFで_CrtDumpMemoryLeaks()を呼び出す

WPFアプリケーションで_CrtDumpMemoryLeaks()を呼び出すラッパークラスを作成しています。WPFアプリケーションにC言語のDLLを読み込んでいますが、WPFがDLLのテストアプリとしても機能しているため、DLLにメモリリークがあるかどうかを確認したいと思います。

Windows XPProfessionalSP3でVisualStudio2008SP1を使用しています。不思議なことに、システムがそれを見つけることができなかったので、私はmsvcrtd.dllファイルをダウンロードしなければなりませんでした。その後、それをデバッグフォルダにコピーするだけで、アプリケーションが動作を開始しました。ただし、DLLコードでメモリを意図的に割り当てて解放しなくても、デバッグ中に出力ウィンドウにメモリリーク情報が表示されません。

また、DLLのソースコードを変更することはできません。変更しないと、これらの関数をDLLのソースコードに入れようとします。MFCアプリケーションを作成してDLL関数を呼び出してみましたが、デバッグ中のMFCが内部でこの関数を呼び出している可能性があるため、_CrtDumpMemoryLeaks()を呼び出さなくても、MFCアプリケーションがメモリリークを検出し、出力ウィンドウに表示されます。 WPFテストアプリ。

0 投票する
5 に答える
1035 参照

c++ - メイン関数が呼び出されたかどうかを確認するには?

静的変数値に依存するコードを書きたいと思います。したがって、他の静的変数コンストラクターからこのコードを呼び出す可能性を排除するために、いくつかのチェックを追加したいと考えています。そして、静的な初期化順序の大失敗を一度だけ防ぎます。例えば:

どうすればそうできますか?メイン関数が呼び出された後に関数が呼び出されたかどうかを確認する方法は?

更新: Foo オブジェクトには非常に重い初期化コードがあり、遅くなる可能性があり、例外をスローすることさえあります

更新 2: そうする生命の懸念はありません。ほとんどの場合、バー機能の前のコメントは正常に機能しました。これを手動で行うのではなく、プログラムのデバッグバージョンで不注意なプログラマーを罰するためのある種のデバッグチェックに興味があります。また、MSVC でのみ機能するクレイジーな組み込み関数の呼び出しのような非標準的な方法である可能性もあります。