/*++ Copyright (C) 1997-998 Microsoft Corporation Module Name: subcli.cxx Abstract: Code to test the COM/OleAutomation aspect of the Test Subscriber for SENS. Author: Gopal Parupudi [Notes:] optional-notes Revision History: GopalP 1/17/1998 Start. --*/ #include #include #include #include #include #include #include "sinkguid.hxx" #define SENS_SERVICE L"SENS.DLL" #define MAJOR_VER 1 #define MINOR_VER 0 #define DEFAULT_LCID 0x0 int main( int argc, char **argv ) { HRESULT hr = S_OK; IDispatch *pIDispatchNetwork = NULL; IDispatch *pIDispatchLogon = NULL; ISensNetwork *pISensNetwork = NULL; ISensNetwork *pISensLogon = NULL; ITypeLib *pITypeLib = NULL; ITypeInfo *pITypeInfo = NULL; IRecordInfo * pIRecordInfo = NULL; hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); printf("CoInitializeEx() returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } DISPID dispIDNetwork; DISPID dispIDLogon; OLECHAR *name; printf("--------------------------------------------------------------\n"); hr = CoCreateInstance( CLSID_SensTestSubscriberNetwork, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID *) &pIDispatchNetwork ); printf("CoCreateInstance(IDispatchNetwork) returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } hr = CoCreateInstance( CLSID_SensTestSubscriberNetwork, NULL, CLSCTX_LOCAL_SERVER, IID_ISensNetwork, (LPVOID *) &pISensNetwork ); printf("CoCreateInstance(ISensNetwork) returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } /* printf("Calling pISensNetwork->ConnectionMade()\n"); pISensNetwork->ConnectionMade( SysAllocString(L"A dummy Connection Name"), 0x1234, NULL ); printf("Calling pISensNetwork->ConnectionMade() - DONE.\n"); */ name = L"FooFunc"; hr = pIDispatchNetwork->GetIDsOfNames( IID_NULL, &name, 1, GetUserDefaultLCID(), &dispIDNetwork ); printf("GetIDsOfNames(FooFunc) returned 0x%x, dispID = %d\n", hr, dispIDNetwork); if (FAILED(hr)) { goto Cleanup; } // // Call Invoke on a function with 1 argument. // BSTR bstrTemp; VARIANTARG varg; bstrTemp = SysAllocString(L"A Dummy Connection Name"); VariantInit(&varg); varg.vt = VT_BSTR; varg.bstrVal = bstrTemp; // Fill in the DISPPARAMS structure. DISPPARAMS param; param.cArgs = 1; param.rgvarg = &varg; param.cNamedArgs = 0; param.rgdispidNamedArgs = NULL; hr = pIDispatchNetwork->Invoke( dispIDNetwork, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, ¶m, NULL, NULL, NULL ); printf("Invoke(FooFunc) returned 0x%x\n", hr); SysFreeString(bstrTemp); if (FAILED(hr)) { goto Cleanup; } printf("--------------------------------------------------------------\n"); name = L"ConnectionMadeNoQOCInfo"; hr = pIDispatchNetwork->GetIDsOfNames( IID_NULL, &name, 1, GetUserDefaultLCID(), &dispIDNetwork ); printf("GetIDsOfNames(ConnectionMadeNoQOCInfo) returned 0x%x, dispID = %d\n", hr, dispIDNetwork); if (FAILED(hr)) { goto Cleanup; } // // Call Invoke on a function with 2 arguments (parameters in reverse order). // VARIANTARG vargarr[2]; bstrTemp = SysAllocString(L"A Dummy Connection Name"); VariantInit(&vargarr[1]); vargarr[1].vt = VT_BSTR; vargarr[1].bstrVal = bstrTemp; VariantInit(&vargarr[0]); vargarr[0].vt = VT_UI4; vargarr[0].ulVal = 0x00000001; // Fill in the DISPPARAMS structure. param.cArgs = 2; param.rgvarg = vargarr; param.cNamedArgs = 0; param.rgdispidNamedArgs = NULL; hr = pIDispatchNetwork->Invoke( dispIDNetwork, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, ¶m, NULL, NULL, NULL ); printf("Invoke(ConnectionMadeNoQOCInfo) returned 0x%x\n", hr); SysFreeString(bstrTemp); if (FAILED(hr)) { goto Cleanup; } printf("--------------------------------------------------------------\n"); hr = CoCreateInstance( CLSID_SensTestSubscriberLogon, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID *) &pIDispatchLogon ); printf("CoCreateInstance(IDispatchLogon) returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } hr = CoCreateInstance( CLSID_SensTestSubscriberLogon, NULL, CLSCTX_LOCAL_SERVER, IID_ISensLogon, (LPVOID *) &pISensLogon ); printf("CoCreateInstance(ISensLogon) returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } name = L"Logon"; hr = pIDispatchLogon->GetIDsOfNames( IID_NULL, &name, 1, GetUserDefaultLCID(), &dispIDLogon ); printf("GetIDsOfNames(Logon) returned 0x%x, dispID = %d\n", hr, dispIDLogon); if (FAILED(hr)) { goto Cleanup; } // // Call Invoke on a function with 1 argument. // bstrTemp = SysAllocString(L"REDMOND\\JohnDoe"); VariantInit(&varg); varg.vt = VT_BSTR; varg.bstrVal = bstrTemp; // Fill in the DISPPARAMS structure. param.cArgs = 1; param.rgvarg = &varg; param.cNamedArgs = 0; param.rgdispidNamedArgs = NULL; hr = pIDispatchLogon->Invoke( dispIDLogon, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, ¶m, NULL, NULL, NULL ); printf("Invoke(Logon) returned 0x%x\n", hr); SysFreeString(bstrTemp); if (FAILED(hr)) { goto Cleanup; } printf("--------------------------------------------------------------\n"); // // Call Invoke with multiple arguments and UDT // name = L"ConnectionMade"; hr = pIDispatchNetwork->GetIDsOfNames( IID_NULL, &name, 1, GetUserDefaultLCID(), &dispIDNetwork ); printf("GetIDsOfNames(ConnectionMade) returned 0x%x, dispID = %d\n", hr, dispIDNetwork); if (FAILED(hr)) { goto Cleanup; } // Get the ITypeInfo pointer. hr = LoadRegTypeLib( LIBID_SensEvents, MAJOR_VER, MINOR_VER, DEFAULT_LCID, &pITypeLib ); printf("LoadRegTypeLib returned 0x%x\n", hr); if (FAILED(hr)) { hr = LoadTypeLib( SENS_SERVICE, &pITypeLib ); printf("LoadTypeLib() returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } } hr = pITypeLib->GetTypeInfo(0, &pITypeInfo); printf("GetTypeInfo returned 0x%x - (pITypeInfo = 0x%x)\n", hr, pITypeInfo); if (FAILED(hr)) { goto Cleanup; } hr = GetRecordInfoFromTypeInfo(pITypeInfo, &pIRecordInfo); printf("GetRecordInfoFromTypeInfo returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } VARIANTARG arrvarg[3]; SENS_QOCINFO QOCInfo; // // Parameters are filled in the reverse order. // VariantInit(&arrvarg[2]); arrvarg[2].vt = VT_BSTR; arrvarg[2].bstrVal = SysAllocString(L"A dummy connection name"); VariantInit(&arrvarg[1]); arrvarg[1].vt = VT_UI4; arrvarg[1].ulVal = 0x1234abcd; // Setup QOCInfo. QOCInfo.ulSize = sizeof(SENS_QOCINFO); QOCInfo.ulFlags = 0x00000003; QOCInfo.ulInSpeed = 33600; QOCInfo.ulOutSpeed = 33600; VariantInit(&arrvarg[0]); arrvarg[0].vt = VT_RECORD | VT_BYREF; arrvarg[0].pRecInfo = pIRecordInfo; arrvarg[0].pvRecord = &QOCInfo; // Fill in the DISPPARAMS structure. param.cArgs = 3; param.rgvarg = arrvarg; param.cNamedArgs = 0; param.rgdispidNamedArgs = NULL; hr = pIDispatchNetwork->Invoke( dispIDNetwork, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, ¶m, NULL, NULL, NULL ); printf("Invoke(ConnectionMade) returned 0x%x\n", hr); if (FAILED(hr)) { goto Cleanup; } // // Cleanup stuff // Cleanup: if (pIDispatchNetwork) { pIDispatchNetwork->Release(); } if (pIDispatchLogon) { pIDispatchLogon->Release(); } if (pISensNetwork) { pISensNetwork->Release(); } if (pISensLogon) { pISensLogon->Release(); } if (pITypeLib) { pITypeLib->Release(); } if (pITypeInfo) { pITypeInfo->Release(); } CoUninitialize(); printf("--------------------------------------------------------------\n"); return (SUCCEEDED(hr) ? 0 : -1); }