#include "wtypes.h" #include <initguid.h> // {FC3B3F61-BCEC-11D1-91FE-E1CBED988F66} DEFINE_GUID(IID_IStack, 0xFC3B3F61, 0xBCEC, 0x11D1, 0x91, 0xFE, 0xE1, 0xCB, 0xED, 0x98, 0x8F, 0x66); // {FC3B3F62-BCEC-11D1-91FE-E1CBED988F66} DEFINE_GUID(CLSID_CoStack, 0xFC3B3F62, 0xBCEC, 0x11D1, 0x91, 0xFE, 0xE1, 0xCB, 0xED, 0x98, 0x8F, 0x66); class IStack : public IUnknown { public: STDMETHOD(Push) (long value); STDMETHOD(Pop) (long* value); STDMETHOD(Empty)(long* flag); }; void useStack() { IUnknown* unknownPtr = NULL; HRESULT hr = CoCreateInstance(CLSID_CoStack, //Line 1 NULL, CLSCTX_ALL, IID_IUnknown, (void**)&unknownPtr); if (SUCCEEDED(hr)) { IStack* stackPtr = NULL; hr = unknownPtr->QueryInterface(IID_IStack, //Line 2 (void**)&stackPtr); if (SUCCEEDED(hr)) { hr = stackPtr->Push(10); //Line 3 long val; hr = stackPtr->Pop(&val); //Line 4 stackPtr->Release(); //Line 5 } unknownPtr->Release(); //Line 6 } } The caller must take a couple of steps to initialize COM and signal when it is finished using COM:
int main() { HRESULT hr = CoInitialize(NULL); //Line 7 if (SUCCEEDED(hr)) { useStack(); } CoUninitialize(); //Line 8 return 0; } Of course, there are a zillion details that we don't have space to go into here. |