Newsgroup: it.comp.lang.visual-basic
Titolo: Scriver/leggere info standard  nei file utilizzando gli Alternate Data Streams

Salve a tutti,
tramite codice VB è possibile leggere/scrivere info Alternate Data Stream
"Standard" su qualsiasi tipo di file?
Mi spiego meglio
A)
ALTERNATE DATA STREAM
http://sicurezza.html.it/articoli/articoli.asp?IdCatArticoli=18&idarticoli=119
B) Con il termine "Standard" intendo quelle info che sono fruibili in una
partizione NTFS,  selezionando un file -> cliccando con il tasto destro del
mouse -> "proprietà" -> "Riepilogo"; vale a dire:
Titolo; Oggetto; Autore; Categorie; Parole chiave; Commenti.
Ecco, io vorrei sapere se con l'ausilio di VB è possibile gestire questi
campi.
Ora, è opportuno premettere che ravanando e riravanando nella rete mi sono
imbattuto in numerosi esempi di codice VB  predisposto per gestire  ADS
"non standard"(creati dall'utente).
Invece, relativamente agli "standard": nisba! :(
Esiste qualche anima pia che può venirmi in soccorso?
TIA per l'aiuto,
Stolcius Von Stolcenberg, AKA Mich&l& Coll@tin@
 

 Invece, relativamente agli "standard": nisba! :(
Purtroppo dire che esempi in rete per visual basic non abbondino e` un
eufemismo :-(
L'argomento e` interessante, anche se di fatto non l'ho mai sfruttato.
Scavando nella cache di google ho recuperato questo articolo in tedesco
(link su piu` righe da "ricucire" in una sola)
http://72.14.207.104/search?q=
cache:VpssyLKXE9wJ:
212.227.192.109/zforen/msw/m/msw-1123154870-14240.html
+%22Declare+Function+StgOpenStorageEx%22&hl=en&ct=clnk&cd=2
di cui riporto il codice prima che sparisca definitivamente.
Non ho modo di provarlo ora, pertanto un tuo feedback, anche negativo, sara`
gradito.
<CODICE VB>
Option Explicit
Private Declare Function StgOpenStorageEx Lib "ole32" ( _
  ByVal pwcsName As Long, ByVal grfMode As STGM, ByVal STGFMT As Long, _
  ByVal grfAttrs As Long, ByVal pStgOptions As Long, ByVal reserved2 As Long, _
  ByRef riid As UUID, ByRef ppObjectOpen As IStorage) As Long
Sub ApplicationProperty()
  ' Application Property korrekt ermitteln, nur für Windows 2000 und höher
  ' Wolfram, 16.7.2005, benötigt Verweis auf Edanmos OLELIB.TLB 
						(Typendeklarationen)
  ' für Annette - SHMILY
 
  Dim IID_IPropertySetStorage As UUID, FMTID As UUID
  Dim oPropSet As IPropertySetStorage, oPropStg As IPropertyStorage
  Dim iVT As Integer, p As Long, s As String, prop As PROPSPEC, v As Variant
 
  If Len(ActiveDocument.path) = 0 Then MsgBox "Datei nicht gespeichert": 
								Exit Sub
  s = ActiveDocument.FullName
  CLSIDFromString "{0000013A-0000-0000-C000-000000000046}", 
						IID_IPropertySetStorage
  CLSIDFromString "{F29F85E0-4FF9-1068-AB91-08002B27B3D9}", FMTID
  On Error Resume Next
  If StgIsStorageFile(s) Then MsgBox "Datei " & s & " ist kein Storage-File": 
								Exit Sub
  If 0 <> StgOpenStorageEx(StrPtr(s), STGM_READ Or STGM_PRIORITY, _
                           5, 0, 0, 0, IID_IPropertySetStorage, oPropSet) 
								Then
      MsgBox "Kann Datei " & s & " nicht öffnen": Exit Sub
  End If
 
  Set oPropStg = oPropSet.Open(FMTID, STGM_READ Or STGM_SHARE_EXCLUSIVE)
  If Err.number = 0 Then
    prop.ulKind = PRSPEC_PROPID                 ' Property: ID
    prop.ID_or_LPWSTR = PIDSI_APPNAME           ' ID: Application Name
    oPropStg.ReadMultiple 1, prop, v            ' read property
    If Not IsEmpty(v) Then
      If VarType(v) = VT_LPSTR Or VarType(v) = VT_LPWSTR Then
        MoveMemory iVT, v, 2                  ' prop vartype
        MoveMemory p, ByVal VarPtr(v) + 8, 4  ' prop stringptr
        Select Case iVT
          Case VT_LPSTR: s = String$(lstrlenA(p), 0): lstrcpyA s, ByVal p
          Case VT_LPWSTR:  s = SysAllocString(p)
        End Select
        PropVariantClear v
        MsgBox "Datei wurde gespeichert unter: " & s
      End If
    End If
  End If
  Set oPropStg = Nothing: Set oPropSet = Nothing
End Sub
</CODICE VB>
Nota: ho accorciato alcune righe che superavano i 72 caratteri portando
di sotto, allineando a destra, le parole che eccedevano. 
quindi, cosi` com'e` non compila, occorre aggiustare le righe ;-)
Per compilare il codice qui sopra occorre la type library OLELIB.TLB di
Morcillo: 
http://www.mvps.org/emorcillo/download/vb6/tl_ole.zip
.
Ovviamente per MoveMemory e compagnia, si puo` far riferimento all' API
Viewer fornito con lo stesso visual basic.
-- 
ciao, hal

   ' für Annette - SHMILY
feedback_ot: l'ultima linea e' molto graziosa :)
http://acronyms.thefreedictionary.com/SHMILY
ciao, a.

 
http://acronyms.thefreedictionary.com/SHMILY
carina, non l'avevo notata :-)
-- 
buona notte,
hal

 gradito.
Ti ringrazio di cuore per l'aiuto. :-)
Ho provato il codice.
Funziona, ma solo con file .doc :-(
Io avrei bisogno di accedere agli ADS di molti altri tipi di file.
In questo sito ho trovato qualche scampolo di codice, ma in C:
http://members.chello.be/ws36637/properties.html
Altro materiale l'ho pescato sui NG con le sgg. chiavi di ricerca:
http://tinyurl.com/rpjg9
Non riesco però a risolvere il busillis...
Mi è però venuta in mente un'escamotage che, con il tuo/vostro prezioso
aiuto forse potrebbe risolvere il problema.
La soluzione, poi, non prevederebbe l'utilizzo di librerie & affini(e non è
cosa da poco!).
Veniamo al dunque.
Utilizzando LADS(ne ho giò parlato) scopro che le info "standard" vengono
salvate in un ADS nominato: SummaryInformation. 
Procedo quindi secondo la seg. prassi:
1)Accedo ai dati contenuti nell'ADS citato con il comando Shell: "notepad
[percorso]file_visibile.xxx:[ctrl+e]SummaryInformation." (N.B: la sequenza
di escape e il punto finale sono essenziali).
Notepad si apre e visualizza una serie di caratteri indecifrabili.
2)Copio e incollo i dati  in un altro file di testo e poi lo salvo tramite
"save as" con codifica "big-endian unicode"(il passaggio nell'altro file si
rende necessario in quanto il "save as" del primo prende errore).
 
3) Apro il file con un edito Esadecimale e, meraviglia delle 
    meraviglie, i dati sono lì sgambettanti.
Il problema, a questo punto è trovare un modo per estrarli secondo le varie
tipologie.
Il file di flusso potrebbe essere aperto con un "open" binario e immesso in
un buffer Byte.
Successivamente questo può essere convertito in esadecimale e, individuate
le sequenze di delimitazione dei vari campi, i dati potrebbero essere
infine estratti.
Che ne pensi?
La cosa è fattibile o sto prendendo una cantonata?


 La cosa è fattibile o sto prendendo una cantonata?
come vedi, vb6 e` ancora un ottimo coltellino svizzero che non
ha niente da invidiare alle versioni successive, anzi! 
-- 
ciao, hal

 vedremo anche questo caso).
appunto, vedremo! me n'ero completamente dimenticato :P
l'unico esempio trovato al momento in rete e` questo, fatto con 
vb.net
,
ma e` traducibile in vb5/6 (ricostruire il link):
http://groups.google.com/group/microsoft.public.dotnet.languages.vb/
       browse_thread/thread/3bf2c608086493cb/4bfd665ea44c7388?lnk=st&
       q=%22Declare+Function+NtQueryInformationFile%22&rnum=1&hl=en
       #4bfd665ea44c7388
avendo tempo e voglia, si potrebbe fare una classe vb6 per il sito
comune.
io, da linuxaro convinto e soddisfatto, passo la palla :P
-- 
ciao, hal

 native di visual basic.
Innanzitutto grazie per i preziosi consigli. :-)
Ho provato ad aprire l'ADS  "SummaryInformation." tramite  un open binario.
Con le opportune conversioni sono anche riuscito a  visionare le
descrizioni precedentemente immesse.
A questo punto, il problema che mi si è posto davanti come una vera e
propria pietra d'inciampo è il seguente: non c'è modo di capire a quale
tipologia di campo(vale a dire: Titolo, Autore, Commenti etc. 
) queste benedette descrizioni appartengano!
Ciò deriva dal fatto che i campi non hanno una posizione fissa nel file e
non esistono marcatori/puntatori individuabili senza conoscere sia il
tracciato logico, sia la formattazione del file.
 
Disdetta: ho il pane, ma non i denti! :-(
Per caso, hai qualche graditissimo uovo di Colombo a portata di mouse? :-)
Ciao e grazie ancora per l'attenzione,
