1

VC++環境内にプログラムがあるとします。このプログラムは、別のオペレーティングシステムで特定のコードを使用するために、それ自体を変更する必要があります。

たとえば、プログラムが実行するコードを変更し、実行するコードを変更AするWindows XPWindows 7しますB。ファイルにあるアクションのコードとAファイルにあるアクションのコード。"a.h"B"b.h"

オペレーティングシステムを検出することを目的とした関数があるとしましょう。OSを検出してファイルの1つだけをロードしたい場合、機能のアクティブ化などの用語でファイルを含めるにはどうすればよいですか?

4

3 に答える 3

3

あなたがそれを暴露したようにあなたはそのようなことをすることはできません。

この#includeメカニズムは、実行時ではなくコンパイル時に実行されるプリコンパイラによって処理されます。したがって、バイナリがコンパイルされると、すべてのプリコンパイラの選択がすでに行われ、最終的な実行可能ファイルに組み込まれます。

Windowsのバージョンに応じて異なることを行うには、両方の動作のコードを含め、実行時に正しい動作を選択する必要があります。たとえば、GetVersionExAPIの結果を使用します。

于 2012-12-31T14:38:28.800 に答える
2

実行時の動作に影響を与えるのではなく、プリプロセッサを使用して別の実行可能ファイルを条件付きでビルドすることを意味します。この結果、異なるオペレーティングシステムごとに実行可能ファイルが作成されます。これはあなたが望むものであるかもしれないし、そうでないかもしれません、そしてそれはそれ自身の落とし穴をもたらします。

一般に、他の環境でビルドされないコードがある場合を除いて、条件付きコンパイルは避ける価値があります。おそらくより良い解決策は、実行時に特定の機能を引き出すことです。これは、OSを検出するか、構成などによって実行できます。

特に実行時にライブラリを動的にロードする方法があり、検討する必要があります。Linuxの関数ファミリーを使用dlopenしてこれを行うことができます(Windowsについてはわかりませんが、似たようなものがあると確信しています)。1つの欠点は、チェック方法がほとんどないことです。インターフェイスが間違っている場合は、segを楽しみにしてください。障害。また、インターフェースはCリンケージに制限されています。

于 2012-12-31T15:15:17.007 に答える
1

そうです、最新バージョンと古いバージョンのWindowsで動作する実行可能ファイルを作成することは完全に可能です。これを行う一般的な方法は、実際のバージョンを確認してから、コードを変更することです。MSは、ここでバージョンを確認する方法を説明しています。

http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724429(v=vs.85).aspx

次に、フラグを作成します。bool isWndowsXPこれは、チェックコードによって設定され、関連する場合は実行します。if(isWindowsXP) do_stuff_xp_way(); else do_stuff_otherway();

より具体的なアドバイスが必要な場合は、質問のAとBの背後に隠されている機能を提供する必要があります。

于 2012-12-31T15:23:25.703 に答える