5

いくつかの低レベルのWindowsAPI(特に、WASAPI)へのアクセスを必要とするプログラミングプロジェクトがあります。私はC#、Java、PHPなどの高級プログラミング言語の経験が豊富で、C /C++については少ししか知りません。

C ++はちょっと怖いので、このプロジェクトではC(C ++ではなく)を使用したいと思います。VisualStudioでプロジェクトのC/C ++設定を変更してCコードとしてコンパイルすると、__uuidofC ++固有であるため、への呼び出しが機能しないことに気付きました。

私の質問は2つあります:

  1. 純粋なCでCOMを利用するWin32プログラムを書くことは可能ですか?
  2. もしそうなら、純粋なCの使用は避けるべきですか?
4

2 に答える 2

4

COMは、C部分以外のC ++の非常に小さなサブセットを使用し、次のような「怖い」アイテムの多くを使用する必要はありません。

  • 例外-これらは、正しく理解しないとC ++で実際に噛み付く可能性があります(従来のC / Win32コーディングに慣れている場合は、 RAIIイディオムに実際に同意する必要があります)。ただし、例外はCOMの一部ではありません。COMはすべてのエラー処理にリターンコードを使用します。必要に応じてCOMのリターンコードをC++例外に変換するラッパーとコンパイラ拡張機能がいくつかありますが、これはオプトインです。

  • クラス階層と継承-継承は、すべてのCOMインターフェイスがIUnknownから派生する(またはメソッドから開始する)という事実を除いて、実際にはCOM自体の一部でもありません。ただし、 COMを使用するために、複数の仮想継承について何も知る必要はありません。これのいくつかは、COMオブジェクトを自分で実装しているかどうかを知るのに非常に役立ちますが、それを使用するだけではありません。(たとえば、C ++の多重継承を使用することは、複数のインターフェイスを公開するCOMオブジェクトを実装するための非常に一般的な方法ですが、それが唯一の方法ではありません。)

  • テンプレート-繰り返しますが、COMの一部ではありませんが、いくつかのライブラリがあります-たとえば。MFCとATL-テンプレートを使用してCOMを非常に簡単に使用できるようにします。これは、CComPtrのようなスマートポインタクラスに特に当てはまります。CComPtrは、参照カウントを処理し、ハウスキーピングのようなものを詰め込むのではなく、コードが本当に興味深いことを行うことに集中できるようにします。

COMとC++の間の主なリンクは、Windows上のすべてのC ++コンパイラが、COMが必要とするものと正確に一致する方法でメモリ内にC++オブジェクトをレイアウトすることです。これにより、COMオブジェクトをC ++オブジェクトであるかのように使用できます。これにより、言語/コンパイラが非常に単純ですが冗長なものを処理するため、コードの冗長性が大幅に低下します。

したがって、Cで次のことを行う代わりに(vtableをステップスルーし、このパラメーターを明示的に渡します):

pUnk->lpVtbl->SomeMethod(pUnk, 42);

C++では次のことができます。

pUnk->SomeMethod(42);

本当に->lpVtblと入力する必要はなく、COM呼び出しを行うたびに、正しい'this'パラメーターを渡すようにしてください(切り取りと貼り付けの際は注意してください)。

私の提案は、良いCOMブックを見つけることです-COMの内部は良いものです-そしてあなたが快適なC++サブセットを使い始めるだけです。COMポインタを「生」で使用する方法を理解し、QI、AddRefなどを自分で使用する方法を理解したら、テンプレートを使用して簿記の一部を実行するヘルパーライブラリを試してみることができます。COMエラーをC++例外にマップするラッパーを使用することを決定することは、少し大きなジャンプです。最初に例外セーフなC ++コードを作成する必要があるため、最初にそれらのさまざまな問題を理解する必要があります。しかし、私は、純粋な好奇心以外に、戻ってプレーンCのCOMを使用する正当な理由を考えることはできません。

于 2013-02-07T09:05:35.923 に答える
4
  1. はい、COMを利用した純粋なCプログラムを作成することは可能です。実際、これは10〜15年前の一般的な慣習でした。

  2. あなたはCを使って自分自身を支持しているのではありません(あなたがすでに気づいているように)。たとえば、ATLは、COMを実行しているときに多くのヘルプを提供し、一般的な間違いを回避するのに役立ちます。

もし私があなたなら、最初はしきい値が少し高くても、C++を使用します。持っていない場合は、主題の本も入手してください。ネットにはたくさんの例がありますが、CまたはC ++を使用するかどうかに関係なく、COMプログラミングは気弱な人向けではないため、手で導くものがあると便利です。

于 2013-02-07T07:14:52.633 に答える