1

だから...私はNT DDK 7.1.0のターンキービルド環境を使用してまとめているカーネルモードコンポーネントとユーザーモードコンポーネントを持っています。カーネル コンポーネントはすべて .c/.h/.rc ファイルです。ユーザー モード コンポーネントは .cpp/.c/.h/.rc ファイルです。

ユーザーモードコンポーネントのファイルを次のように変更できることがわかったので、最初は両方にbuildを使用するのが最も簡単に思えました。./sources

TARGETNAME = MyUserModeComponent
TARGETTYPE = PROGRAM
UMTYPE = windows
UMENTRY = winmain
USE_MSVCRT = 1

#include <string>それは問題を引き起こさないようだったので、 (または<memory>、または何でも)しようとするまで、私は喜んでいました。

エラー C1083: インクルード ファイルを開けません: 'string': そのようなファイルまたはディレクトリはありません

それでも、C++ 言語のセマンティクスを使用してユーザー モード部分をコンパイルしています。しかし、標準インクルードを機能させるにはどうすればよいでしょうか?

技術的には、ユーザー モード部分にDDKビルドツールを使用する必要はありません。ビジュアル スタジオ ソリューションを作成できました。__stdcallDDKがデフォルトではなく代わりに使用するという事実のように、他の煩わしさにぶつかったので、私は少し警戒してい__cdeclます...そしてこれをオーバーライドするプラグマまたはコンパイラスイッチはありません。ソースがあると仮定すると、文字通り、関心のある各宣言に移動して変更する必要があります。:-/

これは、「できるからといって、DDK を使用してユーザー モード アプリをビルドする必要があるわけではありません。これがドラゴンです。」 したがって、私の質問は、この特定の技術的なハードルについてだけではなく、カーネル コンポーネントが純粋な C であるという理由だけで、DDK ツールを使用して C++ ユーザー モード コンポーネントを構築するという考えを放棄すべきかどうかということです。

4

2 に答える 2

3

WINDDK でユーザー モード プログラムをビルドするには、SOURCES ファイルにいくつかの変数を追加する必要があります。

  • 386_STDCALL=0cdeclデフォルトで呼び出し規約を使用する
  • USE_STL=1STLを使う
  • USE_NATIVE_EH=1例外処理のサポートを追加するには

あなたがすでに持っている他のすべて。

参照用に完全な SOURCES ファイルを置きます。

TARGETNAME = MyUserModeComponent
TARGETTYPE = PROGRAM
TARGETPATH = obj
UMTYPE = console
UMENTRY = main

USE_MSVCRT = 1
USE_NATIVE_EH=1
USE_STL=1
386_STDCALL=0

SOURCES= main.cpp

そしてmain.cpp:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s = "bla bla bla!";
    cout << s;

    return 0;
}

楽しむ!

于 2013-06-10T05:46:38.147 に答える
2

素早い回答

DDK ツールを使用してユーザー モード コンポーネントを構築するという考えを放棄します(ただし、この概念は魅力的だと思います :-P)

カーネル モード コンポーネントは、適切な方法として、ユーザー モード コンポーネントとは別に構築する必要があります。

漠然とした考え

私の頭の中で、これは本当に限られた経験から言えば... 2つを混ぜ合わせようとすると、微妙な違いがたくさんあります.

__cdecl と __stdcall の独自の例を使用します。2 つの異なる呼び出し規約があります。_ cdecl はすべてカーネルのものであり、すべての C++ メソッドは WINAPI ( _stdcall) を渡す規則にラップされており、__stdcall は自動スタック クリーンアップをクリーンアップし、フレーム ポインターがいたるところに挿入されることを期待します。また、誤ってコンパイラ オプションを使用して __fastcall をトリガーした場合は、デバッグが面倒になります。

何かを一緒にハックすることは間違いなくできますが、ユーザー空間のコードとビルド環境でそれを追跡したいですか? うーん、私は言います。

2 つの環境を混在させる特別なエンジニアリング上の理由がない限り (buildall.bat というバッチ ファイルから取得できるため、統一されたビルド エクスペリエンスは正当な理由ではありません)、個別のツールチェーンを使用することをお勧めします。

于 2013-06-07T05:36:22.297 に答える