2

「Windows via C++」という本に付属のコンパニオン CD-ROM からこのコードを分析していたところ、このステートメントに出くわしました。

m_hSnapshot = CreateToolhelp32Snapshot(dwFlags, dwProcessID);

dwFlagsdwProcessIDは DWORD の場所です

そして、この関数の定義にジャンプしたとき、これCreateToolhelp32Snapshotを見つけました

HANDLE 
WINAPI
CreateToolhelp32Snapshot(
    DWORD dwFlags,
    DWORD th32ProcessID
    );

体のないそのような機能がどのように存在し得るでしょうか?

コードをデバッグしようとしましたが、コンパイラはこの関数にステップ インしません。代わりに、m_hSnapshot に格納されている 0x00000754 の値を持つ最初のステートメントをステップ オーバーするだけです。

4

6 に答える 6

7

体のないそのような機能がどのように存在し得るでしょうか?

そうではありません。あなたが見ているのは単なる関数のプロトタイプです。本体は別の場所で定義されています。

于 2012-05-30T17:33:51.913 に答える
4

表示されるのは関数定義ではなく宣言です。実際の定義は、実行可能ファイルにリンクされた Windows 自体の dll によって提供されます。

于 2012-05-30T17:34:16.143 に答える
0

関数には本体がありますが、表示されていません。

宣言はそれだけです。もしそれが見えるなら、Windows はオープンソースでしょう (笑わないでください)。C++ はコンパイル済み言語です。バイナリ ファイルはコードから生成され、コード自体は関数を呼び出す必要はありません。

于 2012-05-30T17:34:03.503 に答える
0

本体は、たとえばリンクする静的または動的ライブラリ内のさまざまな場所にある場合があります。

于 2012-05-30T17:34:18.783 に答える
0

パラメータを受け入れる関数にすぎません。おそらく、ユーザーの初期化後に別の場所でメソッドによって使用されます。コマンドプロンプトに移動してプロセス表示を要求すると、実際には表示するプロセスIDのスナップショットを取得しているように見えます。

于 2012-05-30T17:34:46.467 に答える
0

はい、これは既存の Windows DLL (Kernel32.dll) で定義されている関数の単なるプロトタイプです。

于 2012-05-30T17:35:43.517 に答える