Modification de propriétés avancés de Fichiers
Stagiaire WDF
Inscrit:
18/11/2004 16:44
De idf
Post(s): 8
Bonjour,

mon but est de modifier les propriétés avancées (Titre, Objet, Commentaire...) d'un fichier via l'API Windows, lorsque vous faites, dans l'explorateur, un clic droit propriété/onglet Résumé.

jusque là ça a l'air simple, or ces données sont stockées au niveau de la partition ntfs dans les "Alternate Data Stream", se sont des données cachées,
qui sont plus ou moins cachés par windows.
voilà pour l'historique

la lecture de ses propriétés pas de souci, voilà d'ailleurs un petit partage
de source, c'est pour moi, c'est cadeau :

//Faut quand meme créé un fichier c:\Nouveau Document texte.txt et changer ses propriétés
objShell est un objet OLE dynamiques
objFolder est un objet OLE dynamiques
objFolderItem est un objet OLE dynamiques
strFileName est une chaîne
strHeader est une chaîne
strValue est une chaîne
objShell = allouer un objet Automation "Shell.Application"
objFolder = objShell>>NameSpace("C:\")
objFolderItem = objFolder>>ParseName("Nouveau Document texte.txt")
POUR i = 1 A 41
   strHeader = objFolder>>GetDetailsOf(objFolder>>Items, i)
   strValue = objFolder>>GetDetailsOf(objFolderItem, i)
   SI strValue <> "" ALORS
      Trace(strHeader + TAB + strValue)
   FIN
FIN

Pour l'écriture, après recherche il ne reste que 2 pistes :
1ere - les Alternate Data Stream, quand vous modifiez une propriété, le systeme créé
2 data stream :
- 1 SummaryInformation => Datas Hexadécimal (non documenté) + les Propriétés saisies (en hexa)
- 2 {4c8cc155-6c1e-11d1-8e41-00c04fb9386d} => Vide

l'ecriture des Alternate Data Stream est possible, mais les données hexadecimal ne sont documentées nulle part

pour infos les "Alternate Data Stream", cache des infos dans les fichiers, sans
modifier la taille du Fichier, et elles sont invisibles de windows, on peut meme
lancer des applications via un chemin renseigné dedans mais bon allez voir sur google

2 eme - ole2.dll et la classe de dll "IPropertyStorage",
j'ai recupéré un code source en c++, mais je n'arrive pas à le convertir, et
a acceder a une classe d'une dll

si quelqu'un peux m'aider

voici le code :
// SummaryPropPage.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <ole2.h>

//Implicitly link ole32.dll
#pragma comment( lib, "ole32.lib" )

const FMTID PropSetfmtid ={ /* F29F85E0-4FF9-1068-AB91-08002B27B3D9 */
0xf29f85e0,
0x4ff9,
0x1068,
{0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9 }
};

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
IPropertySetStorage *pPropSetStg = NULL;
IPropertyStorage *pPropStg = NULL;
PROPSPEC propspec; 
PROPVARIANT propWrite; 
PROPVARIANT propRead;
HRESULT hr = S_OK;

// Open a file and a property set within it.
hr = StgOpenStorageEx( L"C:\\Document.txt",
STGM_DIRECT|STGM_SHARE_EXCLUSIVE|STGM_READWRITE,
STGFMT_ANY,
// STGFMT_STORAGE //Structured Storage property sets
// STGFMT_FILE //NTFS file system property sets
0,
NULL,
NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg) );
DWORD Result = 0;
if( FAILED(hr) ) 
{
Result = GetLastError();
throw L"Failed StgOpenStorageEx";
}

/* 
hr = pPropSetStg->Open( PropSetfmtid, STGM_WRITE|STGM_SHARE_EXCLUSIVE,
&pPropStg );
*/
hr = pPropSetStg->Create( PropSetfmtid, NULL, PROPSETFLAG_DEFAULT,
STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE,
&pPropStg );

if( FAILED(hr) ) 
throw L"Failed IPropertySetStorage::Open";

//we can identify any property through its Name or its ID
// propspec.ulKind = PRSPEC_LPWSTR;
// propspec.lpwstr = L"Title";

propspec.ulKind = PRSPEC_PROPID;
propspec.propid = 0x00000002;

//specify the value of property
propWrite.vt = VT_LPWSTR;
propWrite.pwszVal = L"this value set through code";

hr = pPropStg->WriteMultiple( 1, &propspec, &propWrite, PID_FIRST_USABLE );

if( FAILED(hr) ) 
throw L"Failed IPropertyStorage::WriteMultiple";

pPropStg->Release(); 
pPropStg = NULL;

//again open the property set
hr = pPropSetStg->Open( PropSetfmtid, STGM_READ|STGM_SHARE_EXCLUSIVE,
&pPropStg );

if( FAILED(hr) ) 
throw L"Failed IPropertySetStorage::Open";

