Newsgroup: it.comp.lang.visual-basic
Titolo: Ho un problema con il setup creato dall'utility di vb5

Ciao a tutti,
ho realizzato un programmino in vb5. Quando uso "Autocomposizione
installazione" per creare i dischi di setup appare un errore sulle
dipendenze mancanti del file shfolder.dll. se ignoro l'errore e creo i
dischi, quando installo il programma appare "Errore durante la registrazione
del file "xxxxx\shfolder.dll". La cosa strana e' che se ignoro l'errore
funziona tutto lo stesso.
Cosa posso fare per togliere l'errore? Posso creare (o scaricare da
internet) il file di dipendenze del file shfolder?
Grazie a tutti
Marco Rossi


credo che SHFolder.dll sia fornita con IExplore, non credo sia una buona
idea fornirla con l'installazione... ma forse mi sbaglio
Ciao
Faber

 wrote in message
dXLP6.8251$WT5.2...@news.infostrada.it...


 ha scritto nel messaggio
news:aIOP6.17192$8Y1.2...@news2.tin.it...


Ho inserito la SHFolder.dll per poter usare l'api SHGetFolderPath.
C'e' un'altro modo per conoscere le cardelle di sistema?
grazie per la risposta
Marco Rossi


 Marco Rossi
metti su un form cmdBrowse, cmdExit e txtPath, poi fai c+p del codice
sotto. le dll dovrebbero essere tutte di sistema, quindi non devi
includerle.
nb: qui si sfoglia sempre a partire da risorse del computer. per far
sfogliare dalla cartella corrente e' un discreto casino, mi _sembra_ che
il codice stia su 
www.mvps.org/vbnet
 .
ciao, a.
'form1
Option Explicit
Dim oldPath As String, mainPath As String
Private Function BrowseForFolder(hWndOwner As Long, sPrompt As String)
As String
    Dim iNull As Integer
    Dim lpIDList As Long, lResult As Long
    Dim sPath As String
    Dim udtBI As BrowseInfo
    udtBI.hWndOwner = hWndOwner
    udtBI.lpszTitle = lstrcat(sPrompt, "")
    udtBI.ulFlags = BIF_RETURNONLYFSDIRS
    lpIDList = SHBrowseForFolder(udtBI)
    If lpIDList Then
        sPath = String$(MAX_PATH, 0)
        lResult = SHGetPathFromIDList(lpIDList, sPath)
        Call CoTaskMemFree(lpIDList)
        iNull = InStr(sPath, vbNullChar)
        If iNull Then sPath = Left$(sPath, iNull - 1)
    End If
    BrowseForFolder = sPath
End Function
Private Function GetWinDir() As String
    Dim Temp As String * 256
    Dim x As Integer
    x = GetWindowsDirectory(Temp, Len(Temp))
    GetWinDir = Left$(Temp, x)
    GetWinDir = IIf(Right(GetWinDir, 1) = "\", GetWinDir, GetWinDir &
"\")
End Function
Private Sub cmdBrowse_Click()
    Dim tmp As String
    oldPath = mainPath
    tmp = BrowseForFolder(Me.hWnd, _
        "Current folder: " & mainPath)
    If tmp <> "" And Right(tmp, 1) <> "\" Then tmp = tmp & "\"
    mainPath = IIf(tmp <> "", tmp, oldPath)
    txtPath = mainPath
    Exit Sub
errman:
    MsgBox Error
    mainPath = GetWinDir()
    Resume Next
End Sub
Private Sub cmdExit_Click()
    Unload Me
End Sub
Private Sub Form_Load()
    mainPath = App.Path
    If Right(mainPath, 1) <> "\" Then mainPath = mainPath & "\"
End Sub
'module1
Option Explicit
'BROWSE FOR FOLDER
Public Type BrowseInfo
    hWndOwner As Long
    pIDLRoot As Long
    pszDisplayName As Long
    lpszTitle As Long
    ulFlags As Long
    lpfnCallback As Long
    lParam As Long
    iImage As Long
End Type
Public Const BIF_RETURNONLYFSDIRS = 1
Public Const MAX_PATH = 260
Declare Sub CoTaskMemFree Lib "ole32.dll" _
    (ByVal hMem As Long)
Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" _
    (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Declare Function SHBrowseForFolder Lib "shell32" _
    (lpbi As BrowseInfo) As Long
Declare Function SHGetPathFromIDList Lib "shell32" _
    (ByVal pidList As Long, ByVal lpBuffer As String) As Long
'WINdir
Declare Function GetWindowsDirectory Lib "kernel32" _
    Alias "GetWindowsDirectoryA" _
    (ByVal lpBuffer As String, ByVal nSize As Long) As Long

 wrote in message
Wm4Q6.14073$WT5.5...@news.infostrada.it...


Ciao,
scusate ma non ho spiegato cosa fa la funzione SHGetFolderPath.
In pratica questa funzione restituisce il percorso delle cartelle usate da
Windows.
Per esempio se passo il valore &H15 come parametro CSIDL alla funzione
SHGetFolderPath questa mi restituisce "C:\Windows\temp" ovvero la path della
cartella temporanea, oppure se passo come CSIDL il valore &H2 la funzione
restituisce "C:\Programmi" (sui sistemi con Windows in italiano) oppure
"C:\Program files" (sui sistemi con Windows inglese) ecc...
Lo scopo e' conoscere le cartelle di sistema indipendentemente dalle scelte
fatte durante l'installazione di Windows e indipendentemente dal tipo di
Windows presente (durante l'installazione si puo' anche sceglere una
cartella diversa da "C:\Windows" per il sistema).
Grazie ancora
Marco Rossi

Scusa!?
Ciao

"MarcoGVG" <gvg...@NOSPAMtiscalinet.it> ha scritto

non lo uso ma prova a cercare envir sulla guida e nei vecchi post, tipo
envir("temp")
su mvps, forse vbnet o ccrp, mis sembra ci fosse anche un prg di brad
martinez per recuperare tutte le cartelle di sistema. cioe', esiste
senz'altro, ma non sono sicuro sia li'. magari scrivigli.
ciao, a.

scherzare con me.
0.
Boni ! state boni ! ;-)
1.
Le faide sono segno di incivilta'.
2.
Anche ammesso che si tratti del Marco che non ha voluto/potuto supportarti:
a) su questo ng nessuno e' obbligato a fare alcunche' per qualcun altro;
b) ho trovato almeno tre tuoi post che dicono: " questa e' la mia prima domanda ..."
3.
Che senso ha litigare per delle c@%%@te simili ?
Fate pace e finitela li'. :-)
ciao, hal


