#pragma once
#include "unknwn.h"
class SCPIFactory :public IClassFactory
{
public:
SCPIFactory(void);
~SCPIFactory(void);
public:
//IUnknow Method
STDMETHODIMP QueryInterface(REFIID,void**);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
//IClassFactory Method
STDMETHODIMP CreateInstance(IUnknown * ,REFIID ,void **);
STDMETHODIMP LockServer(BOOL fLock);
private:
LONG m_cRef;
};
import "oaidl.idl";import "ocidl.idl";[uuid(011E50FF-873E-4FB2-86D5-296BFFCB47C4),object, dual,//这个标识说明定义的是双接口pointer_default(unique)]interface ISCPI : IDispatch//必须从IDispatch接口派生{[id(1)]HRESULT add([in]int a, [in]int b, [out]int* c);};[uuid(681B4072-519F-43B2-A356-055CD5B9FFC1),version(1.0),]library SCPILib{importlib("stdole32.tlb");importlib("stdole2.tlb");[uuid(050779DB-3DF0-49C4-9CCF-C92BD363DB82)]coclass SCPIImp//com类{[default] interface ISCPI;};};
SCPIX.idl
SCPIImp.h
#pragma once
#include "SCPI_h.h"
class SCPIImp :public ISCPI
{
public:
SCPIImp(void);
~SCPIImp(void);
public:
//IUnknown接口
STDMETHOD(QueryInterface)(REFIID riid, void **ppv);//接口查询
STDMETHOD_(ULONG, AddRef)();//增加一个引用
STDMETHOD_(ULONG, Release)();//减少一个引用
// IDispatch
STDMETHOD(GetTypeInfoCount)(UINT * pit);
STDMETHOD(GetTypeInfo)(UINT it,LCID lcid,ITypeInfo **ppti);
STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR ** pNames, UINT nNames, LCID lcid, DISPID * pdispids);
STDMETHOD(Invoke)(DISPID id, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pd, VARIANT * pVarResult, EXCEPINFO * pe, UINT *pu);
//ISCPI
STDMETHOD(add)(int a, int b, int *c);
private:
ULONG m_cRef; //引用计数
};
SCPImp.cpp
#include "SCPIImp.h"
SCPIImp::SCPIImp(void)
{
m_cRef = 0;
}
SCPIImp::~SCPIIm