You are not logged in. You can browse in the PowerBASIC Community, but you must click Login (top right) before you can post. If this is your first visit, check out the FAQ or Sign Up.
a search the bbs for "shgetspecialfolderlocation" reveals some code that may help. i posted some in the source code forum (it had a small memory leak), and someone used a 3rd-party utility (ja/compb) to create a version that cleaned up correctly after itself. the cleanup is only necessary if you are worried about the very small memory leak, and dont want to add all the overhead to access the com objects correctly.
Not sure if he answered what you ask or not. How you add shortcuts to the desktop and the start menu is from the folders with those names that are in the windows folder.
sorry if you know that, or he answered your question.
Egbert Zijlema, journalist and programmer (zijlema at basicguru dot eu) http://zijlema.basicguru.eu *** Opinions expressed here are not necessarily untrue ***
the program involved does not work. i get a param-mismatch error, due to
the declaration of the 'where'-variable as itemidlist ptr. what else can i declare?
the winapi32-file is not easy to understand regarding this matter.
btw: for those who also get a 'not found' error when clicking on 'page 230', the source code can also
be downloaded from: http://www.powerbasic.com/support/pb...ead.php?t=2914
where borje hagsten re-posted it on my request.
Egbert Zijlema, journalist and programmer (zijlema at basicguru dot eu) http://zijlema.basicguru.eu *** Opinions expressed here are not necessarily untrue ***
[To get it on top again - and may be an answer too)
The code Lance refers to does not work, most likely due to the ITEMIDLIST PTR declaration.
What else should I declare to get it running?
Egbert Zijlema, journalist and programmer (zijlema at basicguru dot eu) http://zijlema.basicguru.eu *** Opinions expressed here are not necessarily untrue ***
If your question still persists, then maybe the following code for an installer
will help. It copies six files into a subfolder of Program Files, and optionally
makes shortcuts to the desktop, Start\Programs, and Start\Programs\StartUp.
The shortcuts are made using Semen Matusovski's very fine routine, CreateShortcut.
To be honest, I don't understand Semen's routine very well, but fortunately, it is
very easy to use. Thanks to Semen if this is of any help.
Code:
#COMPILE EXE
#DIM ALL
#INCLUDE "win32api.inc"
%ID_FolderLabel = 100
%ID_Checkbox1 = 105
%ID_Checkbox2 = 110
%ID_Checkbox3 = 115
%ID_Folder = 120
%ID_Install = 125
%ID_Cancel = 130
%SIZE_KEY = 64
%SIZE_VAL = 256
DECLARE CALLBACK FUNCTION dlgProc
DECLARE SUB CreateShortcut (ln AS STRING, ep AS STRING, wd AS STRING, BYVAL CSIDL AS LONG)
DECLARE FUNCTION CoInitialize LIB "ole32.dll" ALIAS "CoInitialize" _
(BYVAL pvReserved AS DWORD) AS DWORD
DECLARE FUNCTION CoCreateInstance LIB "ole32.dll" ALIAS "CoCreateInstance" _
(rclsid AS STRING * 16, BYVAL pUnkOuter AS ANY, BYVAL dwClsContext AS DWORD, _
riid AS STRING * 16, ppv AS DWORD) AS DWORD
DECLARE SUB CoUninitialize LIB "ole32.dll" ALIAS "CoUninitialize"
DECLARE SUB CoTaskMemFree LIB "ole32.dll" ALIAS "CoTaskMemFree" (pv AS DWORD)
DECLARE FUNCTION Sub1 (p1 AS ANY) AS DWORD
DECLARE FUNCTION Sub2 (p1 AS ANY, p2 AS ANY) AS DWORD
DECLARE FUNCTION Sub3 (p1 AS ANY, p2 AS ANY, p3 AS ANY) AS DWORD
FUNCTION PBMAIN
LOCAL Style AS LONG, hDlg AS LONG
Style& = %WS_MINIMIZEBOX + %WS_SYSMENU
DIALOG NEW 0, "Install winPam", , , 245, 177, Style TO hDlg
CONTROL ADD CHECKBOX, hDlg, %ID_Checkbox1, "Create shortcut for desktop", 8, 20, 104, 12
CONTROL ADD CHECKBOX, hDlg, %ID_Checkbox2, "Create shortcut for Program Menu", 8, 34, 128, 12
CONTROL ADD CHECKBOX, hDlg, %ID_Checkbox3, "Include reminders in Startup Menu", 8, 49, 128, 12
CONTROL ADD LABEL, hDlg, %ID_FolderLabel, "Folder to Install winPam:",8, 76, 139, 12
CONTROL ADD TEXTBOX, hDlg, %ID_Folder, "C:\Program Files\Phone & Address Mgr\", 24, 88, 192, 12
CONTROL ADD BUTTON, hDlg, %ID_Install, "&Install", 29, 118, 53, 32
CONTROL ADD BUTTON, hDlg, %ID_Cancel, "&Cancel", 101, 118, 53, 32
DIALOG SHOW MODAL hDlg, CALL dlgProc
END FUNCTION
CALLBACK FUNCTION dlgProc()
LOCAL ck1 AS LONG, ck2 AS LONG, ck3 AS LONG
LOCAL folder AS STRING, path AS STRING
LOCAL s AS STRING, i AS INTEGER, nFiles AS INTEGER
LOCAL szSubKey AS ASCIIZ * %SIZE_KEY, szValue AS ASCIIZ * %SIZE_VAL
LOCAL KeyHandle AS LONG, subKeyHandle AS LONG, dwRetVal AS LONG
LOCAL MsgContent AS STRING, valName AS ASCIIZ * %SIZE_KEY
STATIC files() AS STRING
DIM files(6)
SELECT CASE CBMSG
CASE %WM_INITDIALOG
CONTROL SET CHECK CBHNDL, %ID_Checkbox1, 1
CONTROL SET CHECK CBHNDL, %ID_Checkbox2, 1
CONTROL SET CHECK CBHNDL, %ID_Checkbox3, 1
files(1) = "winPam.exe"
files(2) = "winPam.hlp"
files(3) = "winPam.cnt"
files(4) = "winPam.ico"
files(5) = "reminder.exe"
files(6) = "uninstall.exe
CASE %WM_COMMAND
SELECT CASE CBCTL
CASE %ID_Install
'check for complete set of files
path = CURDIR$
IF RIGHT$(path, 1) <> "\" THEN path = path + "\"
FOR i = 1 TO 6
s = DIR$(path + files(i))
IF LEN(s) THEN INCR nFiles
NEXT i
IF nFiles < 6 THEN
MSGBOX "Not all install files are present"
DIALOG END CBHNDL: EXIT FUNCTION
END IF
'copy files to specified folder
CONTROL GET TEXT CBHNDL, %ID_Folder TO folder
MKDIR folder
FOR i = 1 TO 6
FILECOPY path + files(i), folder + files(i)
NEXT i
'insert registry undelete key and two values
szSubKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
dwRetVal = RegOpenKey(BYVAL %HKEY_LOCAL_MACHINE, szSubKey, KeyHandle)
IF dwRetVal = %ERROR_SUCCESS THEN
szSubKey = "winPam"
RegCreateKey KeyHandle, szSubKey, subKeyHandle
valName = "DisplayName": szValue = "Phone & Addr Mgr"
RegSetValueEx subKeyHandle, valName, 0, %REG_SZ, szValue, %SIZE_VAL
valName = "UninstallString": szValue = "C:\Program Files\Phone & Address Mgr\uninstall.exe"
RegSetValueEx subKeyHandle, valName, 0, %REG_SZ, szValue, %SIZE_VAL
END IF
'copy selected shortcuts
CONTROL GET CHECK CBHNDL, %ID_Checkbox1 TO ck1
CONTROL GET CHECK CBHNDL, %ID_Checkbox2 TO ck2
CONTROL GET CHECK CBHNDL, %ID_Checkbox3 TO ck3
IF ck1 THEN
CreateShortcut "winPam", folder + "winpam.exe", folder, %CSIDL_DESKTOP
END IF
IF ck2 THEN
CreateShortcut "winPam", folder + "winpam.exe", folder, %CSIDL_PROGRAMS
END IF
IF ck3 THEN
CreateShortcut "Reminder", folder + "reminder.exe", folder, %CSIDL_STARTUP
END IF
MSGBOX "winPam successfully installed"
DIALOG END CBHNDL
CASE %ID_Cancel
DIALOG END CBHNDL
END SELECT
CASE %WM_DESTROY
END SELECT
END FUNCTION
SUB CreateShortcut (ln AS STRING, ep AS STRING, wd AS STRING, BYVAL CSIDL AS LONG)
LOCAL LnkName AS ASCIIZ * 32, ExePath AS ASCIIZ * 64, WorkDir AS ASCIIZ * 64
LOCAL ShowCmd AS DWORD, Arguments AS ASCIIZ * 1, Comment AS ASCIIZ * 1
LOCAL TmpAsciiz AS ASCIIZ * %MAX_PATH, TmpWide AS ASCIIZ * (2 * %MAX_PATH)
LOCAL psl AS DWORD PTR, ppf AS DWORD PTR, pp AS DWORD PTR, lResult AS DWORD
LOCAL CLSID_ShellLink AS STRING * 16, IID_IShellLink AS STRING * 16
LOCAL CLSCTX_INPROC_SERVER AS DWORD, IID_Persist AS STRING * 16
LnkName = ln: ExePath = ep: WorkDir = wd
Arguments = "": ShowCmd = %SW_NORMAL: Comment = ""
CLSID_ShellLink = MKL$(&H00021401) + CHR$(0, 0, 0, 0, &HC0, 0, 0, 0, 0, 0, 0, &H46)
IID_IShellLink = MKL$(&H000214EE) + CHR$(0, 0, 0, 0, &HC0, 0, 0, 0, 0, 0, 0, &H46)
IID_Persist = MKL$(&H0000010B) + CHR$(0, 0, 0, 0, &HC0, 0, 0, 0, 0, 0, 0, &H46)
CLSCTX_INPROC_SERVER = 1: CoInitialize %Null
IF ISFALSE(CoCreateInstance (CLSID_ShellLink, %Null, CLSCTX_INPROC_SERVER, IID_IShellLink, psl)) THEN
pp = @psl + 80: CALL DWORD @pp USING Sub2 (BYVAL psl, ExePath)
pp = @psl + 44: CALL DWORD @pp USING Sub2 (BYVAL psl, Arguments)
pp = @psl + 36: CALL DWORD @pp USING Sub2 (BYVAL psl, WorkDir)
pp = @psl + 60: CALL DWORD @pp USING Sub2 (BYVAL psl, BYVAL ShowCmd)
pp = @psl + 28: CALL DWORD @pp USING Sub2 (BYVAL psl, Comment)
pp = @psl: CALL DWORD @pp USING Sub3 (BYVAL psl, IID_Persist, ppf) TO lResult
IF lResult = 0 THEN
DIM pidl AS DWORD
TmpAsciiz = CURDIR$
IF ISFALSE(SHGetSpecialFolderLocation(BYVAL %HWND_DESKTOP, BYVAL CSIDL, BYVAL VARPTR(pidl))) THEN
SHGetPathFromIDList BYVAL pidl, TmpAsciiz
CoTaskMemFree BYVAL pidl
END IF
TmpAsciiz = TmpAsciiz + "\" + LnkName + ".Lnk"
MultiByteToWideChar %CP_ACP, 0, TmpAsciiz, -1, TmpWide, %MAX_PATH
pp = @ppf + 24: CALL DWORD @pp USING Sub3 (BYVAL ppf, TmpWide, BYVAL %True)
pp = @ppf + 8: CALL DWORD @pp USING Sub1 (BYVAL ppf)
END IF
pp = @psl + 8: CALL DWORD @pp USING Sub1 (BYVAL psl)
END IF
CoUninitialize
END SUB
We process personal data about users of our site, through the use of cookies and other technologies, to deliver our services, and to analyze site activity. For additional details, refer to our Privacy Policy.
By clicking "I AGREE" below, you agree to our Privacy Policy and our personal data processing and cookie practices as described therein. You also acknowledge that this forum may be hosted outside your country and you consent to the collection, storage, and processing of your data in the country where this forum is hosted.
Comment