hal paciere instancabile... :)
cmq mi asocio (of course).
ciao
ugo

 scherzare con me.
ROTFLONE !
Un Paperino che a primavera avanzata, insieme alle nespole, maturano i lamerazzi...

 che se ignoro l'errore funziona tutto lo stesso.
Mettiamo un po' di cose in chiaro... non puoi distribuire pezzi di 
Windows separatamente. Controlla sempre nella versione del file, se il 
nome del prodotto è "Sistema Operativo Microsoft Windows-qualcosa", non 
puoi redistribuirlo. Punto. Se è "Microsoft Internet Explorer" devi 
richiedere la speciale licenza a Microsoft per poter includere 
installazioni minimali di Internet Explorer assieme ai tuoi programmi, 
ma deve valerne la pena... se l'installazione di Internet Explorer è più 
grossa di quella del tuo programma, NON ne vale la pena... Se è 
"Microsoft Script", non puoi redistribuire i singoli file, ma devi 
includere l'intero pacchetto e menzionare da qualche parte che il tuo 
programma usa Microsoft Script. "Microsoft Forms" è parte di Microsoft 
Office. Per poter distribuire Forms devi chiedere all'utente di 
installare un'intera applicazione Office, la più adatta è l'ActiveX Edit 
Pad per le sue ridottissime dimensioni e per il fatto che è gratuita. I 
componenti di Office sono strettamente legati ad Office, se il tuo 
programma usa componenti di Office (con l'eccezione, credo, di VBA), 
praticamente *è* parte di Office, quindi anche qui l'utente deve avere 
già installati i componenti che usi. E la regola di Office vale per 
praticamente quasi tutti gli altri prodotti Microsoft.

Grazie ancora,
ho guardato sul sito di brad martinez dove ho trovato un link a VBnet, qui
ci sono un paio di esempi, il primo usa le funzioni del kernel ma trova solo
le cartelle Temp, Windows e System, il secondo esempio usa l'api che usavo
io: shGetFolderPath.
Nel secondo esempio si dice che proprio Microsoft raccomanda l'uso della
shFolder.dll
<c&p>
The SHGetFolderPath function is a superset of SHGetSpecialFolderPath,
included with earlier versions of the shell. It is implemented in a
redistributable DLL, SHFolder.dll, that also simulates many of the new shell
folders on older platforms such as Windows 95, Windows 98, and Windows NT
4.0.
Microsoft recommends the use of this API (over other available APIs) as a
Best Practice for the following reasons:
Promotes storage to administrator-chosen locations
Reduces user frustration by finding and saving their files without the need
to browse
Reduces application errors associated with reading and writing files
Allows your application to run properly in secure environments
<>
quindi deduco che ci sia un modo per distribuire la dll che io non conosco.
Pensavo bastasse trovare il file di dipendenze.
Ciao e grazie per la pazienza
Marco Rossi


Caro pinco pallino, questo tipo di minacce oltre a non avere alcun senso e'
presumibilmente punibile per legge.
Inoltre sicuramente ti ha gia' fruttato il plonk di almeno un paio dei
poster piu' validi di questo NG, percui credo che sia meglio (per te, bada
bene, a me cale poco o nulla, giusto il tempo di plonkarti) che tu inizi a
postare qualcosa di piu' costruttivo.
Ciaotutti,
Asterix (plllllllllll...)

 wrote in message
