OVH Cloud OVH Cloud

Copie des Summary Informations

4 réponses
Avatar
ede
Bonjour à tous,

Je dois transférer les Summary Information d'un fichier à un autre.
Probleme, je ne peux pas creer de fichier compound. Les 2 fichier
(source et dest) doivent rester des fichier "standard".

J'ai essaye (sans succes jusqu'a present) la methode suivante :

hr = StgOpenStorageEx(
pFileName,
STGM_DIRECT | STGM_READWRITE | STGM_SHARE_DENY_WRITE,
STGFMT_ANY,
0,
NULL,
NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg));

sur un fichier cree avec un simple fopen(...).

Ce qui pose apparement probleme, c'est le flag READWRITE !

J'ai egalement trouve la methode IStorage::CopyTo, mais pas moyen non
plus d'obtenir un resultat.

Merci d'avance pour toute aide apportee.

4 réponses

Avatar
adebaene
ede wrote:
Bonjour à tous,

Je dois transférer les Summary Information d'un fichier à un autre.



Probleme, je ne peux pas creer de fichier compound. Les 2 fichier
(source et dest) doivent rester des fichier "standard".



Tu ne peux avoir des "Summary Information" sur un fichier "plat" que si
tu utilises un système de fichier NTFS Version 5 ou plus.

J'ai essaye (sans succes jusqu'a present) la methode suivante :

hr = StgOpenStorageEx(
pFileName,
STGM_DIRECT | STGM_READWRITE | STGM_SHARE_DENY_WRITE,
STGFMT_ANY,
0,
NULL,
NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg));

sur un fichier cree avec un simple fopen(...).


Quelle est la valeur de retour? Le fichier est encore ouvert par
ailleurs ou pas? Avec quels droits?

Arnaud
Avatar
ede
wrote:
ede wrote:

Bonjour à tous,

Je dois transférer les Summary Information d'un fichier à un autre.




Probleme, je ne peux pas creer de fichier compound. Les 2 fichier
(source et dest) doivent rester des fichier "standard".




Tu ne peux avoir des "Summary Information" sur un fichier "plat" que si
tu utilises un système de fichier NTFS Version 5 ou plus.


J'ai essaye (sans succes jusqu'a present) la methode suivante :

hr = StgOpenStorageEx(
pFileName,
STGM_DIRECT | STGM_READWRITE | STGM_SHARE_DENY_WRITE,
STGFMT_ANY,
0,
NULL,
NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg));

sur un fichier cree avec un simple fopen(...).



Quelle est la valeur de retour? Le fichier est encore ouvert par
ailleurs ou pas? Avec quels droits?

Arnaud




Mon systeme de fichier est bien NTFS, OS = W2K. A ce propos, comment
connaitre la version de NTFS ?

Valeur de retour : hr = 0x800300ff, je n'ai trouve aucune valeur de
retour y correspondant.

Le fichier est ferme et les droits sont "controle total pour tout le monde"
Avatar
adebaene
ede wrote:
wrote:
> ede wrote:
>
>>Bonjour à tous,
>>
>>Je dois transférer les Summary Information d'un fichier à un


autre.
>
>
>>Probleme, je ne peux pas creer de fichier compound. Les 2 fichier
>>(source et dest) doivent rester des fichier "standard".
>
>
> Tu ne peux avoir des "Summary Information" sur un fichier "plat"


que si
> tu utilises un système de fichier NTFS Version 5 ou plus.
>
>
>>J'ai essaye (sans succes jusqu'a present) la methode suivante :
>>
>> hr = StgOpenStorageEx(
>> pFileName,
>> STGM_DIRECT | STGM_READWRITE | STGM_SHARE_DENY_WRITE,
>> STGFMT_ANY,
>> 0,
>> NULL,
>> NULL,
>> IID_IPropertySetStorage,
>> reinterpret_cast<void**>(&pPropSetStg));
>>
>>sur un fichier cree avec un simple fopen(...).
>
> Quelle est la valeur de retour? Le fichier est encore ouvert par
> ailleurs ou pas? Avec quels droits?
>
> Arnaud
>

Mon systeme de fichier est bien NTFS, OS = W2K. A ce propos, comment
connaitre la version de NTFS ?



http://www.windowsnetworking.com/kbase/WindowsTips/WindowsXP/AdminTips/Trou bleShooting/WhichversionofNTFSamIrunning.html
Je sais, c'est moche!


