Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IPropertyStorage und Properties auslesen (https://www.delphipraxis.net/55309-ipropertystorage-und-properties-auslesen.html)

Ultimator 19. Okt 2005 13:10


IPropertyStorage und Properties auslesen
 
Herrlich, ständig ein Problem haben zu können :mrgreen:

Also folgendes: Ich erhalte ein gefülltes Storage (Typ IPropertyStorage) von einer Funktion.
Nun hab ich mir schon einiges zum Thema Auslesen der Werte und Propertynamen durchgelesen, aber habs nie wirklich geschafft :?
Und zwar brauche ich den Wert der Property "VolumeName" des Storage.
Das Storage hat folgende Propertynamen:
Zitat:

Current properties include:
VolumeName
PlaceBootImageOnDisc
BootImageManufacturerIDString
BootImagePlatform
BootImageEmulationType
BootImage
Wie komm ich jetzt aber an den Wert der "VolumeName"-Property?

Das ist der Code, den ich bisher hab:
Delphi-Quellcode:
var
pPropStg: IPropertyStorage;
propSpec: array of TPropSpec;
propvar: array of TPropVariant;
setlength(propspec, 1);
    setlength(propvar, 1);
    ZeroMemory(@propSpec[0], sizeof(TPropSpec));
    ZeroMemory(@PropVar[0], sizeof(TPropVariant));
    propSpec[0].ulkind := PRSPEC_LPWSTR;
    propSpec[0].lpwstr := 'VolumeName';
    hr2 := pPropstg.ReadMultiple(1, @propSpec[0], @propvar[0]);
Nach dem pPropStg.ReadMultiple müsste doch theoretisch in propvar[0] der Wert der VolumeName-Property stehen, oder nicht? :|
Tuts aber nicht...

Ich hoffe, ihr könnt mir helfen.

Orbmu2k 19. Okt 2005 13:21

Re: IPropertyStorage und Properties auslesen
 
Wenn nur darum geht den VolumeName einer Partition oder eines Laufwerks herauszufinden schau mal hier:
http://www.swissdelphicenter.ch/de/showcode.php?id=153

Ultimator 19. Okt 2005 13:27

Re: IPropertyStorage und Properties auslesen
 
Nein, sorry, darum gehts nicht *g*
Es geht drum, dass ich mit Hilfe dieses PropertyStorages VolumeName einer CD, die ich per IMAPI brennen will, lesen und schreiben kann.
Ich lasse mir das PropetryStorage von IJolietDiscMaster.GetJolietProperties zurückgeben, um u.a. eben den VolumeName zu erhalten und mit SetJolietProperties kann ich die Properties wieder schreiben (ich will eben VolumeName schreiben).
Ich könnte natürlich gleich SetJolietProperties aufrufen, aber das klappt erst recht nicht, weil ich dann erst das PropertyStorage mit den richtigen Properties erschaffen muss, was auch wieder ein Hindernis darstellt. Wenn ich aber erst GetJolietProperties aufrufe, dann bekomm ich schon ein fertig "konfiguriertes" PropertyStorage und muss nur die relevanten Daten ändern ;)

Orbmu2k 19. Okt 2005 13:32

Re: IPropertyStorage und Properties auslesen
 
Was gibt dir ReadMultiple denn zurück ... also was steht in hr2 ?

Ultimator 19. Okt 2005 13:34

Re: IPropertyStorage und Properties auslesen
 
hr2 ist S_OK, also scheint alles geklappt zu haben :|

Ultimator 19. Okt 2005 16:45

Re: IPropertyStorage und Properties auslesen
 
So, neue Erkenntnis :mrgreen:

Ich hab jetzt auf einer koreanischen Seite etwas gefunden, das mir arg nach den aussieht, was ich haben will.
Dummerweise eben mit tausenden nicht darstellbaren Zeichen, die dann als Kästchen enden :mrgreen:
Aber das ist nur der erklärende Text zum Code, den ich dort gefunden hab. Den hab ich versucht, nach Delphi zu portierern.
Wenn ihr wollt, kann ich die URL auch mal angeben.
Leider klappt das noch nicht so ganz. Hier mein aktueller Code und drunter die Erklärung *g*
Delphi-Quellcode:
  aJDMaster.GetJolietProperties(pPropStg);
    setlength(propspec, 1);
    setlength(propvar, 1);
    ppropstg.Enum(penumprop);

