#COMPILE EXE "linkedit.exe" #DIM ALL #RESOURCE "linkedit.pbr" '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #INCLUDE ONCE "WIN32API.INC" #INCLUDE ONCE "SHORTCUT.INC" #INCLUDE ONCE "FILEDATE.INC" #INCLUDE ONCE "ICON.INC" '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Types & Unions ** '------------------------------------------------------------------------------ TYPE NM_LISTVIEW DWORD hdr AS NMHDR ' NMHDR hdr iItem AS LONG ' int iItem iSubItem AS LONG ' int iSubItem uNewState AS DWORD ' UINT uNewState uOldState AS DWORD ' UINT uOldState uChanged AS DWORD ' UINT uChanged ptAction AS POINT ' POINT ptAction lParam AS LONG ' LPARAM lParam END TYPE '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------ %IDC_BUTTON1 = 1001 %IDC_BUTTON2 = 1002 %IDC_BUTTON3 = 1003 %IDC_TAB1 = 1004 %IDC_GRAPHIC1 = 1005 %IDC_TEXTBOX1 = 1006 %IDC_LINE1 = 1007 %IDC_LABEL1 = 1008 %IDC_LABEL2 = 1009 %IDC_LABEL3 = 1010 %IDC_LABEL4 = 1011 %IDC_LINE2 = 1012 %IDC_LABEL5 = 1013 %IDC_LABEL6 = 1014 %IDC_LABEL7 = 1015 %IDC_LABEL8 = 1016 %IDC_LABEL9 = 1017 %IDC_LABEL10 = 1018 %IDC_LINE3 = 1019 %IDC_GRAPHIC2 = 1020 %IDC_LABEL11 = 1021 %IDC_LABEL12 = 1022 %IDC_LABEL13 = 1023 %IDC_LABEL14 = 1024 %IDC_LABEL15 = 1025 %IDC_LABEL16 = 1026 %IDC_LINE4 = 1027 %IDC_LABEL17 = 1028 %IDC_CHECKBOX1 = 1029 %IDC_CHECKBOX2 = 1030 %IDC_TEXTBOX2 = 1031 %IDC_TEXTBOX3 = 1032 %IDC_TEXTBOX4 = 1033 %IDC_TEXTBOX5 = 1034 %IDC_TEXTBOX6 = 1035 %IDC_LISTVIEW1 = 1036 '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Globals ** '------------------------------------------------------------------------------ GLOBAL g_lnk AS LINKTYPE GLOBAL g_txt() AS STRING GLOBAL g_icof AS STRING GLOBAL g_hTab() AS DWORD GLOBAL g_icoc AS LONG GLOBAL g_chk1 AS LONG GLOBAL g_chk2 AS LONG '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Macros ** '------------------------------------------------------------------------------ MACRO M_ACT_CHANGE change = %TRUE CONTROL ENABLE GETPARENT(g_hTab(1)), %IDC_BUTTON1 ' Apply btn EXIT FUNCTION END MACRO '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ MACRO M_DRAWICON_IN_TAB1AND2 '************************************************************************** '* Tab #1 : General * '************************************************************************** GRAPHIC ATTACH g_hTab(1), %IDC_GRAPHIC1 GRAPHIC CLEAR GraphicDrawIconDll g_hTab(1), %IDC_GRAPHIC1, _ g_lnk.zIconFile, g_lnk.IconIndex, 0, 0, 32, 32 GRAPHIC ATTACH g_hTab(1), %IDC_GRAPHIC1 GRAPHIC RENDER "BMP", (0,19)-(12,31) '************************************************************************** '* Tab #2 : Shortcut * '************************************************************************** GRAPHIC ATTACH g_hTab(2), %IDC_GRAPHIC2 GRAPHIC CLEAR GraphicDrawIconDll g_hTab(2), %IDC_GRAPHIC2, _ g_lnk.zIconFile, g_lnk.IconIndex, 0, 0, 32, 32 GRAPHIC ATTACH g_hTab(2), %IDC_GRAPHIC2 GRAPHIC RENDER "BMP", (0,19)-(12,31) END MACRO '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------ FUNCTION PBMAIN() LOCAL s AS STRING s = TRIM$(COMMAND$, ANY $SPC+$TAB+$DQ) IF RIGHT$(LCASE$(s), 4) <> ".lnk" THEN ?"Error: argument needed."+$CR+$CR _ +"Either call ""linkedit myshortcut.lnk"""+$CR _ +"on the command line"+$CR _ +"-or-"+$CR _ +"drag and drop a Windows shortcut"+$CR _ +"onto this program." _ ,%MB_ICONINFORMATION ,"linkedit" EXIT FUNCTION END IF ' Parse shortcut from argument g_lnk.zLinkFolder = PATHNAME$(PATH, s) g_lnk.zLinkName = PATHNAME$(NAMEX, s) ' Show main dialog MainShow %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION MainShow(BYVAL hParent AS DWORD) AS LONG LOCAL hDlg AS DWORD LOCAL lRslt AS LONG LOCAL lStyle AS LONG DIALOG NEW PIXELS, hParent, "Properties",,, 364, 518, %WS_POPUP _ OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg DIALOG SET ICON hDlg, "AICO" CONTROL ADD BUTTON, hDlg, %IDOK, "OK", 120, 489, 72, 22 DIALOG SEND hDlg, %DM_SETDEFID, %IDOK, 0 CONTROL ADD BUTTON, hDlg, %IDCANCEL, "Cancel", 200, 489, 72, 22 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "&Apply", 280, 489, 72, 22 CONTROL DISABLE hDlg, %IDC_BUTTON1 DIM g_hTab(1 TO 3) AS DWORD CONTROL ADD TAB, hDlg, %IDC_TAB1, "Tab", 10, 10, 344, 470 TAB INSERT PAGE hDlg, %IDC_TAB1, 1, 0, "General" CALL MainProc TO g_hTab(1) TAB INSERT PAGE hDlg, %IDC_TAB1, 2, 0, "Shortcut" CALL MainProc TO g_hTab(2) TAB INSERT PAGE hDlg, %IDC_TAB1, 3, 0, "Details" CALL MainProc TO g_hTab(3) TAB SELECT hDlg, %IDC_TAB1, 2 '************************************************************************** '* Tab #1 : General * '************************************************************************** CONTROL ADD GRAPHIC, g_hTab(1), %IDC_GRAPHIC1,"", 14, 12, 32, 32 CONTROL ADD TEXTBOX, g_hTab(1), %IDC_TEXTBOX1,"", 84, 20, 242, 20 ' Shortcut name CONTROL ADD LINE, g_hTab(1), %IDC_LINE1, "---", 8, 52, 318, 1 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Type of file:", 10, 62, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Shortcut (.lnk)", 80, 62, 246, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Description:", 10, 88, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL2, "", 80, 88, 246, 20 CONTROL ADD LINE, g_hTab(1), %IDC_LINE1, "---", 8, 118, 318, 1 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Location:", 10, 128, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL3, "", 80, 128, 246, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Size:", 10, 154, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL4, "", 80, 154, 246, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Size on disk:", 10, 180, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL5, "", 80, 180, 246, 20 CONTROL ADD LINE, g_hTab(1), %IDC_LINE1, "---", 8, 210, 318, 1 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Created:", 10, 224, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL6, "", 80, 224, 246, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Modified:", 10, 250, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL7, "", 80, 250, 246, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Accessed:", 10, 276, 68, 20 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL8, "", 80, 276, 246, 20 CONTROL ADD LINE, g_hTab(1), %IDC_LINE1, "---", 8, 305, 318, 1 CONTROL ADD LABEL, g_hTab(1), %IDC_LABEL1, "Attributes:", 10, 320, 68, 20 CONTROL ADD CHECKBOX, g_hTab(1), %IDC_CHECKBOX1,"&Read-only", 80, 317, 75, 20 CONTROL ADD CHECKBOX, g_hTab(1), %IDC_CHECKBOX2,"&Hidden", 160, 317, 75, 20 '************************************************************************** '* Tab #2 : Shortcut * '************************************************************************** CONTROL ADD GRAPHIC, g_hTab(2), %IDC_GRAPHIC2,"", 14, 12, 32, 32 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL9, "", 84, 20, 242, 20 ' Shortcut name CONTROL ADD LINE, g_hTab(2), %IDC_LINE1, "", 8, 52, 318, 1 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "Target type:", 10, 62, 80, 20 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "Application", 90, 62, 236, 20 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "Target location:", 10, 88, 80, 20 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL10, "", 90, 88, 236, 20 ' folder(1) CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "&Target:", 10, 114, 80, 20 CONTROL ADD TEXTBOX, g_hTab(2), %IDC_TEXTBOX2,"", 90, 112, 236, 20 CONTROL ADD LINE, g_hTab(2), %IDC_LINE1, "", 8, 149, 318, 1 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "&Start in:", 10, 168, 80, 20 CONTROL ADD TEXTBOX, g_hTab(2), %IDC_TEXTBOX3,"", 90, 166, 236, 20 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "Shortcut &key:", 10, 194, 80, 20 CONTROL ADD TEXTBOX, g_hTab(2), %IDC_TEXTBOX4,"None", 90, 192, 236, 20 CONTROL DISABLE g_hTab(2), %IDC_TEXTBOX4 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "&Run:", 10, 220, 80, 20 CONTROL ADD TEXTBOX, g_hTab(2), %IDC_TEXTBOX5,"Normal window", 90, 218, 236, 20 CONTROL DISABLE g_hTab(2), %IDC_TEXTBOX5 CONTROL ADD LABEL, g_hTab(2), %IDC_LABEL1, "C&omment:", 10, 246, 80, 20 CONTROL ADD TEXTBOX, g_hTab(2), %IDC_TEXTBOX6,"", 90, 244, 236, 20 CONTROL ADD BUTTON, g_hTab(2), %IDC_BUTTON2, "Open &File Location", 113, 279, 118, 22 CONTROL ADD BUTTON, g_hTab(2), %IDC_BUTTON3, "&Change Icon...", 239, 279, 90, 22 '************************************************************************** '* Tab #3 : Details * '************************************************************************** CONTROL ADD LISTVIEW, g_hTab(3), %IDC_LISTVIEW1, "Listview1", 14, 14, 316, 356 LISTVIEW GET STYLEXX g_hTab(3), %IDC_LISTVIEW1 TO lStyle lStyle += %LVS_EX_FULLROWSELECT LISTVIEW SET STYLEXX g_hTab(3), %IDC_LISTVIEW1, lStyle LISTVIEW INSERT COLUMN g_hTab(3), %IDC_LISTVIEW1, 1, "Property", 74, 0 LISTVIEW INSERT COLUMN g_hTab(3), %IDC_LISTVIEW1, 2, "Value", 234, 0 DIALOG SHOW MODAL hDlg, CALL MainProc TO lRslt FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION ChgIcoShow(BYVAL hParent AS DWORD) AS LONG LOCAL hDlg AS DWORD LOCAL stylex AS DWORD LOCAL lRslt AS LONG DIALOG NEW PIXELS, hParent, "Change Icon", 36, 96, 292, 326, %WS_POPUP _ OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD BUTTON, hDlg, %IDOK, "OK", 124, 292, 72, 22 DIALOG SEND hDlg, %DM_SETDEFID, %IDOK, 0 CONTROL ADD BUTTON, hDlg, %IDCANCEL, "Cancel", 205, 292, 72, 22 CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "&Look for icons in this file:", 10, 10, 267, 20 CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, g_lnk.zIconFile, 10, 30, 184, 20 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "&Browse", 206, 29, 72, 22 CONTROL ADD LABEL, hDlg, %IDC_LABEL2, "&Select an icon from the list below:", 10, 56, 267, 20 ' Create an icon listview CONTROL ADD LISTVIEW, hDlg, %IDC_LISTVIEW1, "", 12, 78, 266, 198, _ %WS_VISIBLE OR %WS_CHILD OR %WS_HSCROLL OR %LVS_SINGLESEL OR _ %LVS_ICON OR %LVS_AUTOARRANGE OR %LVS_SHOWSELALWAYS, %WS_EX_CLIENTEDGE LISTVIEW INSERT COLUMN hDlg, %IDC_LISTVIEW1, 1, "icon", 32, 0 ' Set the listview extended style and icon spacing LISTVIEW GET STYLEXX hDlg, %IDC_LISTVIEW1 TO stylex stylex += %LVS_EX_ONECLICKACTIVATE + %LVS_EX_BORDERSELECT + %LVS_EX_HIDELABELS LISTVIEW SET STYLEXX hDlg, %IDC_LISTVIEW1, stylex SENDMESSAGE GETDLGITEM(hDlg, %IDC_LISTVIEW1), %LVM_SETICONSPACING, 0, MAK(DWORD,40,50) DIALOG SHOW MODAL hDlg, CALL ChgIcoProc TO lRslt FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION MainProc() STATIC change AS LONG LOCAL txt AS STRING LOCAL chk AS LONG LOCAL lRes AS LONG SELECT CASE AS LONG CB.MSG CASE %WM_INITDIALOG ' Initialization handler change = %TRUE FillShortcutNfo(CB.HNDL) change = %FALSE CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CB.CTL CASE %IDOK SaveShortcut() DIALOG END CB.HNDL CASE %IDCANCEL DIALOG END CB.HNDL CASE %IDC_BUTTON1 ' Apply SaveShortcut() change = %FALSE CONTROL DISABLE CB.HNDL, CB.CTL ' Apply btn CASE %IDC_BUTTON2 ' Open File Location ShellExecute 0, "open", "explorer.exe" + $NUL, "/select," _ + $DQ + RTRIM$(g_lnk.zLinkFolder, "\") + "\" _ + g_lnk.zLinkName + $DQ + $NUL, "", %SW_SHOW CASE %IDC_BUTTON3 ' Change Icon lRes = ChgIcoShow(GETPARENT(g_hTab(2))) IF lRes <> %IDOK THEN EXIT FUNCTION M_DRAWICON_IN_TAB1AND2 IF ISTRUE change THEN EXIT FUNCTION IF g_icof <> g_lnk.zIconFile THEN M_ACT_CHANGE ELSEIF g_icoc <> g_lnk.IconIndex THEN M_ACT_CHANGE END IF CASE %IDC_TEXTBOX1 IF ISTRUE change THEN EXIT FUNCTION CONTROL GET TEXT g_hTab(1), %IDC_TEXTBOX1 TO txt ' Shortcut name IF txt <> g_txt(1) THEN M_ACT_CHANGE END IF CASE %IDC_TEXTBOX2 IF ISTRUE change THEN EXIT FUNCTION CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX2 TO txt ' Target IF txt <> g_txt(2) THEN M_ACT_CHANGE END IF CASE %IDC_TEXTBOX3 IF ISTRUE change THEN EXIT FUNCTION CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX3 TO txt ' Start in IF txt <> g_txt(3) THEN M_ACT_CHANGE END IF CASE %IDC_TEXTBOX6 IF ISTRUE change THEN EXIT FUNCTION CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX6 TO txt ' Comment IF txt <> g_txt(6) THEN M_ACT_CHANGE END IF CASE %IDC_CHECKBOX1, %IDC_CHECKBOX2 IF ISTRUE change THEN EXIT FUNCTION CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX1 TO chk IF chk <> g_chk1 THEN M_ACT_CHANGE END IF CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX2 TO chk IF chk <> g_chk2 THEN M_ACT_CHANGE END IF END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ CALLBACK FUNCTION ChgIcoProc() LOCAL file AS STRING LOCAL lvs AS LONG LOCAL lvNm AS NM_LISTVIEW PTR SELECT CASE AS LONG CB.MSG CASE %WM_INITDIALOG ' Initialization: populate the listview with icons PopulateIconLV CB.HNDL, %IDC_LISTVIEW1, g_lnk.zIconFile, g_lnk.IconIndex CASE %WM_NOTIFY ' Double-click in listview = select and OK IF LOWRD(CB.WPARAM)= %IDC_LISTVIEW1 THEN lvNm = CB.LPARAM IF @lvNm.hdr.code = %NM_DBLCLK THEN _ SENDMESSAGE CB.HNDL, %WM_COMMAND, %IDOK, 0 END IF CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CB.CTL CASE %IDOK CONTROL GET TEXT CB.HNDL, %IDC_TEXTBOX1 TO g_lnk.zIconFile LISTVIEW GET SELECT CB.HNDL, %IDC_LISTVIEW1 TO lvs g_lnk.IconIndex = lvs - 1 DIALOG END CB.HNDL, %IDOK CASE %IDCANCEL DIALOG END CB.HNDL, %IDCANCEL CASE %IDC_BUTTON1 ' Browse button DISPLAY OPENFILE CB.HNDL, -120, -60, "Change Icon", "", _ CHR$("Icon files (*.ico;*.exe;*.dll)", 0, _ "*.ico;*.exe;*.dll", 0), "", "", _ %OFN_PATHMUSTEXIST OR %OFN_FILEMUSTEXIST _ OR %OFN_NONETWORKBUTTON TO file IF file = "" THEN EXIT FUNCTION CONTROL SET TEXT CB.HNDL, %IDC_TEXTBOX1, file PopulateIconLV CB.HNDL, %IDC_LISTVIEW1, file, 0 END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Functions & Subs ** '------------------------------------------------------------------------------ SUB FillShortcutNfo(BYVAL hDlg AS DWORD) LOCAL lnkpath AS STRING LOCAL e AS STRING LOCAL i AS LONG '****************** ReadShortcut(g_lnk) lnkpath = RTRIM$(g_lnk.zLinkFolder, "\") + "\" + g_lnk.zLinkName g_icof = g_lnk.zIconFile : g_icoc = g_lnk.IconIndex ' (reference value) REDIM g_txt(1 TO 6) '****************** '************************************************************************** '* Dialog caption & title + icons in tabs 1 & 2 * '************************************************************************** DIALOG SET TEXT hDlg, LEFT$(g_lnk.zLinkName, -4) + " Properties" M_DRAWICON_IN_TAB1AND2 '************************************************************************** '* Tab #1 : General * '************************************************************************** CONTROL SET TEXT g_hTab(1), %IDC_TEXTBOX1, LEFT$(g_lnk.zLinkName, -4) ' Shortcut name g_txt(1) = LEFT$(g_lnk.zLinkName, -4) ' (reference value) CONTROL SET TEXT g_hTab(1), %IDC_LABEL2, PATHNAME$(NAMEX, g_lnk.zExeName) ' Description CONTROL SET TEXT g_hTab(1), %IDC_LABEL3, RTRIM$(g_lnk.zLinkFolder, "\") ' Location e = FileSizeKB(lnkpath) + " (" + FileSizeB(lnkpath) + ")" CONTROL SET TEXT g_hTab(1), %IDC_LABEL4, e ' Size CONTROL SET TEXT g_hTab(1), %IDC_LABEL5, "4.00 KB (4096 bytes)" ' Size on disk CONTROL SET TEXT g_hTab(1), %IDC_LABEL6, CreatedDate (lnkpath) ' Created CONTROL SET TEXT g_hTab(1), %IDC_LABEL7, ModifiedDate(lnkpath) ' Modified CONTROL SET TEXT g_hTab(1), %IDC_LABEL8, AccessedDate(lnkpath) ' Accessed g_chk1 = 0 : IF (GETATTR(lnkpath) AND %READONLY) = %READONLY THEN g_chk1 = 1 ' (reference value) CONTROL SET CHECK g_hTab(1), %IDC_CHECKBOX1, g_chk1 ' Read-only g_chk2 = 0 : IF (GETATTR(lnkpath) AND %HIDDEN) = %HIDDEN THEN g_chk2 = 1 ' (reference value) CONTROL SET CHECK g_hTab(1), %IDC_CHECKBOX2, g_chk2 ' Hidden '************************************************************************** '* Tab #2 : Shortcut * '************************************************************************** CONTROL SET TEXT g_hTab(2), %IDC_LABEL9, LEFT$(g_lnk.zLinkName, -4) ' Shortcut name CONTROL SET TEXT g_hTab(2), %IDC_LABEL10, LEFT$(g_lnk.zLinkName, -4) ' Target location CONTROL SET TEXT g_hTab(2), %IDC_TEXTBOX2, g_lnk.zExeName ' Target g_txt(2) = g_lnk.zExeName ' (reference value) CONTROL SET TEXT g_hTab(2), %IDC_TEXTBOX3, g_lnk.zWorkDir ' Start in g_txt(3) = g_lnk.zWorkDir ' (reference value) CONTROL SET TEXT g_hTab(2), %IDC_TEXTBOX6, g_lnk.zComment ' Comment g_txt(6) = g_lnk.zComment ' (reference value) '************************************************************************** '* Tab #3 : Details * '************************************************************************** LISTVIEW RESET g_hTab(3), %IDC_LISTVIEW1 LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 1, 0, "Name" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 1, 2, g_lnk.zLinkName LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 2, 0, "Type" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 2, 2, "Shortcut" LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 3, 0, "File location" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 3, 2, RTRIM$(g_lnk.zLinkFolder, "\") LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 4, 0, "Size" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 4, 2, FileSizeKB(lnkpath) LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 5, 0, "Date created" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 5, 2, LEFT$(CreatedDate (lnkpath), -3) LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 6, 0, "Date modified" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 6, 2, LEFT$(ModifiedDate(lnkpath), -3) LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 7, 0, "Attributes" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 7, 2, FileAttrFormat(lnkpath) LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 8, 0, "Owner" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 8, 2, FileOwnerFormat(lnkpath) LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 9, 0, "Computer" LISTVIEW SET TEXT g_hTab(3), %IDC_LISTVIEW1, 9, 2, GetPCName() END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB SaveShortcut() LOCAL lnkpath AS STRING LOCAL txt AS STRING LOCAL chk AS LONG LOCAL atr AS LONG ' Get all modifiable fields in tabs 1 & 2 (+ possibly changed icon) : '************************************************************************** '* Tab #1 : General * '************************************************************************** ' Shortcut name CONTROL GET TEXT g_hTab(1), %IDC_TEXTBOX1 TO txt IF txt <> g_txt(1) THEN ' Shortcut renamed! IF RIGHT$(LCASE$(txt), 4) = ".lnk" THEN txt = LEFT$(txt, -4) KILL RTRIM$(g_lnk.zLinkFolder, "\") + "\" + txt + ".lnk" NAME RTRIM$(g_lnk.zLinkFolder, "\") + "\" + g_txt(1) + ".lnk" _ AS RTRIM$(g_lnk.zLinkFolder, "\") + "\" + txt + ".lnk" g_lnk.zLinkName = txt + ".lnk" END IF lnkpath = RTRIM$(g_lnk.zLinkFolder, "\") + "\" + g_lnk.zLinkName atr = GETATTR(lnkpath) ' Read-only CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX1 TO chk IF chk <> g_chk1 THEN IF chk = 0 AND ((atr AND %READONLY) = %READONLY) THEN atr -= %READONLY IF chk = 1 AND ((atr AND %READONLY) = 0) THEN atr += %READONLY END IF ' Hidden CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX2 TO chk IF chk <> g_chk2 THEN IF chk = 0 AND ((atr AND %HIDDEN) = %HIDDEN) THEN atr -= %HIDDEN IF chk = 1 AND ((atr AND %HIDDEN) = 0) THEN atr += %HIDDEN END IF ' Refresh file attributes SETATTR lnkpath, atr '************************************************************************** '* Tab #2 : Shortcut * '************************************************************************** CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX2 TO g_lnk.zExeName ' Target CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX3 TO g_lnk.zWorkDir ' Start in CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX6 TO g_lnk.zComment ' Comment '************************************************************************** '* Save everything! then refresh dialog * '************************************************************************** WriteShortcut(g_lnk) FillShortcutNfo(GETPARENT(g_hTab(1))) END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB PopulateIconLV(BYVAL hDlg AS DWORD, BYVAL ctlId AS LONG, _ BYVAL icof AS STRING, BYVAL icoc AS LONG) STATIC hImgLst AS DWORD LOCAL hIcon AS DWORD LOCAL tIcons AS LONG LOCAL cIcons AS LONG LOCAL lRslt AS LONG LISTVIEW RESET hDlg, ctlId IF hImgLst <> 0 THEN IMAGELIST KILL hImgLst IMAGELIST NEW ICON 32, 32, 32, 6 TO hImgLst tIcons = ExtractIcon(BYVAL 0, (icof), -1) FOR cIcons = 0 TO tIcons -1 hIcon = ExtractIcon(BYVAL 0, (icof), cIcons) LISTVIEW SET IMAGELIST hDlg, ctlId, hImgLst, 0 IMAGELIST ADD ICON hImgLst, hIcon TO lRslt LISTVIEW INSERT ITEM hDlg, ctlId, cIcons+1, cIcons+1, "" DestroyIcon hIcon NEXT cIcons LISTVIEW SELECT hDlg, ctlId, icoc+1 LISTVIEW VISIBLE hDlg, ctlId, icoc+1 CONTROL SET FOCUS hDlg, ctlId END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION GetPCName() AS STRING LOCAL zText AS ASCIIZ * (%MAX_COMPUTERNAME_LENGTH + 1) GetComputerName zText, SIZEOF(zText) FUNCTION = TRIM$(zText) END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION FileAttrFormat(BYVAL file AS STRING) AS STRING LOCAL r AS STRING LOCAL i AS LONG i = GETATTR(file) IF (i AND %ARCHIVE ) = %ARCHIVE THEN r += "A" IF (i AND %SYSTEM ) = %SYSTEM THEN r += "S" IF (i AND %HIDDEN ) = %HIDDEN THEN r += "H" IF (i AND %READONLY) = %READONLY THEN r += "R" FUNCTION = r END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION FileOwnerFormat(BYVAL file AS STRING) AS STRING LOCAL r AS STRING LOCAL ff AS LONG LOCAL i AS LONG IF INSTR(file, " ") > 0 THEN file = $DQ + file + $DQ r = RTRIM$(ENVIRON$("TEMP"), "\") + "\linkedit.dir-q" IF INSTR(r, " ") > 0 THEN r = $DQ + r + $DQ SHELL "start dir /q " + file + " > " + r ff = FREEFILE OPEN RTRIM$(ENVIRON$("TEMP"), "\") + "\linkedit.dir-q" FOR INPUT AS #ff FOR i = 1 TO 6 LINE INPUT #ff, r NEXT CLOSE #ff FUNCTION = TRIM$(MID$(r, 37, 23)) END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION FileSizeB(BYVAL file AS STRING) AS STRING LOCAL ff AS LONG LOCAL sz AS LONG ' Get file size ff = FREEFILE OPEN file FOR BINARY ACCESS READ LOCK SHARED AS #ff sz = LOF(#ff) CLOSE #ff ' Return it formatted FUNCTION = FORMAT$(sz) + " bytes" END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION FileSizeKB(BYVAL file AS STRING) AS STRING LOCAL ff AS LONG LOCAL sz AS LONG ' Get file size ff = FREEFILE OPEN file FOR BINARY ACCESS READ LOCK SHARED AS #ff sz = LOF(#ff) CLOSE #ff ' If shortcut >= 1.0 KB : show size in KB, else in B. IF sz >= 1024 THEN ff = FIX(sz / 10.24) FUNCTION = LEFT$(FORMAT$(ff),-2) + "." + RIGHT$(FORMAT$(ff),2) + " KB" ELSE FUNCTION = FORMAT$(sz) + " bytes" END IF END FUNCTION '------------------------------------------------------------------------------