将来このスレッドを見つけた人の利益のために、私自身の質問に答えます。ただし、ここでは実験に基づいて推測しているだけであることに注意してください...少なくとも私の特定の状況ではうまくいくようですが、わかりません。
まず、適切なヘッダー ファイル (おそらく Hidden.h) に次のコードを記述し、新しく生成されたUUIDを新しく生成された UUID に置き換えます。
#ifndef __Hidden_h__
#define __Hidden_h__
extern "C" {
#ifndef __IHidden_FWD_DEFINED__
#define __IHidden_FWD_DEFINED__
typedef interface IHidden IHidden;
#endif // __IHidden_FWD_DEFINED__
#ifndef __IHidden_INTERFACE_DEFINED__
#define __IHidden_INTERFACE_DEFINED__
EXTERN_C const IID IID_IHidden;
MIDL_INTERFACE("a newly generated UUID")
IHidden : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE get_Something (
long __RPC_FAR *pVal ) = 0;
};
#endif // __IHidden_INTERFACE_DEFINED__
}
#endif // __Hidden_h__
関数の他の種類のパラメーターなどを定義する方法については、IDL ファイルから MIDL によって生成された C++ ヘッダーを参照してください。
次に、このインターフェイスを実装する任意のクラスのヘッダーで、インターフェイスをクラス宣言に追加します。
class ATL_NO_VTABLE CBlah :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CBlah, &CLSID_CBlah>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CBlah>,
public IBlah,
public IHidden
また、COM_MAP に追加します。
BEGIN_COM_MAP(CBlah)
COM_INTERFACE_ENTRY(IBlah)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IHidden)
END_COM_MAP
それ以降は、標準の C++ 宣言とインターフェイスの関数の定義をクラスに追加するだけです。
public:
STDMETHOD(get_Something)(long *pVal);
(...)
STDMETHODIMP CBlah::get_Something(long *pVal)
{
if ( !pVal )
{
(error handling)
}
*pVal = 37;
return S_OK;
}
これが将来誰かに役立つことを願っています。また、それが間違っているために私を傷つけないことを願っています。おっしゃる通りですが、効果はありそうです。