sha*_*oth 7 c++ com visual-c++
Windows SDK具有IsEqualGUID()函数和operator==()两个返回BOOL(相当于int)的GUID :
// Guiddef.h
#ifdef __cplusplus
__inline int IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
{
return !memcmp(&rguid1, &rguid2, sizeof(GUID));
}
#else // ! __cplusplus
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
#endif
//also in Guiidef.h
#ifdef __cplusplus
__inline int operator==(REFGUID guidOne, REFGUID guidOther)
{
return IsEqualGUID(guidOne,guidOther);
}
#endif
Run Code Online (Sandbox Code Playgroud)
有什么意义int呢?我知道C没有bool数据类型,但是有一个#ifdef __cplusplus,所以这个代码只能编译为C++,所以bool无论如何都会支持.有一个否定接近memcmp()有效地将所有可能的值memcmp()转换为零和非零.
C中也没有用户定义的运算符 - 只有C++支持它们.所以operator==无论如何都不会用C代码编译.
有没有理由选择int而不是在bool这里?
因为Windows API IsEqualGUID()作为返回的函数公开BOOL.他们需要保持稳定的界面.BOOL和bool大小不同,以及Windows API的设计是用各种语言和编译器兼容.请记住,除了C++之外,还有其他语言可以与Windows API进行交互.
在C和C++上,IsEqualGUID()实现方式memcmp(),但IsEqualGUID()也实现ole32.dll.您可以从ole32.dll以下位置获取该功能:
REFGUID guid1 = IID_IUnknown;
REFGUID guid2 = IID_AsyncIUnknown;
typedef BOOL (WINAPI *IsEqualGUIDFuncType)(REFGUID, REFGUID);
HMODULE h = ::LoadLibrary("ole32.dll");
IsEqualGUIDFuncType f = reinterpret_cast<IsEqualGUIDFuncType>
(::GetProcAddress(h, "IsEqualGUID"));
if(f != NULL)
{
if(f(guid1, guid2) != 0)
::printf("true\n");
else
::printf("false\n");
}
::FreeLibrary(h);
Run Code Online (Sandbox Code Playgroud)
所以,即使它在C++内联函数来实现,其他语言可以使用的DLL实现IsEqualGUID().C++版本返回一个BOOL与API一致的版本.
| 归档时间: |
|
| 查看次数: |
3043 次 |
| 最近记录: |