| 380 | } |
| 381 | |
| 382 | HRESULT |
| 383 | SERVER::do_unregister() { |
| 384 | LOG(); |
| 385 | TCHAR class_id[MAX_PATH]; |
| 386 | LPWSTR tmp_guid; |
| 387 | HRESULT ret = SELFREG_E_CLASS; |
| 388 | |
| 389 | if (StringFromIID(CLSID_DIFF_EXT, &tmp_guid) == S_OK) { |
| 390 | _tcsncpy(class_id, tmp_guid, MAX_PATH); |
| 391 | |
| 392 | CoTaskMemFree((void*)tmp_guid); |
| 393 | |
| 394 | LRESULT result = NOERROR; |
| 395 | TCHAR subkey[MAX_PATH]; |
| 396 | |
| 397 | REGSTRUCT entry[] = { |
| 398 | {TEXT("Software\\Classes\\CLSID\\%s\\InProcServer32"), nullptr, nullptr}, |
| 399 | {TEXT("Software\\Classes\\CLSID\\%s"), nullptr, nullptr} |
| 400 | }; |
| 401 | |
| 402 | for(unsigned int i = 0; (i < sizeof(entry)/sizeof(entry[0])) && (result == NOERROR); i++) { |
| 403 | _stprintf(subkey, entry[i].subkey, class_id); |
| 404 | result = RegDeleteKey(HKEY_CURRENT_USER, subkey); |
| 405 | } |
| 406 | |
| 407 | if(result == NOERROR) { |
| 408 | result = RegDeleteKey(HKEY_CURRENT_USER, TEXT("Software\\Classes\\*\\shellex\\ContextMenuHandlers\\kdiff3ext")); |
| 409 | |
| 410 | if(result == NOERROR) { |
| 411 | // NT needs to have shell extensions "approved". |
| 412 | HKEY key; |
| 413 | |
| 414 | RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"), 0, KEY_ALL_ACCESS, &key); |
| 415 | |
| 416 | result = RegDeleteValue(key, class_id); |
| 417 | |
| 418 | RegCloseKey(key); |
| 419 | |
| 420 | if(result == ERROR_SUCCESS) { |
| 421 | ret = S_OK; |
| 422 | } |
| 423 | } |
| 424 | } |
| 425 | } |
| 426 | |
| 427 | return ret; |
| 428 | } |
no outgoing calls
no test coverage detected