1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#include "main.h"
#include "./resource.h"
#include "./external.h"
ExternalDispatch::ExternalDispatch()
: ref(1)
{
}
ExternalDispatch::~ExternalDispatch()
{
}
HRESULT ExternalDispatch::CreateInstance(ExternalDispatch **instance)
{
if (NULL == instance) return E_POINTER;
*instance = new ExternalDispatch();
if (NULL == *instance) return E_OUTOFMEMORY;
return S_OK;
}
LPCWSTR ExternalDispatch::GetName()
{
return L"NowPlaying";
}
ULONG ExternalDispatch::AddRef(void)
{
return InterlockedIncrement((LONG*)&ref);
}
ULONG ExternalDispatch::Release(void)
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
STDMETHODIMP ExternalDispatch::QueryInterface(REFIID riid, void **ppvObject)
{
if (NULL == ppvObject) return E_POINTER;
if (IsEqualIID(riid, IID_IDispatch))
*ppvObject = static_cast<IDispatch*>(this);
else if (IsEqualIID(riid, IID_IUnknown))
*ppvObject = static_cast<IUnknown*>(this);
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
HRESULT ExternalDispatch::GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid)
{
bool unknowns = false;
for (unsigned int i = 0;i != cNames;i++)
{
if (_wcsicmp(rgszNames[i], L"hidden") == 0)
rgdispid[i] = DISPATCH_HIDDEN;
else
{
rgdispid[i] = DISPID_UNKNOWN;
unknowns = true;
}
}
if (unknowns)
return DISP_E_UNKNOWNNAME;
else
return S_OK;
}
HRESULT ExternalDispatch::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
{
return E_NOTIMPL;
}
HRESULT ExternalDispatch::GetTypeInfoCount(unsigned int FAR * pctinfo)
{
return E_NOTIMPL;
}
HRESULT ExternalDispatch::Invoke(DISPID dispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr)
{
switch(dispId)
{
case DISPATCH_HIDDEN:
if (NULL != pvarResult)
{
HWND hLibrary = Plugin_GetLibrary();
VariantInit(pvarResult);
V_VT(pvarResult) = VT_BOOL;
V_BOOL(pvarResult) = (NULL == hLibrary || FALSE == SENDMLIPC(hLibrary, ML_IPC_IS_VISIBLE, 0));
}
return S_OK;
}
return DISP_E_MEMBERNOTFOUND;
}
|