指標變數 PVOID lpbuffer 指向一個記憶體位址,
變數 GUID g = {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}};
typecho2017-06-17 09:17:56
根據MSDN上GUID structure的定義
typedef struct _GUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
GUID是一個結構體,其沒有重載==運算符,所以要想比較2個GUID,要么實現==運算符,要么老老實地逐個比較成員變數。
// PVOID lpbuffer;
// GUID g = {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}};
GUID *p = (GUID*)lpbuffer;
BOOL flag = FALSE;
if ((*p->Data1 == g.Data1)
&& (*p->Data2 == g.Data2)
&& (*p->Data3 == g.Data3)){
flag = TRUE;
for(int i; i < 8; i++){
if (*p->Data4[i] != g.Data4[i]){
flag = FALSE;
}
}
}
// flag变量为比较结果
学习ing2017-06-17 09:17:56
分兩種情況:
位址不同,假設GUID類型重載了==運算子
if (lpbuffer != &g && *(*GUID)lpbuffer == g) {} // *为取值符,判断指针指向地址存放的值是否等于变量g
位址相同,位元組數相同則相等
if (lpbuffer == &g && sizeof(*lpbuffer) == sizeof(g)) {} // &为取地址符,判断指针是否指向变量g的地址
至於GUID類型未重載==運算符但知道其內部結構的可以參見其他答主@一代鍵客的答案
而GUID型別未重載==運算子也不知道其內部結構我覺得可以逐字節比較
if (sizeof(*lpbuffer) != sizeof(g)) return false;
size_t size = sizeof(*lpbuffer);
size_t i = 0;
char* p1 = (char*)lpbuffer;
char* p2 = &g;
while ( i != size ) {
if (*p1 != *p2) return false;
p1++;
p2++;
i++;
}
return true;