問題タブ [msvcrt]
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.
c++ - DBGHelp.dllは、デバッグバージョンでmsvcrt.dllのロードを引き起こします
私のアプリケーションはVC6sp6でコンパイルされ、DBGHelp.libを使用してスタック情報を取得します。コードは、デバッグとリリースのコンパイルで類似しています。問題は、デバッグバージョンを実行するときに、DBGHelp.dllがmsvcrt.dll(リリースバージョン)をロードすることです。msvcrtd.dllは、とにかく私のデバッグリンクによってすでにロードされています。そのため、デバッグバージョンのプロセスにmsvcrtd.dllとmsvcrt.dllの両方が含まれることになります。dspはデフォルトのライブラリをロードするように設定されており、msvcrt(d).libは直接言及されていません。DBGHelp.dllを使用するコードを取り出し、dspリンクリストからDBGHelp.libを削除すると、msvcrt.dllがロードされません。
これを修正するにはどうすればよいですか?
デバッグの実行にはmsvcrtd.dllのみが必要です。
デバッグ用の特別なバージョンのDBGHelp.dll(msvcrtd.dllを使用する)はありますか?
visual-studio-2008 - 複数のCRT:Visual Studio 2008は、VC80とVC90の両方のCRTへの明示的な依存関係を持つDLLを作成します
オープンシーングラフプラグインのデバッグビルドを正しくロードできない理由を調査してきました(エラーコード14001、ERROR_SXS_CANT_GEN_ACTCTX)。多くのグーグルを行った後、問題は、たとえば、freetypedebugdllにVC90とVC80の両方のデバッグcrtsに依存するマニフェストがあることであることがわかりました。
Visual Studio 2008(cmakeで生成)を使用してDLLを最初から作成したので、VC80デバッグcrtへの依存関係が存在する理由は考えられません。また、VS 2005がインストールされていないため、そのためのデバッグCRTがなく、再配布することは違法であるため、これを理解する必要があります。
dllで依存関係ウォーカーを使用すると、私が見つけた唯一のcrtdllは
- msvcr90d.dll
- msvcp90d.dll
- msvcrt.dll
ここでは、vc80crtsへの参照はありません。それで、それはどこから来るのですか?
これはdllのマニフェストです。
追加情報:
リンカーコマンドライン:
マニフェストコマンドライン:
windows - ユーザーがインストールした可能性が高いVisualC++ランタイムは何ですか?
ユーザーがインストールした可能性が高いVisualC++ランタイムは何ですか?
更新:この質問は、「C++で記述されたインターネットベースのアプリケーションを展開するための最良の方法は何ですか。MicrosoftVisualC++ランタイムが必要です」という質問になりました。
assemblies - XP の vc2005 混合モード DLL で FileLoadException を引き起こす CRT 依存関係を修正するにはどうすればよいですか?
Visual Studio 2005 でビルドされた混合モードの DLL があります。Dependency Walker で、私の DLL は次の CRT DLL の依存関係を示しています。これは私の Windows 7 開発マシン上にあることに注意してください。
c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5\MSVCP80.DLL
"\MSVCR80.DLL
"\MSVCM80.DLL
8.0.50727.4927
Visual Studio 2005 を使用している私の Windows 7 開発マシンでは、これは正常にコンパイルおよび実行されます。問題は、最新の CRT がインストールされている Windows XP テスト マシンで実行できないことです。
DLL を XP マシンの depenency walker にドラッグすると、\System32 で DLL を検索しているようです... (フル パスを表示しようとしたところ、それらのパスはなく、黄色の感嘆符だけでした)
問題は、WinSxS の crt のこのバージョン (ビルド 4927) が XP テスト マシンにインストールされていないことです。最新の CRT がインストールされた Visual Studio 2005 (sp1?) があります。
8.0.50727.4053は、MSDN で見つけた最新バージョンです。
これは SO に投稿された最もエキサイティングな質問ではないことを認識していますが、この 4927 ランタイムがどうなっているのか知っている人はいますか?
* 編集 *
MT.exe によって生成されたマニフェスト:
したがって、ターゲットとしている 3 つの異なるバージョンがあります...
c++ - MS Visual C++ ランタイム ライブラリ - 何のために?
MS Visual C++ ランタイム ライブラリには何が含まれていますか? つまり、私はそれをグーグルで検索しましたが、常にヘルプのようなものを見つけました.app xxxxは、説明なしでMS Visual C++ランタイムライブラリエラーを表示します.
Windows C ランタイム ライブラリは Windows に付属していると思いましたか? VC++ ではありませんか? ありがとう。
編集:まず、答えてくれてありがとう。私は今、Windowsのランタイムライブラリについて悪い考えを持っています。つまり、最初の部分では、Windows が内部的に win32 API を持っているので、それはわかっていました。また、その Win32API はカーネルおよびユーザー部分からのものです。
しかし、私は常に、GDI のような関数は DLL としてアクセスされると考えていました (今でもそう信じています)。printf
しかし、いくつかのWindowsファイルには や のような機能もあると思いました。
だから、私が知っているとき、「単純な」関数はprintf
直接リンクする必要があり、OS のカーネル部分のみを直接使用する必要がなく、より洗練された Windows API 関数は dll としてリンクされているため、コンパイラで配布されていませんが、 OSと?その後、カーネルにアクセスしますか?
つまり、GDIに絵を描くように指示すると、ユーザーモードですべてのハードワークが行われ、すべてをフレームバッファに入れるカーネル関数を呼び出すよりも?
そして最後に考えたのは、なぜこれがこのように解決されるのでしょうか? つまり、VC++ ランタイムが C と WinAPI の間のレイヤーにすぎない場合、なぜ VC++ は直接 WinAPI を呼び出せないのでしょうか?
c++ - 一定量のバイトが割り当てられたときに中断する
_CrtDumpMemoryLeaks();
知らなかった場合は、プログラム内のすべてのメモリリークをダンプする関数です。私は現在、3632062バイトのメモリリークがあることを示しています(割り当てが解除されていません)。
私は疑問に思っていました:特定のバイト数が割り当てられたときにVisual C ++ Expressを壊す方法はありますか?そうすれば、3632062バイトが割り当てられたときに中断し、スタックトレースを読み取って、どこに割り当てたかを確認できます。
これは現在、メモリが割り当てられている場所を見つけるために私が考えることができる唯一の方法であり、それを修正することができます。私は自分のコードをたくさん検索してきましたが、リークがファイルに関連していることは確かですが、3632062バイトを割り当てる必要がある場所を見つけることができません(ロードするファイルは2767136バイトだけなので)。 mで動作しています。
メモリリークの原因を見つけるためのアイデアはありますか?ネイティブC++、Visual C++2010を使用しています
c++ - msvcrt.dll を初期化する方法は?
LoadLibrary("msvcrt.dll") を実行する場合、何らかの方法で CRT を初期化する必要がありますか? 次のドキュメントのセクション 2 は、そうしているように見えますが、_CRT_INIT を呼び出そうとすると、_CRT_INIT の未定義シンボル エラーが発生します。
http://support.microsoft.com/kb/94248
編集:これは、使用するすべての dll を動的にロードするプログラム用であると言うべきだったので、LoadLibrary("msvcrt.dll") を呼び出します。
winapi - (移植性は別として) malloc と HeapAlloc の間に根本的な違いはありますか?
さまざまな理由から、C ランタイムから Windows ヒープ API を使用するランタイムに移植しようとしているコードがあります。問題が発生しました: malloc
/ calloc
/ realloc
/free
呼び出しをHeapAlloc
/ HeapReAlloc
/ HeapFree
(GetProcessHeap
ハンドル用) にリダイレクトすると、メモリは正しく割り当てられているように見えます (不良ポインターが返されず、例外もスローされません)。移植すると、何らかの理由で「メモリの割り当てに失敗しました」と表示されます。
Microsoft CRT (下でヒープ API を使用) と別の会社のランタイム ライブラリ (下でグローバル メモリ API を使用) の両方でこれを試しました。これらの両方の malloc はライブラリでうまく機能しますが、何らかの理由で、ヒープ API を直接使用すると機能しません。
割り当てが大きすぎないこと (>= 0x7FFF8 バイト) を確認しましたが、そうではありません。
私が考えることができる唯一の問題は、メモリの配置です。そうですか?またはそれ以外に、私が認識していないヒープ API と CRT メモリ API の根本的な違いはありますか?
もしそうなら、それは何ですか?そうでない場合、静的なMicrosoft CRT (Visual Studio に含まれています) がmalloc
/calloc
を呼び出す前に追加の手順を実行するのはHeapAlloc
なぜですか? 違いがあるのではないかと思いますが、それが何であるかはわかりません。
ありがとうございました!
c - VC2010 で Python 拡張機能をコンパイルする
拡張機能として Python 2.7 に公開したい C++0x で書かれたコードがいくつかあります。
いくつかの C++0x 機能を使用しているため、C++03 で書き直したくないので、VC2010 を使用せざるを得ません。ただし、デフォルトの Python 2.7 インストールは VC2008 でコンパイルされています。
distutils に強制的に VC2010 を使用させる方法を説明しているこの投稿を見つけましたが、これにより msvcr90.dll (インタープリターによってリンクされている) と msvcr100.dll (拡張によってリンクされている) の間で DLL の衝突が発生するというコメント投稿者がいます。
Python を再コンパイルせずに VC2010 で拡張機能をコンパイルする方法はありますか?
(私は最近 Windows でプログラミングを始めたばかりなので、そこで動的リンクがどのように機能するかを正確に理解していません)
visual-studio - 読み込まれている C ランタイム ライブラリ (CRT) のバージョンは?
Windows 7 を実行している 2 台のコンピューターに異なるバージョンの CRT が読み込まれていることが原因ではないかと思われるエラーが発生しました。
私のプログラムは、別の EXE によってロードされる DLL です。Visual Studio 2008 SP1 を使用してコンパイルされています。