while (penumProp.Next(1, sps, @fetched) = S_OK) do
 begin
  ZeroMemory(@PropVar[0], sizeof(TPropVariant));
  propspec[0].ulKind := PRSPEC_PROPID;
  propspec[0].propid := sps.propid;

  pPropStg.ReadMultiple(1, @propspec[0], @propvar[0]);
 if (sps.lpwstrName = 'VolumeName') then
  begin
   if Assigned(propvar[0].bstrVal) then
    ShowMessage(propvar[0].bstrVal);
   if Assigned(propvar[0].pszval) then
    ShowMessage(propvar[0].pszval);
   if Assigned(propvar[0].pwszval) then
    ShowMessage(propvar[0].pwszval);
  end;
 end;
aJDMaster ist vom Typ IJolietDiscMaster, tut hier aber nichts zur Sache.
propspec ist ein Array [0..1] (hab ich testhalber so dimensioniert) of TPropSpec.
propvar ist ein Array [0..1] (gleicher Grund wie oben) of TPropVar.
pPropStg ist vom Typ IPropertyStorage.
penumprop ist vom Typ IEnumSTATPROPSTG.
Und sps ist vom Typ STATPROPSTG.

Code dürfte eigentlich soweit klar sein (wenn sich jemand damit auskennt :mrgreen:).
Erst lasse ich mir per pPropStg.Enum nen Enumerator geben.
Dann durchlaufe ich eine Schleife, in der ich alle Properties im PropertySet (so nenn ich das mal *g*) durchlaufe und dabei rufe ich pPropStg.ReadMultiple auf, um mir ggf. den Wert der Property VolumeName anzeigen zu lassen.
(Okay, die 3 verschiedenen ShowMessages hab ich nur drin, weil ich nicht weiß, in welchem der Wert evtl. steht xD)

Also bin ich zusammenfassend schon so weit, mitzubekommen, wenn die Property VolumeName gefunden enumeriert wird.

Aber hilfebedürftig bin ich trotzdem noch :mrgreen:

Ultimator 20. Okt 2005 14:09

Re: IPropertyStorage und Properties auslesen
 
So, ich habs jetzt geschafft :)
Es schien deswegen nicht zu funktionieren, weil ganz einfach die Property VolumeName nicht gesetzt war und somit einen leeren BSTR enthielt. Da hab ich natürlich gedacht, ich hab was falsch gemacht :wall:
Also hab ich mal zum Test einen eigenen VolumeName angegeben, und siehe da: Beim Auslesen krieg ich ihn wieder zu sehen *g*

An die Nachwelt: Hier mein funktionierender Code
Delphi-Quellcode:
  aJDMaster.GetJolietProperties(pPropStg);
  pPropStg.Enum(penumprop);

  while (pEnumProp.Next(1, sps, @fetched) = S_OK) do
  begin
    ZeroMemory(@propSpec, sizeof(TPropSpec));
    ZeroMemory(@PropVar, sizeof(TPropVariant));
    propSpec.ulkind := PRSPEC_PROPID;
    propSpec.propid := sps.propid;
    hr2 := pPropstg.ReadMultiple(1, @propSpec, @propvar);
    if sps.lpwstrName = 'VolumeName' then
    begin
     propvar.bstrVal := 'MEINECD';
     pPropStg.WriteMultiple(1, @propspec, @propvar, sps.propid);
     if propvar.vt = VT_BSTR then
      if propvar.bstrVal <> '' then
       ShowMessage(propvar.bstrVal)
      else
       ShowMessage('CD hat keinen VolumeNamen');
    end;
  end;
Entschuldigt bitte den u.U. chaotisch wirkendenden Code, aber der ist ja nur da, um zu sehen/zeigen, dass/ob es klappt ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz