idl文件当中定义的helpstring等属性,怎么在客户端显示出来
idl文件当中定义的helpstring等属性,如何在客户端显示出来?
例如,一个实现了IDispatch的组件,在客户端程序用MFC来导入类型库,VS自动为我声明一个包装类,这个包装类可以用来Invoke组件的函数。
我的问题是: 这个组件是用ATL实现的,某些接口和函数里面有[helpstring]这样的属性。请问: 客户端程序能否得到并显示这些类型库当中的helpstring? 如何编码呢?
谢谢。
------解决方案--------------------
vc6 的 msdn 中有, 后来微软给去掉了
就是通过 dispatch 接口得到类型信息.
看看 msdn 中:
Win32 and COM Development
Component Development
Automation
SDK Documentation
Type Description Interface
下面的接口, 自己也能写出来.
例如,一个实现了IDispatch的组件,在客户端程序用MFC来导入类型库,VS自动为我声明一个包装类,这个包装类可以用来Invoke组件的函数。
我的问题是: 这个组件是用ATL实现的,某些接口和函数里面有[helpstring]这样的属性。请问: 客户端程序能否得到并显示这些类型库当中的helpstring? 如何编码呢?
谢谢。
------解决方案--------------------
vc6 的 msdn 中有, 后来微软给去掉了
就是通过 dispatch 接口得到类型信息.
看看 msdn 中:
Win32 and COM Development
Component Development
Automation
SDK Documentation
Type Description Interface
下面的接口, 自己也能写出来.
void
typetree::load(IDispatch* pDisp)
{
//remove all nodes
DeleteAllItems();
// release previous if loaded
release();
UINT cCount=0;
HRESULT hr = pDisp->GetTypeInfoCount(&cCount);
for (UINT i = 0; i < cCount; i++) {
ITypeInfo* pTypeInfo = 0;
pDisp->GetTypeInfo(i, LOCALE_USER_DEFAULT, &pTypeInfo);
walkTypeInfo(pTypeInfo, TVI_ROOT);
}
}
void
typetree::walkTypeInfo(ITypeInfo* pTypeInfo, HTREEITEM hParentItem)
{
WORD cFuncs, cVars, cImplTypes;
TYPEKIND typekind;
TYPEATTR* pTypeAttr = 0;
TCHAR szText[128];
CStdString str;
HTREEITEM hItem;
HRESULT hr = pTypeInfo->GetTypeAttr(&pTypeAttr);
if (SUCCEEDED(hr)) {
GUID guid = pTypeAttr->guid;
LCID lcid = pTypeAttr->lcid;
DWORD dwReserved = pTypeAttr->dwReserved;
MEMBERID memidConstructor = pTypeAttr->memidConstructor;
MEMBERID memidDestructor = pTypeAttr->memidDestructor;
LPOLESTR lpstrSchema = pTypeAttr->lpstrSchema;
ULONG cbSizeInstance = pTypeAttr->cbSizeInstance;
typekind = pTypeAttr->typekind;
cFuncs = pTypeAttr->cFuncs;
cVars = pTypeAttr->cVars;
cImplTypes = pTypeAttr->cImplTypes;
WORD cbSizeVft = pTypeAttr->cbSizeVft;
WORD cbAlignment = pTypeAttr->cbAlignment;
WORD wTypeFlags = pTypeAttr->wTypeFlags;
WORD wMajorVerNum = pTypeAttr->wMajorVerNum;
WORD wMinorVerNum = pTypeAttr->wMinorVerNum;
TYPEDESC tdescAlias = pTypeAttr->tdescAlias;
IDLDESC idldescType = pTypeAttr->idldescType;
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
} else {
return;
}
{
BSTR name, docString, helpFile;
DWORD dwHelpContext;
//If the passed-in memid is MEMBERID_NIL, then the documentation for the type description is returned.
pTypeInfo->GetDocumentation(MEMBERID_NIL, &name, &docString, &dwHelpContext, &helpFile);
_stprintf(szText, _T("%s [%s]"), (LPCTSTR)name, typeKindToStr(typekind, str));
SysFreeString(name);SysFreeString(docString);SysFreeString(helpFile);
}
switch (typekind)
{
case TKIND_ENUM:
hItem = InsertItem(hParentItem, NULL, szText, NULL, 4, 4);
break;
case TKIND_RECORD:
hItem = InsertItem(hParentItem, NULL, szText, NULL, 0, 0);
break;
case TKIND_MODULE:
hItem = InsertItem(hParentItem, NULL, szText, NULL, 14, 14);
break;
case TKIND_INTERFACE:
case TKIND_DISPATCH:
{
hItem = InsertItem(hParentItem, NULL, szText, NULL, 8, 8);
walkVariables(pTypeInfo, cVars, hItem);
walkFunctions(pTypeInfo, cFuncs, hItem);