client.cpp
上传用户:bjlvip
上传日期:2010-02-08
资源大小:744k
文件大小:3k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // client.cpp
  2. #include <iostream.h>
  3. #include "Componentcomponent.h" // Generated by MIDL
  4. void main()
  5. {
  6. cout << "Client: Calling CoInitialize()" << endl;
  7. CoInitialize(NULL);
  8. IUnknown* pUnknown;
  9. IDispatch* pDispatch;
  10. cout << "Client: Calling CoCreateInstance()" << endl;
  11. CoCreateInstance(CLSID_InsideCOM, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
  12. cout << "Client: Calling QueryInterface() for IDispatch on " << pUnknown << endl;
  13. pUnknown->QueryInterface(IID_IDispatch, (void**)&pDispatch);
  14. cout << "Client: Calling Release() for IUnknown on " << pUnknown << endl;
  15. pUnknown->Release();
  16. cout << "Client: Calling GetIDsOfNames" << endl;
  17. OLECHAR* name = L"Sum";
  18. DISPID dispid;
  19. pDispatch->GetIDsOfNames(IID_NULL, &name, 1, GetUserDefaultLCID(), &dispid);
  20. cout << "GetIDsOfNames(Sum) = " << dispid << endl;
  21. // Using positional parameters
  22. VARIANTARG SumArgsPos[2];
  23. VariantInit(&SumArgsPos[0]);
  24. SumArgsPos[0].vt = VT_I4;
  25. SumArgsPos[0].lVal = 7;
  26. VariantInit(&SumArgsPos[1]);
  27. SumArgsPos[1].vt = VT_I4;
  28. SumArgsPos[1].lVal = 2;
  29. VARIANT result;
  30. VariantInit(&result);
  31. DISPPARAMS Params1 = { SumArgsPos, NULL, 2, 0 };
  32. if(FAILED(pDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &Params1, &result, NULL, NULL)))
  33. cout << "pDispatch->Invoke() failed" << endl;
  34. cout << SumArgsPos[0].lVal << " + " << SumArgsPos[1].lVal << " = " << result.lVal << endl;
  35. // Using named arguments
  36. VARIANTARG SumArgsName[2];
  37. VariantInit(&SumArgsName[0]);
  38. SumArgsName[0].vt = VT_I4;
  39. SumArgsName[0].lVal = 5; // normally y
  40. SumArgsName[1].vt = VT_I4;
  41. SumArgsName[1].lVal = 7; // normally x
  42. DISPID DispIds[2] = { 0, 1 }; // y first, then x
  43. DISPPARAMS Params2 = { SumArgsName, DispIds, 2, 2 };
  44. if(FAILED(pDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &Params2, &result, NULL, NULL)))
  45. cout << "pDispatch->Invoke() failed" << endl;
  46. cout << SumArgsName[0].lVal << " + " << SumArgsName[1].lVal << " = " << result.lVal << endl;
  47. // Using positional optional arguments
  48. VARIANTARG SumArgsOpt[2];
  49. VariantInit(&SumArgsOpt[0]);
  50. SumArgsOpt[0].vt = VT_ERROR;
  51. SumArgsOpt[0].scode = DISP_E_PARAMNOTFOUND; // normally y
  52. VariantInit(&SumArgsOpt[1]);
  53. SumArgsOpt[1].vt = VT_I4;
  54. SumArgsOpt[1].lVal = 3; // normally x
  55. DISPPARAMS Params3 = { SumArgsOpt, NULL, 2, 0 };
  56. if(FAILED(pDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &Params3, &result, NULL, NULL)))
  57. cout << "pDispatch->Invoke() failed" << endl;
  58. cout << "Default + " << SumArgsOpt[1].lVal << " = " << result.lVal << endl;
  59. // Using named optional arguments
  60. VARIANTARG SumArg;
  61. VariantInit(&SumArg);
  62. SumArg.vt = VT_I4;
  63. SumArg.lVal = 5;
  64. DISPID DispId = 1; // The y parameter
  65. DISPPARAMS Params4 = { &SumArg, &DispId, 1, 1 };
  66. if(FAILED(pDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &Params4, &result, NULL, NULL)))
  67. cout << "pDispatch->Invoke() failed" << endl;
  68. cout << "Default + " << SumArg.lVal << " = " << result.lVal << endl;
  69. pDispatch->Release();
  70. cout << "Client: Calling CoUninitialize()" << endl;
  71. CoUninitialize();
  72. }