[ Home | Syllabus | Course Notes | Assignments | Search]
// ex25b.odl : type library source for ex25b.dll // This file will be processed by the MIDL compiler to produce the // type library (ex25b.tlb). [ uuid(A9515ACA-5B85-11D0-848F-00400526305B), version(1.0) ] library Ex25b { // library name for Excel's object borrower importlib("stdole32.tlb"); // primary dispatch interface for CEx25bAuto [ uuid(A9515AD7-5B85-11D0-848F-00400526305B) ] // GUID from component's interface map--matches Registry Interface // entry dispinterface IEx25bAuto { // name used in VBA Dim statement and Object list properties: [id(1)] long LongData; [id(2)] VARIANT TextData; methods: [id(3)] boolean DisplayDialog(); }; // component's clsid [ uuid(A9515AD8-5B85-11D0-848F-00400526305B) ] coclass Ex25bAuto { [default] dispinterface IEx25bAuto; }; };
IMPLEMENT_DYNCREATE(CEx25bAuto, CCmdTarget) CEx25bAuto::CEx25bAuto() { EnableAutomation(); ::VariantInit(&m_vaTextData); // necessary initialization m_lData = 0; } BEGIN_DISPATCH_MAP(CEx25bAuto, CCmdTarget) //{{AFX_DISPATCH_MAP(CEx25bAuto) DISP_PROPERTY_NOTIFY(CEx25bAuto, "LongData", m_lData, OnLongDataChanged, VT_I4) DISP_PROPERTY_NOTIFY(CEx25bAuto, "TextData", m_vaTextData, OnTextDataChanged, VT_VARIANT) DISP_FUNCTION(CEx25bAuto, "DisplayDialog", DisplayDialog, VT_BOOL, VTS_NONE) //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() ///////////////////////////////////////////////////////////////////////////// // CEx25bAuto message handlers void CEx25bAuto::OnLongDataChanged() { TRACE("CEx25bAuto::OnLongDataChanged\n"); } void CEx25bAuto::OnTextDataChanged() { TRACE("CEx25bAuto::OnTextDataChanged\n"); } BOOL CEx25bAuto::DisplayDialog() { BOOL bRet = TRUE; AfxLockTempMaps(); // See MFC Tech Note #3 CWnd* pTopWnd = CWnd::FromHandle(::GetTopWindow(NULL)); try { CPromptDlg dlg(pTopWnd); if (m_vaTextData.vt == VT_BSTR){ dlg.m_strData = m_vaTextData.bstrVal; // converts double-byte(UNICODE) // character to // single-byte // character } dlg.m_lData = m_lData; // data exchange will move into dialog CEdit controls if (dlg.DoModal() == IDOK) { m_vaTextData = COleVariant(dlg.m_strData).Detach(); m_lData = dlg.m_lData; bRet = TRUE; } else { bRet = FALSE; } } catch (CException* pe) { TRACE("Exception: failure to display dialog\n"); bRet = FALSE; pe->Delete(); } AfxUnlockTempMaps(); return bRet; }
As before, can load DLL and call its DllRegisterServer function.
Dim Dllcomp As Object Private Declare Sub CoFreeUnusedLibraries Lib "OLE32" () Sub LoadDllComp() Set Dllcomp = CreateObject("Ex25b.Auto") Range("C3").Select Dllcomp.LongData = Selection.Value Range("D3").Select Dllcomp.TextData = Selection.Value End Sub Sub RefreshDllComp() 'Gather Data button Range("C3").Select Dllcomp.LongData = Selection.Value Range("D3").Select Dllcomp.TextData = Selection.Value Dllcomp.DisplayDialog Range("C3").Select Selection.Value = Dllcomp.LongData Range("D3").Select Selection.Value = Dllcomp.TextData End Sub Sub UnloadDllComp() Set Dllcomp = Nothing Call CoFreeUnusedLibraries End Sub