ATL/WTL Part3

このエントリーをはてなブックマークに追加
853デフォルトの名無しさん
足し算をするカスタムインターフェースを持つ、原始的なCOMサーバーDLLを書いてみたのですが、(COMは初めて)
const CLSID ID_Foo = {1, 2, 3, {4, 5, 6, 7, 8, 9, 10, 11}};
const IID IID_IFoo = {11, 10, 9, {8, 7, 6, 5, 4, 3, 2, 1}};
class IFoo : public IUnknown {
public:
STDMETHOD_(DWORD, FooAdd)(DWORD a, DWORD b) { return a + b; }
IFoo() : m_dwRef(0) {}
STDMETHOD(QueryInterface)(REFIID iid, VOID **ppI) { /* 省略 */ }
STDMETHOD_(ULONG, AddRef)() { return ++ m_dwRef; }
STDMETHOD_(ULONG, Release)() { /* 省略 */ }
private:
DWORD m_dwRef;
}; /* 以下略 */
これを使うクライアントはどう書けばいいのでしょうか? 例えば、DLLでないかもしれなくても、直接pifoo->FooAdd()などとしてもよいのでしょうか?
また、他人にこのサーバを使わせるには、以下のconst IID...とclassの部分をヘッダファイルにして渡せばいいのでしょうか? それともタイプライブラリというものを作るのでしょうか?
あと、おかしいところを指摘して下さい。
const IID IID_IFoo = {11, 10, 9, {8, 7, 6, 5, 4, 3, 2, 1}};
class IFoo : public IUnknown {
public:
STDMETHOD_(DWORD, FooAdd)(DWORD, DWORD);
};
void main() {
IFoo *pifoo = NULL;
CoInitialize(NULL);
CLSID clsid;
CLSIDFromProgID(L"Foo", &clsid);
CoGetClassObject(clsid, CLSCTX_ALL, NULL, IID_IFoo, (void **)&pifoo);
DWORD dwResult = pifoo->FooAdd(1, 2);
printf("FooAdd(1, 2) = %d\n", dwResult);
pifoo->Release();
} /* エラーチェックは省略 */