#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