C++ ITypeLib:GetLibAttr和ReleaseTLibAttr
问题:C++ ITypeLib:GetLibAttr和ReleaseTLibAttr,c++,com,win32com,typelib,C++,Com,Win32com,Typelib,问题:ITypeLib::GetLibAttr()方法分配了一个新的TLIBATTR结构,需要我调用ITypeLib::ReleaseTLibAttr()?这使得代码过于冗长,不合我的口味,如果忽略它,可能会导致内存泄漏 如果缓存结果,然后调用ReleaseTLibAttr(),那么在使用缓存值时是否存在任何副作用或潜在陷阱 TLIBATTR结构只是一组简单的值: 没有成员本身是动态分配的。也许这会有所改变 我编写了一个简单的helper方法来防止调用ReleaseTLibAttr() H
ITypeLib::GetLibAttr()
方法分配了一个新的TLIBATTR
结构,需要我调用ITypeLib::ReleaseTLibAttr()
?这使得代码过于冗长,不合我的口味,如果忽略它,可能会导致内存泄漏
如果缓存结果,然后调用ReleaseTLibAttr()
,那么在使用缓存值时是否存在任何副作用或潜在陷阱
TLIBATTR结构只是一组简单的值: 没有成员本身是动态分配的。也许这会有所改变
我编写了一个简单的helper方法来防止调用
ReleaseTLibAttr()
HRESULT MyGetLibAttr(ITypeLib*pTypeLib,TLIBATTR*pTLibAttr)
{
TLIBATTR*pTLibAttrTemp;
HRESULT hr=pTypeLib->GetLibAttr(&ptlibattrtertemp);
如果(成功(hr))
{
memcpy(pTLibAttr,pTLibAttrTemp,sizeof(TLIBATTR));
pTypeLib->ReleaseTLibAttr(pTLibAttrTemp);
}
返回人力资源;
}
void main()
{
ITypeLib*pTypeLib;
HRESULT hr=LoadTypeLibEx(…,&pTypeLib);
如果(成功(hr))
{
TLIBATTR-libAttr;
hr=MyGetLibAttr(pTypeLib和libAttr);
如果(成功(hr))
{
//现在我们有了一个不需要释放的TLIBATTR对象。
}
pTypeLib->Release();
}
}
在1到10的范围内,未来的证明是什么?使用缓存结果是否有任何副作用
我意识到对性能的影响很小(额外调用
memcpy()
),但我们更关心的是代码维护和内存泄漏。接口方法早在1996年就这样设计,因为他们不想失去向结构中添加成员的机会。事实上,这并没有发生,TLIBATTR已经稳定了19年。微软已经不再使用.tlb格式,现在使用的是.winmd格式
如果.NET Framework让您感觉更好的话。您的代码没有问题。
您可以在-ITypeLib2\u fnGetLibAttr查看GetLibAttr的源代码。
因为您已经加载了TypeLib,所以在下次加载TLB文件之前,guid、lcid、syskind、wMajorVerNum、wMinorVerNum、wLibFlags不能更改,并且只有在该文件更改的情况下才能更改。谢谢,这非常有帮助!好奇的是,你有什么理由把Alexenrie/wine回购与wine mirror/wine回购联系起来?没什么大不了的,只是好奇而已。从表面上看,这个似乎更“正式”:@skataben。是的,你是对的,官方链接更正确。亚历克谢里·林克在这里没有什么特别的理由。这只是我找到的葡萄酒项目的第一个链接。
typedef struct tagTLIBATTR
{
GUID guid;
LCID lcid;
SYSKIND syskind;
WORD wMajorVerNum;
WORD wMinorVerNum;
WORD wLibFlags;
} TLIBATTR;