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

Windows编程

开发平台:

Visual C++

  1. // This program creates a type library that exactly matches that produced by
  2. // the MIDL compiler when fed the IDL shown here. The comments found to the
  3. // right of each line of IDL code will direct to the code that creates that
  4. // element of the type library.
  5. // Use the OLE/COM Object Viewer to view the contents of the TLB file
  6. /*
  7. import "unknwn.idl";
  8. [ object, uuid(10000001-0000-0000-0000-000000000001), // (6)
  9.   oleautomation ] // (7)
  10. interface ISum // (5)
  11. : IUnknown // (12)
  12. {
  13. HRESULT Sum(int x, int y, [out, retval] int* retval); // (13)
  14. }
  15. [ uuid(10000003-0000-0000-0000-000000000001), // (1)
  16.   helpstring("Inside COM+ Component Type Library"), // (4)
  17.   version(1.0) ] // (3)
  18. library Component // (2)
  19. {
  20. importlib("stdole32.tlb"); // (12)
  21. interface ISum;
  22. [ uuid(10000002-0000-0000-0000-000000000001) ] // (9)
  23. coclass InsideCOM // (8)
  24. {
  25. [default] // (11)
  26. interface ISum; // (10)
  27. }
  28. };
  29. */
  30. #define _WIN32_DCOM
  31. #include <windows.h>
  32. #include <iostream.h>
  33. #include <stdio.h>
  34. void main()
  35. {
  36. CoInitialize(NULL);
  37. // Create the type library file
  38. ICreateTypeLib2* pCreateTypeLib2;
  39. CreateTypeLib2(SYS_WIN32, L"C:\MYLIB.TLB", &pCreateTypeLib2);
  40. // (1) Set the library LIBID to {10000003-0000-0000-0000-000000000001}
  41. GUID LIBID_Component = {0x10000003,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}};
  42. pCreateTypeLib2->SetGuid(LIBID_Component);
  43. // (2) Set the library name to Component
  44. pCreateTypeLib2->SetName(L"Component");
  45. // (3) Set the library version to 1.0
  46. pCreateTypeLib2->SetVersion(1, 0);
  47. // (4) Set the helpstring to Inside COM+ Component Type Library
  48. pCreateTypeLib2->SetDocString(L"Inside COM+ Component Type Library");
  49. pCreateTypeLib2->SetLcid(LANG_NEUTRAL);
  50. // (5) Create the ISum interface
  51. ICreateTypeInfo* pCreateTypeInfoInterface;
  52. pCreateTypeLib2->CreateTypeInfo(L"ISum", TKIND_INTERFACE, &pCreateTypeInfoInterface);
  53. ICreateTypeInfo2* pCreateTypeInfo2 = 0;
  54. HRESULT hr = pCreateTypeInfoInterface->QueryInterface(IID_ICreateTypeInfo2, (void**)&pCreateTypeInfo2);
  55. printf("pTypeCreateTypeInfo2 hr = %0xn", hr);
  56. pCreateTypeInfo2->Release();
  57. // (6) Set the ISum IID to {10000001-0000-0000-0000-000000000001}
  58. IID IID_ISum = {0x10000001,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}};
  59. pCreateTypeInfoInterface->SetGuid(IID_ISum);
  60. // (7) Set the oleautomation flag
  61. pCreateTypeInfoInterface->SetTypeFlags(TYPEFLAG_FOLEAUTOMATION);
  62. // (8) Create the coclass InsideCOM
  63. ICreateTypeInfo* pCreateTypeInfoCoClass;
  64. pCreateTypeLib2->CreateTypeInfo(L"InsideCOM", TKIND_COCLASS, &pCreateTypeInfoCoClass);
  65. // (9) Set the InsideCOM CLSID to {10000002-0000-0000-0000-000000000001}
  66. CLSID CLSID_InsideCOM = {0x10000002,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}};
  67. pCreateTypeInfoCoClass->SetGuid(CLSID_InsideCOM);
  68. // Specify that this coclass can be instantiated
  69. pCreateTypeInfoCoClass->SetTypeFlags(TYPEFLAG_FCANCREATE);
  70. // Get a pointer to the ITypeLib interface
  71.     ITypeLib* pTypeLib;
  72. pCreateTypeLib2->QueryInterface(IID_ITypeLib, (void**)&pTypeLib);
  73. ITypeLib2* pTypeLib2 = 0;
  74. hr = pTypeLib->QueryInterface(IID_ITypeLib2, (void**)&pTypeLib2);
  75. printf("pTypeLib2 hr = %0xn", hr);
  76. pTypeLib2->Release();
  77. // Get a pointer to the ITypeInfo interface for ISum
  78.     ITypeInfo* pTypeInfo;
  79.     pTypeLib->GetTypeInfoOfGuid(IID_ISum, &pTypeInfo);
  80. ITypeInfo2* pTypeInfo2 = 0;
  81. hr = pTypeInfo->QueryInterface(IID_ITypeInfo2, (void**)&pTypeInfo2);
  82. printf("pTypeInfo2 hr = %0xn", hr);
  83. pTypeInfo2->Release();
  84. // Trade in the ITypeInfo pointer for an HREFTYPE
  85. HREFTYPE hRefTypeISum;
  86. pCreateTypeInfoCoClass->AddRefTypeInfo(pTypeInfo, &hRefTypeISum);
  87. // (10) Insert the ISum interface into the InsideCOM coclass
  88.     pCreateTypeInfoCoClass->AddImplType(0, hRefTypeISum);
  89. // (11) Set ISum to be the default interface in coclass InsideCOM
  90. pCreateTypeInfoCoClass->SetImplTypeFlags(0, IMPLTYPEFLAG_FDEFAULT);
  91. // Get a pointer to the ITypeLib interface for StdOLE
  92.     ITypeLib* pTypeLibStdOle;
  93. GUID GUID_STDOLE = {0x00020430,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46};
  94.     LoadRegTypeLib(GUID_STDOLE, STDOLE_MAJORVERNUM, STDOLE_MINORVERNUM, STDOLE_LCID, &pTypeLibStdOle);
  95. // Get a pointer to the ITypeInfo interface for IUnknown
  96.     ITypeInfo* pTypeInfoUnknown;
  97.     pTypeLibStdOle->GetTypeInfoOfGuid(IID_IUnknown, &pTypeInfoUnknown);
  98. // (12) Declare that ISum is derived from IUnknown
  99.     HREFTYPE hRefType;
  100. pCreateTypeInfoInterface->AddRefTypeInfo(pTypeInfoUnknown, &hRefType);
  101. pCreateTypeInfoInterface->AddImplType(0, hRefType);
  102. // Structures for the x, y, and retval parameters of the Sum method
  103. TYPEDESC tdescParams = { 0 };
  104.     tdescParams.vt = VT_INT;
  105. ELEMDESC myParams[3] = { 0 };
  106. myParams[0].tdesc.vt = VT_INT;
  107. myParams[0].tdesc.lptdesc = &tdescParams;
  108. myParams[1].tdesc.vt = VT_INT;
  109. myParams[1].tdesc.lptdesc = &tdescParams;
  110. myParams[2].tdesc.vt = VT_PTR;
  111. myParams[2].tdesc.lptdesc = &tdescParams;
  112. myParams[2].paramdesc.wParamFlags = PARAMFLAG_FRETVAL|PARAMFLAG_FOUT;
  113. // Additional data describing the Sum method and its return value
  114. TYPEDESC tdescUser = { 0 };
  115.     FUNCDESC FuncDesc = { 0 };
  116. FuncDesc.funckind = FUNC_PUREVIRTUAL;
  117.     FuncDesc.invkind = INVOKE_FUNC;
  118.     FuncDesc.callconv = CC_STDCALL;
  119. // Parameters
  120. FuncDesc.cParams = 3;
  121. FuncDesc.lprgelemdescParam = myParams;
  122. // HRESULT return value
  123.     FuncDesc.elemdescFunc.tdesc.vt = VT_HRESULT;
  124.     FuncDesc.elemdescFunc.tdesc.lptdesc = &tdescUser;
  125. // (13) Add the Sum method to the ISum interface
  126. pCreateTypeInfoInterface->AddFuncDesc(0, &FuncDesc);
  127. // Set names for the Sum function and its parameters
  128. OLECHAR* Names[4] = { L"Sum", L"x", L"y", L"retval" };
  129. pCreateTypeInfoInterface->SetFuncAndParamNames(0, Names, 4);
  130. // Assign the v-table layout
  131. pCreateTypeInfoInterface->LayOut();
  132. // Save changes to disk
  133. pCreateTypeLib2->SaveAllChanges();
  134. // Release all references
  135. pTypeInfoUnknown->Release();
  136. pTypeLibStdOle->Release();
  137.     pTypeInfo->Release();
  138. pTypeLib->Release();
  139. pCreateTypeLib2->Release();
  140. pCreateTypeInfoInterface->Release();
  141. pCreateTypeInfoCoClass->Release();
  142. CoUninitialize();
  143. cout << "Type library created: C:\MYLIB.TLB" << endl;
  144. }