266 lines
6.7 KiB
C++
266 lines
6.7 KiB
C++
#include "stdafx.h"
|
|
#include "msictrl.h"
|
|
//#include "ctrlref.h"
|
|
//#include "msishell.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMSIControl
|
|
|
|
IMPLEMENT_DYNCREATE(CMSIControl, CWnd)
|
|
|
|
CMSIControl::~CMSIControl()
|
|
{
|
|
/*if (m_fInRefresh && m_pRefresh)
|
|
delete m_pRefresh;*/
|
|
ASSERT(1);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHWDiag properties
|
|
|
|
long CMSIControl::GetMSInfoView()
|
|
{
|
|
long result = -1;
|
|
DISPID dispid;
|
|
|
|
if (GetDISPID("MSInfoView", &dispid))
|
|
GetProperty(dispid, VT_I4, (void*)&result);
|
|
return result;
|
|
}
|
|
|
|
void CMSIControl::SetMSInfoView(long propVal)
|
|
{
|
|
DISPID dispid;
|
|
|
|
if (GetDISPID("MSInfoView", &dispid))
|
|
SetProperty(dispid, VT_I4, propVal);
|
|
}
|
|
|
|
void CMSIControl::Refresh()
|
|
{
|
|
InvokeHelper(DISPID_REFRESH, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// MSInfoRefresh instructs the control to refresh itself. Rather than just
|
|
// calling the method, we create a thread which calls the method.
|
|
//---------------------------------------------------------------------------
|
|
|
|
//extern CMSIShellApp theApp;
|
|
void CMSIControl::MSInfoRefresh()
|
|
{
|
|
/*if (m_fInRefresh)
|
|
{
|
|
if (m_pRefresh->IsDone())
|
|
delete m_pRefresh;
|
|
else
|
|
{
|
|
MessageBeep(MB_OK);
|
|
return;
|
|
}
|
|
}
|
|
|
|
m_pRefresh = new CCtrlRefresh;
|
|
if (m_pRefresh)
|
|
{
|
|
if (m_pRefresh->Create(this, THREAD_PRIORITY_NORMAL, FALSE))
|
|
{
|
|
m_fInRefresh = TRUE;
|
|
// theApp.m_pCtrlInRefresh = this;
|
|
}
|
|
else
|
|
delete m_pRefresh;
|
|
}*/
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// This method returns a boolean indicating if this control is currently
|
|
// in an MSInfoRefresh operation.
|
|
//---------------------------------------------------------------------------
|
|
|
|
BOOL CMSIControl::InRefresh()
|
|
{
|
|
return (m_fInRefresh /*&& !m_pRefresh->IsDone()*/);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// This method cancels a refresh in progress. Note that this method does not
|
|
// call a method in the OLE control, but instead manipulate the refresh
|
|
// object (if there is one).
|
|
//---------------------------------------------------------------------------
|
|
|
|
void CMSIControl::CancelMSInfoRefresh()
|
|
{
|
|
if (!m_fInRefresh)
|
|
return;
|
|
|
|
/* if (m_pRefresh)
|
|
{
|
|
delete m_pRefresh;
|
|
m_pRefresh = NULL;
|
|
}*/
|
|
|
|
m_fInRefresh = FALSE;
|
|
}
|
|
|
|
void CMSIControl::MSInfoSelectAll()
|
|
{
|
|
DISPID dispid;
|
|
|
|
if (GetDISPID("MSInfoSelectAll", &dispid))
|
|
InvokeHelper(dispid, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
|
|
}
|
|
|
|
void CMSIControl::MSInfoCopy()
|
|
{
|
|
DISPID dispid;
|
|
|
|
if (GetDISPID("MSInfoCopy", &dispid))
|
|
InvokeHelper(dispid, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
|
|
}
|
|
|
|
BOOL CMSIControl::MSInfoLoadFile(LPCTSTR strFileName)
|
|
{
|
|
BOOL result = FALSE;
|
|
static BYTE parms[] = VTS_BSTR;
|
|
DISPID dispid;
|
|
|
|
if (GetDISPID("MSInfoLoadFile", &dispid))
|
|
InvokeHelper(dispid, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, strFileName);
|
|
|
|
return result;
|
|
}
|
|
|
|
void CMSIControl::MSInfoUpdateView()
|
|
{
|
|
DISPID dispid;
|
|
if (GetDISPID("MSInfoUpdateView", &dispid))
|
|
InvokeHelper(dispid, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
|
|
}
|
|
|
|
long CMSIControl::MSInfoGetData(long dwMSInfoView, long* pBuffer, long dwLength)
|
|
{
|
|
long result = -1;
|
|
static BYTE parms[] = VTS_I4 VTS_PI4 VTS_I4;
|
|
DISPID dispid;
|
|
|
|
if (GetDISPID("MSInfoGetData", &dispid))
|
|
InvokeHelper(dispid, DISPATCH_METHOD, VT_I4, (void*)&result, parms, dwMSInfoView, pBuffer, dwLength);
|
|
return result;
|
|
}
|
|
|
|
void CMSIControl::AboutBox()
|
|
{
|
|
InvokeHelper(0xfffffdd8, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// GetDISPID returns the DISPID for a given string, by looking it up using
|
|
// IDispatch->GetIDsOfNames. This avoids hardcoding DISPIDs in this class.
|
|
//---------------------------------------------------------------------------
|
|
|
|
BOOL CMSIControl::GetDISPID(char *szName, DISPID *pID)
|
|
{
|
|
USES_CONVERSION;
|
|
BOOL result = FALSE;
|
|
DISPID dispid;
|
|
OLECHAR FAR* szMember = A2OLE(szName);//T2OLE(szName);
|
|
LPDISPATCH pDispatch;
|
|
LPUNKNOWN pUnknown;
|
|
|
|
pUnknown = GetControlUnknown();
|
|
if (pUnknown)
|
|
{
|
|
if (SUCCEEDED(pUnknown->QueryInterface(IID_IDispatch, (void FAR* FAR*) &pDispatch)))
|
|
{
|
|
if (SUCCEEDED(pDispatch->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid)))
|
|
{
|
|
*pID = dispid;
|
|
result = TRUE;
|
|
}
|
|
else
|
|
TRACE0("+++ couldn't find method for MSInfoLoadFile\n");
|
|
pDispatch->Release();
|
|
}
|
|
else
|
|
TRACE0("+++ could not get IDispatch interface\n");
|
|
}
|
|
else
|
|
TRACE0("+++ could not get IUnknown interface\n");
|
|
|
|
return result;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Save the contents of the control to a stream.
|
|
//---------------------------------------------------------------------------
|
|
|
|
BOOL CMSIControl::SaveToStream(IStream *pStream)
|
|
{
|
|
BOOL result = FALSE;
|
|
LPUNKNOWN pUnknown;
|
|
IPersistStreamInit *pPersist;
|
|
|
|
pUnknown = GetControlUnknown();
|
|
if (pUnknown)
|
|
{
|
|
if (SUCCEEDED(pUnknown->QueryInterface(IID_IPersistStreamInit, (void FAR* FAR*) &pPersist)))
|
|
{
|
|
result = SUCCEEDED(pPersist->Save(pStream, FALSE));
|
|
pPersist->Release();
|
|
}
|
|
else
|
|
TRACE0("+++ could not get IPersistStreamInit interface\n");
|
|
}
|
|
else
|
|
TRACE0("+++ could not get IUnknown interface\n");
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// The following code isn't used now, but might be useful later.
|
|
//---------------------------------------------------------------------------
|
|
|
|
#if FALSE
|
|
//---------------------------------------------------------------------------
|
|
// RefreshForSave calls the MSInfoRefresh method, but waits for it to
|
|
// complete.
|
|
//---------------------------------------------------------------------------
|
|
|
|
void CMSIControl::RefreshForSave()
|
|
{
|
|
USES_CONVERSION;
|
|
OLECHAR FAR* szMember = T2OLE("MSInfoRefresh");
|
|
DISPID dispid;
|
|
LPDISPATCH pDispatch;
|
|
DISPPARAMS dispparamsNoArgs;
|
|
VARIANTARG variantargs[2];
|
|
LPUNKNOWN pUnknown;
|
|
DWORD dwCancel = 0;
|
|
|
|
pUnknown = GetControlUnknown();
|
|
if (pUnknown)
|
|
if (SUCCEEDED(pUnknown->QueryInterface(IID_IDispatch, (void FAR* FAR*) &pDispatch)))
|
|
{
|
|
if (SUCCEEDED(pDispatch->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid)))
|
|
{
|
|
variantargs[0].vt = VT_I4 | VT_BYREF;
|
|
variantargs[0].plVal = (long *) &dwCancel;
|
|
variantargs[1].vt = VT_BOOL;
|
|
variantargs[1].iVal = (short) -1;
|
|
|
|
dispparamsNoArgs.cNamedArgs = 0;
|
|
dispparamsNoArgs.rgdispidNamedArgs = NULL;
|
|
dispparamsNoArgs.cArgs = 2;
|
|
dispparamsNoArgs.rgvarg = variantargs;
|
|
|
|
pDispatch->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparamsNoArgs, NULL, NULL, NULL);
|
|
}
|
|
pDispatch->Release();
|
|
}
|
|
}
|
|
#endif
|