Listing 5: client.cpp Simple console-mode client app
// COM Marshalling Sample Client // Author : Fran Heeran #define INC_OLE2 #include <stdio.h> #include <time.h> #include <windows.h> #include <initguid.h> #include <tchar.h> #include <conio.h> #include "marsamp.h" BOOL flagsArray[FLAG_ARRAY_SIZE]; void FillArray(); int __cdecl main(int argc, char **argv) { HRESULT hr; COSERVERINFO csi, *pcsi; WCHAR wsz[MAX_PATH]; memset(&csi, 0, sizeof(csi)); pcsi = NULL; // Get the name of the remote server (if supplied) if (argc > 1) { MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, argv[1], -1, wsz, MAX_PATH); memset(&csi, 0, sizeof(COSERVERINFO)); csi.pwszName = wsz; pcsi = &csi; } // Initialize COM hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); RETURNONFAILURE(hr, "Failed to initialize COM - %0x8X"); // Create the object and get our Interface MULTI_QI mq; mq.pIID = &IID_ISimpleObject; mq.pItf = NULL; mq.hr = S_OK; hr = CoCreateInstanceEx(CLSID_SimpleObject, NULL, CLSCTX_SERVER, pcsi, 1, &mq); if (FAILED(hr)) printf("Failed to create object - 0x%X", hr); else { LPSIMPLEOBJECT pObj = (LPSIMPLEOBJECT)mq.pItf; // Fill random elements of the array FillArray(); // Pass it to the server hr = pObj->DisplayArray(&flagsArray[0]); if (FAILED(hr)) printf("Failed to display array - 0x%X", hr); pObj->Release(); } CoUninitialize(); return 0; } // Fills the array of BOOLs with a random mixture of 1's and // 0's - Also prints the contents of the array for comparison // with the servers void FillArray() { memset(&flagsArray, 0, sizeof(flagsArray)); srand((unsigned)time( NULL ) ); for (int i = 0;i < FLAG_ARRAY_SIZE;i++) { if (rand() & 1) flagsArray[i] = 1; printf("%d ", flagsArray[i]); } } //End of File