Using Msn Mesenger Api With C++
資料來源:
http://www.msnfanatic.be/ Creating the Messenger Object:
To create the Messenger Object use the CoCreateInstance API function.
//Your FriendlyName in a MessageBox
#include
#include "msgrua.h"
#include "msgruaid.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
IMessenger *pIMessenger = NULL; //a pointer to an IMessenger interface
BSTR pbstrName;
CoInitialize(0);
CoCreateInstance(CLSID_Messenger, NULL, CLSCTX_ALL, IID_IMessenger, (void **)&pIMessenger);
pIMessenger->get_MyFriendlyName(&pbstrName);
MessageBoxW(NULL, (LPCWSTR)pbstrName, (LPCWSTR)pbstrName, MB_OK);
pIMessenger->Release();
CoUninitialize();
ExitProcess(0);
return 0;
}
Internally Created Objects: These objects cannot be created using the CoCreateInstance API function. Each has a specific object creation method within the Messenger API.
//Internally Created Objects
#include
#include "msgrua.h"
#include "msgruaid.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
IMessenger *pIMessenger = NULL;
IDispatch *pIDispatch = NULL;
IMessengerContacts *pIMessengerContacts = NULL;
IMessengerContact *pIMessengerContact = NULL;
long pCount;
BSTR pbstrName;
BSTR pbstrFriendlyName;
CoInitialize(0);
CoCreateInstance(CLSID_Messenger, NULL, CLSCTX_ALL, IID_IMessenger, (void **)&pIMessenger);
pIMessenger->get_MyContacts(&pIDispatch);
pIDispatch->QueryInterface(IID_IMessengerContacts,(void**)&pIMessengerContacts);
pIDispatch->Release();
pIMessengerContacts->get_Count(&pCount);
pIMessengerContacts->Item(pCount-1,&pIDispatch);
pIDispatch->QueryInterface(IID_IMessengerContact,(void**)&pIMessengerContact);
pIMessengerContacts->Release();
pIMessengerContact->get_SigninName(&pbstrName);
pIMessengerContact->get_FriendlyName(&pbstrFriendlyName);
MessageBoxW(NULL, (LPCWSTR)pbstrFriendlyName, (LPCWSTR)pbstrName, MB_OK);
pIMessengerContact->Release();
pIMessenger->Release();
CoUninitialize();
ExitProcess(0);
return 0;
}
Handling Events:
#include
#include "msgrua.h"
#include "msgruaid.h" class msn;
class MessengerEvents;
msn *pMsn; IMessenger *pIMessenger = NULL; IConnectionPoint *m_pConnectionPoint;
DWORD m_dwCookie; class msn : public IUnknown {
public:
msn();
~msn();
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject);
MessengerEvents *m_pMessengerEvents;
DWORD m_dwRefCount;
}; class MessengerEvents : public IDispatch {
public:
MessengerEvents(msn *pmsn);
~MessengerEvents();
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo);
HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo, LCID lcid,
ITypeInfo FAR* FAR* ppTInfo);
HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames,
unsigned int cNames, LCID lcid, DISPID FAR* rgDispId);
HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS FAR* pDispParams, VARIANT FAR* parResult,
EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr);
private:
msn *m_pmsn;
}; msn::msn()
{
IConnectionPointContainer* pCPContainer;
m_dwRefCount = 1;
m_pMessengerEvents = new MessengerEvents(this);
HRESULT hr = pIMessenger->QueryInterface(IID_IConnectionPointContainer,(void**)(&pCPContainer));
m_dwCookie = 0;
if (SUCCEEDED(hr))
{
hr = pCPContainer->FindConnectionPoint(DIID_DMessengerEvents, &m_pConnectionPoint);
if (SUCCEEDED(hr))
{
hr = m_pConnectionPoint->Advise(m_pMessengerEvents, &m_dwCookie);
}
if (pCPContainer) pCPContainer->Release();
}
} msn::~msn()
{
m_pConnectionPoint->Unadvise(m_dwCookie);
m_pConnectionPoint->Release();
if (m_pMessengerEvents) delete m_pMessengerEvents;
} ULONG STDMETHODCALLTYPE msn::AddRef()
{
return ++m_dwRefCount;
}
ULONG STDMETHODCALLTYPE msn::Release()
{
if(!--m_dwRefCount)
delete this;
return m_dwRefCount;
} STDMETHODIMP msn::QueryInterface(REFIID iid, void ** ppvObject) {
if(ppvObject == NULL) return E_INVALIDARG;
*ppvObject = NULL;
if(iid == IID_IUnknown)
*ppvObject = (IUnknown*)this;
else if(iid == DIID_DMessengerEvents || iid == IID_IDispatch)
*ppvObject = m_pMessengerEvents;
if(*ppvObject == NULL) return E_NOINTERFACE;
AddRef();
return S_OK;
} MessengerEvents::MessengerEvents(msn *pmsn) { m_pmsn = pmsn; }
MessengerEvents::~MessengerEvents() {} STDMETHODIMP MessengerEvents::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS FAR* pDispParams,
VARIANT FAR* parResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr)
{
BSTR pbstrName;
BSTR pbstrTemp;
if (!pDispParams)
return E_INVALIDARG;
switch (dispIdMember)
{
case DISPID_MUAE_ONSIGNIN:
MessageBox(0,"Signed in",0,MB_OK);
break;
case DISPID_MUAE_ONSIGNOUT:
MessageBox(0,"Signed out",0,MB_OK);
break;
case DISPID_MUAE_ONMYFRIENDLYNAMECHANGE:
pbstrTemp = pDispParams->rgvarg[0].bstrVal;
pIMessenger->get_MyFriendlyName(&pbstrName);
MessageBoxW(0,(LPCWSTR)pbstrName,(LPCWSTR)pbstrTemp,MB_OK);
break;
default:
break;
}
return S_OK;
} STDMETHODIMP MessengerEvents::QueryInterface(REFIID iid, void ** ppvObject)
{
return m_pmsn->QueryInterface(iid, ppvObject);
} ULONG STDMETHODCALLTYPE MessengerEvents::AddRef()
{ return m_pmsn->AddRef(); } ULONG STDMETHODCALLTYPE MessengerEvents::Release()
{
return m_pmsn->Release();
} HRESULT STDMETHODCALLTYPE MessengerEvents::GetTypeInfoCount(unsigned int FAR* pctinfo)
{ return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MessengerEvents::GetTypeInfo(unsigned int iTInfo, LCID lcid,
ITypeInfo FAR* FAR* ppTInfo)
{ return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MessengerEvents::GetIDsOfNames(REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId)
{ return E_NOTIMPL; } LRESULT CALLBACK WndProc(HWND hWindow, UINT uiMessage, WPARAM wParam, LPARAM lParam)
{
switch(uiMessage)
{
case WM_CLOSE:
DestroyWindow(hWindow);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWindow, uiMessage, wParam, lParam);
}
return NULL;
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hwnd;
WNDCLASSEX wclsx; wclsx.cbClsExtra = NULL;
wclsx.cbSize = sizeof(wclsx);
wclsx.cbWndExtra = NULL;
wclsx.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wclsx.hCursor = LoadCursor(NULL, IDC_ARROW);
wclsx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wclsx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wclsx.hInstance = GetModuleHandle(NULL);
wclsx.lpfnWndProc = WndProc;
wclsx.lpszClassName = "MessengerEvents";
wclsx.lpszMenuName = NULL;
wclsx.style = NULL; RegisterClassEx(&wclsx);
hwnd = CreateWindow("MessengerEvents", "Handling Events", WS_VISIBLE | WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, NULL, NULL, GetModuleHandle(NULL), NULL);
CoInitialize(0);
CoCreateInstance(CLSID_Messenger, NULL, CLSCTX_ALL, IID_IMessenger, (void **)&pIMessenger);
pMsn = new msn;
while(GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
pIMessenger->Release();
delete pMsn;
CoUninitialize();
ExitProcess(0);
return 0;
}
HAVE A NICE DAY FOR YOU 發表人 - axsoft 於 2003/07/18 10:05:43