// Read the property back and validate it
hr = pPropStg->ReadMultiple( 1, &propspec, &propRead );
if( FAILED(hr) ) 
throw L"Failed IPropertyStorage::ReadMultiple";

char* str = new char [wcslen(propRead.pwszVal) + 1];
// the "%S" will implicitly convert UNICODE to ANSI.
wsprintfA ( str, "%S", propRead.pwszVal); 

//if you want to display
// MessageBox(NULL,str,"Reading Value",MB_OK);

if( hr == S_FALSE )
throw L"Property didn't exist after reopening the property set"; 
else if( propWrite.vt != propRead.vt )
throw L"Property types didn't match after reopening the property set";
else if( wcscmp( propWrite.pwszVal, propRead.pwszVal ) != 0 )
throw L"Property values didn't match after reopening the property set";
else
wprintf( L"Success\n" );

return 0;
}

Le changement des propriétés de fichiers, servira à tout le monde,
pour l'indexation de ceux ci, plus pratique que l'EXIF (limité au jpg), visible de l'explorateur windows, bref ça vaut le coup de se décarcasser.

ça fait 1 semaine que je suis dessus j'en peux plus

Merci à tous pour votre aide, API Master à vos cerveaux (le mien est décédé)

tonton

Contribution le : 12/06/2008 20:20

Edité par drcharly93 sur 12/6/2008 21:11:47
_________________
TontonPolak was Here...
Créer un fichier PDF de la contribution Imprimer


Re: Modification de propriétés avancés de Fichiers
Animateur WDF
Inscrit:
02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
Bonjour,
tout simplement en utilisant :

Microsoft Developer Support OLE File Property Reader 2

Télécharger ce sdk qui manipule un activex qui permet de lister modifier et ajouter des propriétés personnalisées sur les fichiers.
Plusieurs exemples sont fournis.

Contribution le : 12/06/2008 21:46
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


Re: Modification de propriétés avancés de Fichiers
Stagiaire WDF
Inscrit:
18/11/2004 16:44
De idf
Post(s): 8
Toutes mes excuses Dr,

j'avais oublié,
un de mes buts est d'éviter d'utiliser des dll externes au maximum (surtout pour eviter le regsvr32 en install client),
mais bon par acquis de conscience, j'avais testé la DSOFile.dll et Interop.Dsofile.dll,

Voilà les tests (après enregistrements regsvr32, bien sur) que
j'avais fait sans succès :
1-
oDSO est un objet OLE dynamique
//odso = allouer un objet "DSOFile.OleDocumentProperties"
oDSO = allouer un objet "DSOFile.OleDocumentPropertiesClass"
//odso = allouer un objet "DSOFile.SummaryProperties"
//odso = allouer un objet "DSOFile.CDsoDocumentProperties"
//odso = allouer un objet "DSOleFile.PropertyReader"
//odso = allouer un objet "DSOleFile._OleDocumentProperties"
oDSO>>Open("c:\toto.txt")
Trace(oDSO>>SummaryProperties>>Author, oDSO>>SummaryProperties>>Comments)
oDSO>>Close

2 -
ch_doc est une chaîne = "c:\Nouveau Document Microsoft Word.doc"
AppelDLL32("Interop.Dsofile.dll","Open",&ch_doc)

3 - Code Hexa/eniter correspondant
maDLL est une chaîne = "dsofile.dll"
ch_doc est une chaîne = "c:\Nouveau Document Microsoft Word.doc"
hr est un entier = 0
hr = AppelDLL32(maDLL,65537,&ch_doc)//CDsoDocumentProperties,_OleDocumentProperties,SummaryProperties
Trace("hr : " + hr)
Trace(AppelDLL32(maDLL,65539))//IsReadOnly
Trace(AppelDLL32(maDLL,65540))//IsDirty

Bref 0 pointé, c'etait pourtant, une bonne piste,
la 1ere que j'avais trouvé, mais vite abandonner

peut etre que j'ai mal typé une variable, genre unicode,
si tu as une source qui marche je suis preneur

Je pense que les alternate Data Stream, est LA bonne piste,
à suivre, mais il me manque ces fichus caractères hexadecimal, a définir pour la balise SummaryInformation

C cool Dr

Contribution le : 12/06/2008 22:16

Edité par drcharly93 sur 13/6/2008 9:45:59
Edité par drcharly93 sur 13/6/2008 9:46:39
_________________
TontonPolak was Here...
Créer un fichier PDF de la contribution Imprimer


Re: Modification de propriétés avancés de Fichiers
Stagiaire WDF
Inscrit:
18/11/2004 16:44
De idf
Post(s): 8
C'est bon c'est réglé,

les ADS sont là bonne piste,

merci à Dr

Sujet Clos

Contribution le : 15/06/2008 23:27
_________________
TontonPolak was Here...
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2