Newsgroup: it.comp.appl.access
Titolo: Access 97: riferimenti ed installazioni di Windows

Forse (e lo spero !) mi sto perdendo in un bicchiere d'acqua.
Premessa:
per ovvi motivi di manutenibilità, ho riunito in un mdb trasformato
poi in mde, tutta una serie di funzioni "di base" utili per qualunque
applicazione Access (selezione di un folder, selezione di un file,
selezione della stampante ecc.). Tale mdb contiene solo moduli e,
poichè utilizza chiamate alle API di Win, ha impostata una serie di
riferimenti a dll ed ocx.
Nelle varie applicazioni, oltre ai riferimenti irrinunciabili (VBA,
DAO, Office) aggiungo un riferimento a questo mde "di servizio"
(util.mde).
NON utilizzo ODE (come tutti sapete, è introvabile ....)
I problemi che si presentano sono svariati:
1) fino a qualche giorno fa sviluppavo su una macchina Win 95, mentre
adesso lavoro su una macchina NT (Workstation 4.0 SP5) ed ovviamente
tutti i riferimenti a dll/ocx tipici di Win 95 sono saltati; per
rimediare, ho copiato da Win 95 le dll/ocx che mi servono nella
cartella dove risiede util.mdb su NT, ho modificato i riferimenti ed
ho rigenerato util.mde. Sulla macchina Win 95 invece, non ho
modificato niente.
Sulla macchina NT le varie applicazioni Access che hanno come
riferimento util.mde al loro interno, funzionano correttamente ed
eseguono senza problemi le chiamate alle API di Win. Le stesse
applicazioni, portate sulla macchina Win 95 (dove risiede util.mde
originale), non partono nemmeno: all'apertura ho l'errore "Questo
programma ha eseguito un'operazione non valida e sarà terminato".
Perchè ?
2) ammesso di riuscire a risolvere il problema precedente, si può
comunque verificare che a parità di versione di s.o., il cliente abbia
installato per esempio Win 95 in una cartella diversa dalla mia;
perciò se io ho come riferimento C:\WINDOWS95\SYSTEM\comctl32.ocx,
sulla macchina del cliente l'ocx potrebbe essere invece in
C:\WIN\SYSTEM\; senza contare che lo stesso cliente potrebbe avere più
macchine installate ognuna in maniera differente dall'altra, o
addirittura con s.o. differenti (già adesso Win95/98).
E allora che faccio ? 
a) porto gli mdb dal cliente e rigenero presso di lui gli mde su
ognuna delle sue macchine ? (scomodo: devo per forza andare dal
cliente)
b) posso sperare di modificare i riferimenti da codice ?
c) devo procurarmi ODE a tutti i costi perchè gestisce questi aspetti?
d) cerco un lavoro come guardiano di porci ?
Grazie
Vincenzo Turturro
----------------------------------
Niuna impresa, per minima che sia, 
può avere cominciamento e fine
senza queste tre cose:
e cioè senza sapere,
senza potere,
senza con amore volere
(Anonimo fiorentino, XIV sec.)
------------------------------

 c) devo procurarmi ODE a tutti i costi perchč gestisce questi aspetti?
Finalmente qualcosa di interessante ;-)
Non e' possibile modificare il riferimento, cioe' la
proprieta' FullPath e' di sola lettura,
pero' si puo' eliminare il vecchio e crearne uno nuovo.
Tempo addietro avevo iniziato a scrivere qualcosa per fare
+o- quello che ti serve.
f_CreaRef: crea un nuovo riferimento, passandogli un file
(libreria)
f_DelRef: elimina un riferimento, passandogli il nome
s_ListRef: crea una matrice con tutti i riferimenti (nome,
path, mancante)
s_chkRefs: scorre la matrice e se un riferimento e'
mancante (IsBroken) lo elimina e ne crea un altro chiedendo
la posizione del file (libreria)
naturalmente quest'ultima parte va modificata!
potresti:
- cercare il file e creare il riferimento;
- una volta identificata la directory di sistema (ti ho
postato delle routine per farlo) e controllato l'esistenza
del file, creare il riferimento.
Ti posto il tutto e spero ti sia utile, almeno come punto
di partenza.
Non c'e' una vera gestione degli errori, e' uno di quei
lavori rimasti nel cassetto.
Se hai dei dubbi chiedimi pure.
E naturalmente fammi sapere come procede.
---------------------------------------------------
'Gestione riferimenti
---------------------------------------------------
Private varTemp() As String
Public Sub s_chkRefs()
'Controlla i riferimenti
    Dim intRC As Integer
    Dim strFile As String
    Dim blRetVal As Boolean
    Call s_ListRef
    For intRC = 1 To UBound(varTemp)
        'controlla se manca
        If CInt(varTemp(intRC, 3)) = -1 Then
            'Debug.Print varTemp(intRC, 1), varTemp(intRC,
2), varTemp(intRC, 3)
            blRetVal = f_DelRef(varTemp(intRC, 1))
            'strFile = cmdlg_file
            'If strFile <> "" Then
            '   blRetVal = f_CreaRef(strFile)
            'End If
        End If
    Next intRC
