1 /** 2 * 消した矢印を元に戻す。 3 * 4 * Author: $(LINK2 https://twitter.com/dokutoku3, dokutoku) 5 * License: $(LINK2 https://creativecommons.org/publicdomain/zero/1.0/, CC0 1.0 Universal) 6 */ 7 module remove_shortcut_arrow.restore; 8 9 10 version (Windows): 11 12 version (NON_WINREG) { 13 } else { 14 version = IS_WINREG; 15 } 16 17 private static import core.sys.windows.winbase; 18 private static import core.sys.windows.windef; 19 private static import core.sys.windows.winnt; 20 private static import remove_shortcut_arrow.command; 21 private static import remove_shortcut_arrow.path; 22 private static import remove_shortcut_arrow.registory; 23 24 /** 25 * プログラムのディレクトリからファイルを削除する。 26 */ 27 nothrow @nogc 28 private bool delete_files(const core.sys.windows.winnt.LPCWSTR ico_path, const core.sys.windows.winnt.LPCWSTR program_path) 29 30 do 31 { 32 if (core.sys.windows.winbase.DeleteFileW(ico_path) == core.sys.windows.windef.FALSE) { 33 return false; 34 } 35 36 return core.sys.windows.winbase.RemoveDirectoryW(program_path) != core.sys.windows.windef.FALSE; 37 } 38 39 /** 40 * 削除したショートカットアイコンを元に戻す。 41 */ 42 version (IS_WINREG) 43 extern (C) 44 nothrow @nogc 45 public bool restore_windows_shortcut_arrow() 46 47 do 48 { 49 bool result1 = remove_shortcut_arrow.registory.delete_registory(); 50 51 remove_shortcut_arrow.path.program_path_buffer buffer = void; 52 53 bool result2 = remove_shortcut_arrow.path.get_program_path(buffer); 54 55 if (result2) { 56 result2 = .delete_files(&(buffer.ico_path[0]), &(buffer.program_path[0])); 57 } 58 59 return (result1) && (result2); 60 } 61 62 /** 63 * REGコマンドを利用して、レジストリの特定の値を削除する 64 */ 65 extern (C) 66 nothrow @nogc 67 public bool exec_restore_windows_shortcut_arrow_command() 68 69 do 70 { 71 //Unicode版はバッファに入れなければならない 72 wchar[remove_shortcut_arrow.command.REG_DELETE_COMMAND_BUFFER_LENGTH] command_buffer = void; 73 74 if (!remove_shortcut_arrow.command.copy_restore_windows_shortcut_arrow_command(&(command_buffer[0]), command_buffer.length)) { 75 return false; 76 } 77 78 return remove_shortcut_arrow.command.exec_system32_command(&(command_buffer[0])); 79 } 80 81 /** 82 * REGコマンドを利用して、削除したショートカットアイコンを元に戻す。 83 */ 84 extern (C) 85 nothrow @nogc 86 public bool reg_restore_windows_shortcut_arrow() 87 88 do 89 { 90 bool result1 = .exec_restore_windows_shortcut_arrow_command(); 91 92 remove_shortcut_arrow.path.program_path_buffer buffer = void; 93 94 bool result2 = remove_shortcut_arrow.path.get_program_path(buffer); 95 96 if (result2) { 97 result2 = .delete_files(&(buffer.ico_path[0]), &(buffer.program_path[0])); 98 } 99 100 return (result1) && (result2); 101 } 102 103 version (RESTORE_SHORTCUT_ARROW) 104 extern (Windows) 105 nothrow @nogc 106 int WinMain(core.sys.windows.windef.HINSTANCE hInstance, core.sys.windows.windef.HINSTANCE hPrevInstance, core.sys.windows.winnt.LPSTR pCmdLine, int nCmdShow) 107 108 do 109 { 110 version (IS_WINREG) { 111 return (.restore_windows_shortcut_arrow()) ? (0) : (1); 112 } else { 113 return (.reg_restore_windows_shortcut_arrow()) ? (0) : (1); 114 } 115 }