Valeur de retour : hr = 0x800300ff, je n'ai trouve aucune valeur de
retour y correspondant.



0x800300ff=STG_E_INVALIDFLAG (défini dans WinError.h. Tu peux aussi le
trouver avec ErrorLookup)
Valeur de retour STG_E_INVALIDFLAG :
"Indicates an invalid flag combination in the grfMode pointer; this
includes both the STGM_DELETEONRELEASE and STGM_CONVERT flag. "

Si on lit en détail la doc sur grfMode :
"If the storage object is opened in direct mode (STGM_DIRECT) with
access to either STGM_WRITE or STGM_READWRITE, the sharing mode must be
STGM_SHARE_EXCLUSIVE unless the STGM_DIRECT_SWMR mode is specified".
Donc, soit tu retires STGM_DIRECT, soit tu requiert un acces exclusif
(STGM_SHARE_EXCLUSIVE).

On peut lire aussi dans la doc sur STGM :
When the STGM_DIRECT flag is specified, only the following combination
of flags may be specified from the access and sharing groups:
STGM_READ | STGM_SHARE_DENY_WRITE
or
STGM_READWRITE | STGM_SHARE_EXCLUSIVE
or
STGM_READ | STGM_PRIORITY



Faut reconnaitre que j'ai rarement vu une API aussi mal foutue et aussi
absconse que celle-ci. Quand on pense que COM est censé être orienté
objet!

Arnaud
MVP - VC
Avatar
ede
wrote:
ede wrote:

wrote:

ede wrote:


Bonjour à tous,

Je dois transférer les Summary Information d'un fichier à un







autre.


Probleme, je ne peux pas creer de fichier compound. Les 2 fichier
(source et dest) doivent rester des fichier "standard".




Tu ne peux avoir des "Summary Information" sur un fichier "plat"





que si

tu utilises un système de fichier NTFS Version 5 ou plus.



J'ai essaye (sans succes jusqu'a present) la methode suivante :

hr = StgOpenStorageEx(
pFileName,
STGM_DIRECT | STGM_READWRITE | STGM_SHARE_DENY_WRITE,
STGFMT_ANY,
0,
NULL,
NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg));

sur un fichier cree avec un simple fopen(...).



Quelle est la valeur de retour? Le fichier est encore ouvert par
ailleurs ou pas? Avec quels droits?

Arnaud




Mon systeme de fichier est bien NTFS, OS = W2K. A ce propos, comment
connaitre la version de NTFS ?




http://www.windowsnetworking.com/kbase/WindowsTips/WindowsXP/AdminTips/TroubleShooting/WhichversionofNTFSamIrunning.html
Je sais, c'est moche!


Valeur de retour : hr = 0x800300ff, je n'ai trouve aucune valeur de
retour y correspondant.




0x800300ff=STG_E_INVALIDFLAG (défini dans WinError.h. Tu peux aussi le
trouver avec ErrorLookup)
Valeur de retour STG_E_INVALIDFLAG :
"Indicates an invalid flag combination in the grfMode pointer; this
includes both the STGM_DELETEONRELEASE and STGM_CONVERT flag. "

Si on lit en détail la doc sur grfMode :
"If the storage object is opened in direct mode (STGM_DIRECT) with
access to either STGM_WRITE or STGM_READWRITE, the sharing mode must be
STGM_SHARE_EXCLUSIVE unless the STGM_DIRECT_SWMR mode is specified".
Donc, soit tu retires STGM_DIRECT, soit tu requiert un acces exclusif
(STGM_SHARE_EXCLUSIVE).

On peut lire aussi dans la doc sur STGM :
When the STGM_DIRECT flag is specified, only the following combination
of flags may be specified from the access and sharing groups:
STGM_READ | STGM_SHARE_DENY_WRITE
or
STGM_READWRITE | STGM_SHARE_EXCLUSIVE
or
STGM_READ | STGM_PRIORITY



Faut reconnaitre que j'ai rarement vu une API aussi mal foutue et aussi
absconse que celle-ci. Quand on pense que COM est censé être orienté
objet!

Arnaud
MVP - VC




Merci beaucoup pour cet éclaircissement :) Je creuse un peu et je te
tiens au courant. Effectivement, cette API est vraiment tortueuse !

Eric