End Sub
Private Sub s_ListRef()
'Crea una matrice con i riferimenti
    Dim refTemp As Reference
    Dim intRC As Integer
    intRC = Application.References.count
    ReDim varTemp(1 To intRC, 1 To 3) As String
    intRC = 0
    For Each refTemp In Application.References
        intRC = intRC + 1
        varTemp(intRC, 1) = refTemp.name
        varTemp(intRC, 2) = refTemp.FullPath
        varTemp(intRC, 3) = CInt(refTemp.IsBroken)
    Next refTemp
    'For intRC = 1 To UBound(varTemp)
    '    Debug.Print varTemp(intRC, 1), varTemp(intRC, 2),
varTemp(intRC, 3)
    'Next intRC
End Sub
Private Function f_CreaRef(strNomeFile As String) As
Boolean
'Crea un nuovo riferimento da file
    Dim ref As Reference
    On Error GoTo Err_CreaRef
    Set ref =
Application.References.AddFromFile(strNomeFile)
    f_CreaRef = True
Exit_CreaRef:
    Exit Function
Err_CreaRef:
    MsgBox Err.Number & " - " & Err.Description
    f_CreaRef = False
    Resume Exit_CreaRef
End Function
Private Function f_DelRef(strName As String) As Boolean
'Elimina un riferimento
  Dim refDelete As Reference
  On Error GoTo Err_DelRef
  Set refDelete = Application.References(strName)
  Application.References.Remove refDelete
  f_DelRef = True
Exit_DelRef:
  Exit Function
Err_DelRef:
  MsgBox Err.Number & " - " & Err.Description
  f_DelRef = False
  Resume Exit_DelRef
End Function
---------------------------------------------------
---------------------------------------------------
'Per ottenere le dir: Win, System, Temp
---------------------------------------------------
Private Const MAX_PATH As Integer = 255
Private Declare Function apiGetSystemDirectory& Lib
"kernel32" _
        Alias "GetSystemDirectoryA" _
        (ByVal lpBuffer As String, ByVal nSize As Long)
Private Declare Function apiGetWindowsDirectory& Lib
"kernel32" _
        Alias "GetWindowsDirectoryA" _
        (ByVal lpBuffer As String, ByVal nSize As Long)
Private Declare Function apiGetTempDir Lib "kernel32" _
        Alias "GetTempPathA" (ByVal nBufferLength As Long,
_
        ByVal lpBuffer As String) As Long
Function fReturnTempDir()
'Returns Temp Folder Name
Dim strTempDir As String
Dim lngX As Long
    strTempDir = String$(MAX_PATH, 0)
    lngX = apiGetTempDir(MAX_PATH, strTempDir)
    If lngX <> 0 Then
        fReturnTempDir = left$(strTempDir, lngX)
    Else
        fReturnTempDir = ""
    End If
End Function
Function fReturnSysDir()
'Returns System Folder Name (C:\WinNT\System32)
Dim strSysDirName As String
Dim lngX As Long
    strSysDirName = String$(MAX_PATH, 0)
    lngX = apiGetSystemDirectory(strSysDirName, MAX_PATH)
    If lngX <> 0 Then
        fReturnSysDir = left$(strSysDirName, lngX)
    Else
        fReturnSysDir = ""
    End If
End Function
Function fReturnWinDir()
'Returns OS Folder (C:\Win95)
Dim strWinDirName As String
Dim lngX As Long
    strWinDirName = String$(MAX_PATH, 0)
    lngX = apiGetWindowsDirectory(strWinDirName, MAX_PATH)
    If lngX <> 0 Then
        fReturnWinDir = left$(strWinDirName, lngX)
    Else
        fReturnWinDir = ""
    End If
End Function
---------------------------------------------------
-- 
Federico
--------------------------------------
Sito Comune di it.comp.appl.access
http://members.xoom.it/it_db_access
--------------------------------------
Tutte le richieste che mi arrivano
in privato, vengono cestinate.
--------------------------------------
Rimuovi paperino. per e-mail
--------------------------------------

E naturalmente fammi sapere come procede.
Stanne certo: non crederai mica che riuscirò a fare tutto da solo ?!
Grazie per ora.
----------------------------------
Niuna impresa, per minima che sia,
può avere cominciamento e fine
senza queste tre cose:
e cioè senza sapere,
senza potere,
senza, con amore, volere.
---------------------------
Anonimo fiorentino sec. XIV

 Stanne certo: non crederai mica che riuscirņ a fare tutto da solo ?!
Mi viene un dubbio.
Non ho provato se si possono creare ed eliminare
riferimenti in un MDE!


riferimenti in un MDE!
In un MDE non è possibile;  se si utilizzano Mdb il progetto viene
reinizializzato.
Mi piacerebbe sapere se qualcun altro è riuscito a risolvere questi
problemi ed a utilizzare file Libreria in modo efficiente.
Un saluto a utti
---------------
Guido
light...@flashnet.it