news:dXLP6.8251$WT5.2...@news.infostrada.it...

[MSDN][MSDN][MSDN][MSDN][MSDN][MSDN][MSDN]
SHGetFolderPath
Takes the CSIDL of a folder and returns the pathname.
HRESULT SHGetFolderPath(
    HWND hwndOwner,
    int nFolder,
    HANDLE hToken,
    DWORD dwFlags,
    LPTSTR pszPath
);
[...]
This function is a superset of SHGetSpecialFolderPath, included with earlier
versions of the Shell. It is implemented in a redistributable DLL,
SHFolder.dll, that also simulates many of the new Shell folders on older
platforms such as Windows 95, Windows 98, and Windows NT 4.0. This DLL
always calls the current platform's version of this function. If that fails,
it will try to simulate the appropriate behavior. Only some CSIDLs are
supported, including:
CSIDL_ADMINTOOLS
CSIDL_COMMON_ADMINTOOLS
CSIDL_APPDATA
CSIDL_COMMON_APPDATA
CSIDL_COMMON_DOCUMENTS
CSIDL_COOKIES
CSIDL_FLAG_CREATE
CSIDL_HISTORY
CSIDL_INTERNET_CACHE
CSIDL_LOCAL_APPDATA
CSIDL_MYPICTURES
CSIDL_PERSONAL
CSIDL_PROGRAM_FILES
CSIDL_PROGRAM_FILES_COMMON
CSIDL_SYSTEM
CSIDL_WINDOWS
Requirements
  Windows NT/2000: Requires Windows NT 4.0 or later.
  Windows 95/98/Me: Requires Windows 95 or later.
  Header: Declared in shlobj.h.
  Import Library: shell32.lib.
[---][---][---][---][---][---][---][---][---][---][---][---][---][---]
In particolare :
This function is a superset of SHGetSpecialFolderPath, included with earlier
versions of the Shell. It is implemented in a redistributable DLL,
SHFolder.dll, that also simulates many of the new Shell folders on older
platforms such as Windows 95, Windows 98, and Windows NT 4.0. This DLL
always calls the current platform's version of this function. If that fails,
it will try to simulate the appropriate behavior.
Quindi la DLL dovrebbe essere ridistribuibile senza particolari problemi...
Inoltre:
[MSDN][MSDN][MSDN][MSDN][MSDN][MSDN][MSDN]
SHGetSpecialFolderPath
Retrieves the path of a special folder, identified by its CSIDL.
BOOL SHGetSpecialFolderPath(
    HWND hwndOwner,
    LPTSTR lpszPath,
    int nFolder,
    BOOL fCreate
);
Parameters
hwndOwner
Handle to the owner window the client should specify if it displays a dialog
box or message box.
lpszPath
Address of a character buffer that receives the drive and path of the
specified folder. This buffer must be at least MAX_PATH characters in size.
nFolder
A CSIDL that identifies the folder of interest. If a virtual folder is
specified, this function will fail.
fCreate
Indicates if the folder should be created if it does not already exist. If
this value is nonzero, the folder will be created. If this value is zero,
the folder will not be created.
Return Values
Returns TRUE if successful, or FALSE otherwise.
Remarks
The Microsoft® Internet Explorer 4.0 Desktop Update must be installed for
this function to be available.
With Microsoft® Windows® 2000, this function is superseded by
ShGetFolderPath. You can use this function on earlier systems by including
the redistributable DLL, ShFolder.dll.
Requirements
  Version 4.71 and later of Shell32.dll
  Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet
Explorer 4.0 or later).
  Windows 95/98/Me: Requires Windows 98 (or Windows 95 with Internet
Explorer 4.0 or later).
  Header: Declared in Shlobj.h.
  Import Library: Shell32.lib.
[---][---][---][---][---][---][---][---][---][---][---][---][---][---]
Il che significa che se tu metti come system requirement IE4 non dovresti
avere alcun problema anche senza la DLL in questione, basta che utilizzi la
versione ristretta che richiede Win98 oppure Win95 + desktop update.
Sta a te decidere.
MORE INFORMATION
SHGetFolderPath is a new API function for Windows 2000. If you are not
running Windows 2000, then the SHGetFolderPath function requires that you
redistribute the SHFolder.dll file. The SHFolder.dll file is freely
redistributable and can be obtained from the latest Platform SDK, which is
available from the following Web site:
http://msdn.microsoft.com/developer/sdk/platform.asp
Fossi in te me ne fregherei del .DEP e TOGLIEREI la $DLLRegister o qualcosa
del genere dal setup.lst: la DLL in questione non e' ActiveX, quindi
fallira' sempre l'autoregister.
Ciaotutti,
Alessandro

OK, Grazie Alessandro, provo subito
Tante garzie ancora
Marco Rossi
