Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ITypeLib:GetLibAttr和ReleaseTLibAttr_C++_Com_Win32com_Typelib - Fatal编程技术网

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;