AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi IPropertyStorage und Properties auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

IPropertyStorage und Properties auslesen

Ein Thema von Ultimator · begonnen am 19. Okt 2005 · letzter Beitrag vom 20. Okt 2005
Antwort Antwort
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#1

IPropertyStorage und Properties auslesen

  Alt 19. Okt 2005, 14:10
Herrlich, ständig ein Problem haben zu können

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.
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von Orbmu2k
Orbmu2k

Registriert seit: 29. Nov 2004
Ort: Erfurt
254 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: IPropertyStorage und Properties auslesen

  Alt 19. Okt 2005, 14:21
Wenn nur darum geht den VolumeName einer Partition oder eines Laufwerks herauszufinden schau mal hier:
http://www.swissdelphicenter.ch/de/showcode.php?id=153
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#3

Re: IPropertyStorage und Properties auslesen

  Alt 19. Okt 2005, 14:27
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
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von Orbmu2k
Orbmu2k

Registriert seit: 29. Nov 2004
Ort: Erfurt
254 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: IPropertyStorage und Properties auslesen

  Alt 19. Okt 2005, 14:32
Was gibt dir ReadMultiple denn zurück ... also was steht in hr2 ?
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#5

Re: IPropertyStorage und Properties auslesen

  Alt 19. Okt 2005, 14:34
hr2 ist S_OK, also scheint alles geklappt zu haben
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#6

Re: IPropertyStorage und Properties auslesen

  Alt 19. Okt 2005, 17:45
So, neue Erkenntnis

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
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 ).
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
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#7

Re: IPropertyStorage und Properties auslesen

  Alt 20. Okt 2005, 15:09
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
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 = 'VolumeNamethen
    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
Julian J. Pracht
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz