問題タブ [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.
windows - WindowCRTを使用して生成されたプロセスの停止を検出する
エグゼクティブサマリー:_spawnlを介して生成し、_pipeからFDを使用して通信しているWindowsプロセスが停止したかどうかを判断する方法が必要です。
詳細:
Windowsの低レベルCRT関数(_eof、_read)を使用して、(P_NOWAITを使用した)_spawnlの呼び出しを介して生成されたプロセスと通信しています。_pipeを使用して、この生成されたプロセスと通信するファイル記述子を作成し、それらの記述子(FD#)をコマンドラインで渡します。
スポーンされたプロセスを制御していないことは言及する価値があります。それは私にとってブラックボックスです。
スポーンしているプロセスがときどきクラッシュすることがわかりました。クラッシュを検出することで、コードをこれに対して堅牢にしようとしています。残念ながら、これを行う方法がわかりません。プロセスが停止した場合、これらの記述子の1つで_eofまたは_readを呼び出すと、エラーステータス(-1)が返されると予想するのは妥当なようです。
残念ながら、そうではありません。記述子には、生成されたプロセスとは独立した独自の寿命があるようです。そのため、もう一方のプロセスが停止していても、通信に使用しているファイル記述子にエラーステータスは表示されません。
ネストされたプロセス(_spanwnl呼び出しから返される)のPIDを取得しましたが、それを使用して実行できることは何も表示されません。私のコードは、1つを除いて本当にうまく機能します。生成されたプロセスが単に答えを計算するのに忙しいのか、それとも死んだのかを検出できません。
_pipeと_spawnlからの情報を使用して、生成されたプロセスが停止しているかどうかを判断できれば、私は金色になります。
提案は大歓迎です。
前もって感謝します。
更新:私はかなり単純な解決策を見つけ、それを選択された答えとして追加しました。
linker - VS2005 で MDd dll を使用する MTd プロジェクトをビルドする方法
プロジェクト プロパティ ->c/c++ ->CodeGeneration ->RuntimeLib: MTd (静的 CRT ライブラリ LIBCMTD を使用) を使用して、Visual Studio 2005 でアプリケーションをビルドしています。アプリケーションは、MDd に組み込まれているサードパーティの dll とライブラリを使用しています (動的 CRT lib-MSVCRTD を使用)。
MSVCRTD.lib(MSVCR80D.dll): error LNK2005: __mktime64 already defined in LIBCMTD.lib(mktime64.obj) MSVCRTD.lib(MSVCR80D.dll): error LNK2005: __gmtime64 already defined in LIBCMTD lib(gmtime64.obj) MSVCRTD.lib(MSVCR80D.dll): エラー LNK2005: __localtime64 はすでに LIBCMTD.lib(loctim64.obj) で定義されています
サードパーティの設定を変更できません。CRT ライブラリを動的に使用すると、アプリケーションは正常に動作しますが、これを変更することはできません。
ありがとう
c++ - VC++ ランタイム ファイルを配布する正しい方法
展開用にパッケージ化しようとしている MFC アプリケーションがあります。ファイル「msvcr90.dll」、「msvcp90.dll」、「mfc90.dll」に依存しているようです。これらのファイルを配布する正しい方法は何ですか?
インストーラーがマージ モジュールをサポートしていないため、マージ モジュールを使用できません。VCRedist_x86.exe を実行できることはわかっていますが、さまざまな理由から実行したくありません。
私の唯一の代替手段は、ファイルを Private Side-by-Side アセンブリとしてインストールすることです。これは正しいです?
http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspxによると、プライベート アセンブリをインストールする正しい方法は、「Microsoft.VC90.CRT」と「Microsoft.VC90」をコピーすることです。 .MFC' フォルダーを実行可能ファイルと同じフォルダーに移動します。これは問題を解決する正しい方法ですか? 動作しますが、この方法でシステム ファイルをコピーするのは 1990 年代のようです。これを行う別のアプリケーション (または少なくともデモ プロジェクト) の例を誰かに見せてもらえますか?
最後に、アプリケーションの .manifest ファイルの配布について心配する必要があるのはいつですか? XML ファイルを明示的にインストールする必要がありますか、それとも何らかの形で実行可能ファイルに埋め込まれていますか?
visual-studio-2005 - StaticCRT(LIBCMT(D)) と DynamicCRT(MSVCRT(D)) の競合
サードパーティの dll とライブラリを使用するプロジェクトを開発しています。「IBM purifier」でアプリケーションを実行したいので、静的 CRT (LIBCMTD) を使用してプロジェクトをビルドしたいと考えています。ただし、サードパーティのライブラリは動的 CRT (MSVCRT) を使用して構築されています。
これにより、次のようなリンク エラーが発生します。 gmtime64.obj) MSVCRTD.lib(MSVCR80D.dll): エラー LNK2005: __localtime64 はすでに LIBCMTD.lib(loctim64.obj) で定義されています
さまざまなリンカー設定を試しました。また、リンカー コマンド ラインに /FORCE:MULTIPLE を指定して、複数の定義を無視してビルドを作成しました。そうしましたが、私のアプリケーションはまだ浄化装置で実行できませんでした。
私が達成しようとしていることを行う良い方法はありますか? サードパーティのソース コードを制御して、その設定を制御することはできません。
ありがとう
visual-studio-2008 - XCopy を使用して Visual C++ ライブラリをデプロイする際の問題を知っている人はいますか?
Visual C++ ライブラリをデプロイする必要があります。Merge Modules を使用してこのライブラリをデプロイしようとしましたが、アンインストールが非常に遅くなりました (約 10 ~ 20 分)。そこで、 XCopy メソッドを使用してこのライブラリをデプロイすることにしました。XCopy を使用して Visual C++ ライブラリをデプロイする際の問題を知っている人はいますか?
windows-server-2008 - Windows Server 2008 x64 で reg.exe の名前を変更すると実行に失敗するのはなぜですか?
ここできちんとした質問があります。
かなり前から Windows に同梱されている reg.exe というユーティリティがあります。スクリプトから .reg ファイルをインポートしたり、スクリプトから値を変更したりするのに非常に便利です。そのため、スクリプト シナリオ用にコピーを作成する場合 (「system32 でコピーを使用しない理由は?」 -> ソフトウェア制限ポリシー、個人設定、など)名前を変更すると、サイレントに失敗することに気付きました:
Windows Server 2008 x64:
ただし、Windows XP x86 の場合:
WinDbgは、CRTがそれを殺していると私に言っているようです:
しかし、私は WinDbg の経験があまりないので (これは 64 ビットなので、Ollydbg は失敗します)、私はここで途方に暮れています。皆さんが持っている情報をありがとう。
編集
CyberShadow のヘルプと少しのグーグル検索のおかげで、解決策が見つかりました。現在インストールされている言語のサブフォルダーで .mui (翻訳) を探します。
static - ヘルプ デッドロック分析
パラメータ DLL_THREAD_DETACH を使用して DLLMain エントリ ポイントから呼び出された関数でローカル静的変数の初期化が発生すると、アプリケーションでデッドロックが発生します。
以下はWindbg分析です
これは通常、別のスレッドがローダー ロックを保持していることが原因です。
以下は、保持されているロックです。
CritSec ntdll!LdrpLoaderLock+0 (7c97e178)
ロックカウント 3
再帰回数 1
所有スレッド 17e8
EntryCount d
ContentionCount d
*** ロックされています
CritSec MSVCR80!__app_type+94 で 781c3bc8
ロックカウント 1
再帰回数 1
所有スレッド 1100
エントリ数 1
ContentionCount 1 *** ロック済み
#呼び出しスタック スレッド 17e8
781c3bc8 78132bd9 0777fde4 ntdll!RtlEnterCriticalSection+0x46
00000008 b87d2630 00000000 MSVCR80!_lock+0x2e
0864ae10 08631d7f 0864ae10 EPComUtilities32!_onexit+0x36
0864ae10 b87d2588 00000001 EPComUtilities32!atexit+0x9
0777fea8 0864719f 08630000 EPComUtilities32!XCriticalSectionEx::ThreadTerminated+0x5f
08630000 00000003 00000000 EPComUtilities32!DllMain+0x20
08630000 7c90118a 08630000 EPComUtilities32!__DllMainCRTStartup+0x7a
08630000 00000003 00000000 EPComUtilities32!_DllMainCRTStartup+0x1d
#コール スタック スレッド 1100
000000b0 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc
000000b0 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xa8
000000b0 ffffffff 06ce64e0 kernel32!WaitForSingleObject+0x12
000480ba 000f4240 00000000 CATSysMultiThreading!CATThreads::Join+0xf5
0012fcc8 00000004 00000000 JS0GROUP!CATLM::StopHB+0xf4
d138509f 00416694 00000001 JS0GROUP!CATLM::Unmake+0x6b
00000000 00000000 00000000 MSVCR80!_cinit+0xd6
00000000 0012fd6c 081e68d9 MSVCR80!exit+0xd
00000000 06d404f0 0998fb90 JS0GROUP!CATExit+0x1d
00000000 004ef366 0000000d DNBPLMProvider!DNBEPLMTransactionMgt::OnApplicationExit+0x229
00000000 0012fd9c 004eabfc JS0GROUP!CATCallExits+0x2bc
00000000 0012ff7c 0040cefd JS0GROUP!CATErrorNormalEnd+0x31 00000000 06ce71d0 06ce71d0 JS0GROUP!CATExit+0xc
00000007 06cdb120 059b61d8 DLMMfgContextSolver!main+0x146d
ffffffff ffffffff bffde000 DLMMfgContextSolver!__tmainCRTStartup+0x10f
#デッドロックの原因を理解するためにコメントをお願いします。注:静的変数を非静的にする瞬間、問題はフォーラムに投稿された例のコンテキストで消えます関数スコープの静的変数でデッドロックが発生します(VC ++ではスレッドが安全ではありません)
c++ - CRTを使用せずにdoubleを文字列に変換する方法
私の質問は実用的ではありません。ただ興味があります。あるがdouble値を持っていて、printf
関数と同様にその文字列表現を取得したいとします。Cランタイムライブラリなしでそれを行うにはどうすればよいですか?私がx86アーキテクチャを使用しているとしましょう。
solaris - solaris 7 のランタイム ライブラリ crti.o はどこにありますか?
Solaris 10 の /usr/lib に crti.o crt1.o crtn.o が存在することは知っていますが、Solaris 7 にはこれらのファイルがありません。
visual-studio-2008 - Windows Update で dll が壊れる?
複数の DLL を使用し、VS2008 でコンパイルするプロジェクトをコンパイルしています。最近の Windows Update の後、コンピューターでコンパイルされた DLL が他のコンピューターで動作しなくなりました。
いくつかの調査の結果、私がコンパイルしている CRT 再頒布可能ライブラリがバージョン「9.0.21022.8」からバージョン「9.0.30729.4148」に更新されたことが判明しました。
これは、コンパイルしている EXE のマニフェスト ファイルから明らかです。次の内容が含まれます。
つまり、2 つの異なるバージョンの CRT を同時に使用したいということです。2 番目のバージョンは、現在コンパイルしているコードに必要であり、最初のバージョンは、数週間前にコンパイルされた古い dll に必要です。
アプリケーションが展開されているコンピューターでは、Microsoft.VC90.CRT
WinSXS からではなく、ローカル フォルダーから CRT dll を取得するため、これが問題になります。このフォルダーに 2 つの異なるバージョンの dll を含めることはできません。
この問題に対する既知の解決策はありますか?それとも、新しい CRT を使用して他のすべての DLL のコンパイルを開始する必要がありますか?