AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi IStorage.CreateStream -> Länge des Namens/EOleSysError
Thema durchsuchen
Ansicht
Themen-Optionen

IStorage.CreateStream -> Länge des Namens/EOleSysError

Ein Thema von Ultimator · begonnen am 12. Okt 2005 · letzter Beitrag vom 24. Nov 2005
Antwort Antwort
Benutzerbild von Ultimator
Ultimator

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

IStorage.CreateStream -> Länge des Namens/EOleSysError

  Alt 12. Okt 2005, 15:11
So, wiedermal ein Problem *gg*

Ich muss mich im Rahmen meines Programmes mit dem IStorage-Interface auseinandersetzen.
Genauer, mit IStorage.CreateStream (nachzulesen hier).

Jetz hab ich aber ein Problem. Wenn nämlich der Name zu lang ist, krieg ich eine EOleSysError-Exception (ich ruf OleCheck auf, um Exceptions mitzukriegen) mit der Meldung
Zitat:
---------------------------
Project1.exe
---------------------------
Der Name "%1" ist ungültig.
---------------------------
OK
---------------------------
Daraufhin hab ich mal in der MSDN-Lib unter IStorage.CreateStream (Link von oben) und hab gefunden, dass "the name must not exceed 31 characters in length". Ich darf also nicht mehr als 31 Zeichen im Namen haben.

Also hab ich mir gedacht, ich geb als Storage-Namen irgendeinen imaginären mit einer fortlaufenden Nummer an. Klappt aber nicht, ich bekomm immernoch die gleiche Meldung.
Hier ist mal der ganze Code, um ein Verzeichnis einem Storage hinzuzufügen (ist aus dem IMAPI-Tutorial vom entwickler):
Delphi-Quellcode:
function AddDirToStorage (aStorage : IStorage; aPath: String): Boolean;
var
  sPath: String;
  sr : TSearchRec;
  swStreamName,swFolderName : WideString;
  stgStream : IStream;
  stgSubDir : IStorage;
  aFilestream : TFileStream;
  aOleStream : TOleStream;
  counter: cardinal;
begin
  counter := 0;
  Result := true;
  aFilestream := nil;
  aOleStream :=nil;
  sPath := IncludeTrailingPathDelimiter(aPath);
  if SysUtils.FindFirst(sPath + '*.*', faAnyFile, sr) = 0 then
    try
      repeat
        if (sr.Name <> '.') and (sr.Name <> '..') then
          if (sr.Attr and faDirectory <= 0) then
            try
              try
                // Datei-Inhalt einlesen und im Stream ablegen
                aFileStream := TFileStream.Create(sPath + sr.Name,fmOpenRead);
                aFileStream.Position := 0;
                // Stream-Eintrag im Storage für die zu sichernde Datei anlegen
                swStreamName := sr.Name;
                OleCheck(aStorage.CreateStream(PWideChar(swStreamName),
                           STGM_CREATE or STGM_READWRITE or STGM_DIRECT or
                           STGM_SHARE_EXCLUSIVE, 0, 0, stgStream));
                // Verbindung zum IStream-Interface über OLE-Stream
                aOleStream := TOleStream.Create(stgStream);
                aOleStream.CopyFrom(aFileStream, aFileStream.Size);
              finally
                FreeAndNil(aOleStream);
                FreeAndNil(aFileStream);
              end;
            except
               Result :=false;
            end
          else
            begin
              swFolderName := sr.Name;
              if length(swFolderName) > 30 then
               begin
                swFolderName := 'Project-Folder' + IntToStr(counter);
                inc(counter);
               end;
              OleCheck(aStorage.CreateStorage(PWideChar(swFoldername),
                 STGM_READWRITE or STGM_CREATE or STGM_DIRECT or
                 STGM_SHARE_EXCLUSIVE , 0, 0, stgSubDir));
              AddDirToStorage(stgSubDir,sPath + sr.Name+ '\');
            end;
        Application.ProcessMessages;
    until FindNext(sr) <> 0;
  finally
    FindClose(sr);
  end;
end;
Ich hoff, ihr könnt mir (wie schon so oft *schleim* ) sagem, was ich anders machen muss, damit alles klappt

PS: Wusste nicht, ob das hier die richtige Sparte is, müsste aber schon, wegen IStorage und so^^

//edit: Ich seh grade, im Demoprogramm, das Bernd Ua auf seiner Internetseite zum Download anbietet, besteht genau der gleiche Fehler, also liegts irgendwo an Windows Wäre gut, wenn mir jemand helfen könnte
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro

  Alt 13. Okt 2005, 00:30
Mmh. Du nutzt WideString heisst 1 Zeichen = 2 Bytes. Vermute mal, dass IStorage Normale Strings erwartet. Von daher wären schon 16 Zeichen bei dir zuviel (16 Zeichen â 2 Bytes = 32 Bytes). Wenn er es nicht als Widestring korrekt interpretiert dann ist 32 mehr als 31. Eventuell liegts aber auch daran, dass eine Datei einen Namen mit mehr als 31 Zeichen hat. Immerhin übergibts du ja auch den Dateinamen dem IStorage.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

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

Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro

  Alt 13. Okt 2005, 16:24
Hi Jim.
Zitat:
pwcsName
[in] A pointer to a wide character null-terminated Unicode string that contains the name of the newly created storage object. The name can be used later to reopen the storage object. The name must not exceed 31 characters in length, not including the string terminator. The 000 through 01f characters, serving as the first character of the stream/storage name, are reserved for use by OLE. This is a compound file restriction, not a structured storage restriction.
So ist der Parameter für den Namen beschrieben, also müsste WideString schon passen...
Angenommen, ich hab jetzt einen Ordner mit Musik (z.B. "Rage Against The Machine - The Battle Of Los Angeles").
Was muss ich mit dem anstellen, damit ich den brennen kann, ohne dass "Name ungültig" kommt?
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

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

Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro

  Alt 14. Okt 2005, 16:15
So, ich hab das jetzt so geändert, dass nach einer bestimmten Anzahl Zeichen einfach angeschnitten wird und ein fortlaufender Index rangehängt wird. Is zwar nicht schön, wenn man Lieder von "Rage Against The Machine" hat, und nicht viel von Titel sieht, aber was soll man machen?

Wenn jemand noch ne schönere Lösung kennt, dann her damit^^
Julian J. Pracht
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#5

Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro

  Alt 24. Nov 2005, 21:13
Hallo,

ich habe zwar leider auch keine Lösung dafür gefunden, aber dafür eine andere Frage. Da Du genau dasselbe machst, wie ich momentan, hoffe ci, Du bist nicht böse, wenn ich Dich direkt frage.

Ich versuche auch etwas zu brennen. Keine Audio-ZTracks. Ich bin gehörlos und da macht das wenig Sinn.
Aber Daten-CDs.
Da ist übrigens das 31-Proble noch unangenehmer, weil Datei- und Verzeichnisnamen abgeschnitten werden müssen! Eine Lösung wäre also wirklich dringend erforderlich!!!

Aber meine Frage zum IStorage.
Wenn man mit dem genannten Demoprogramm ein Verzeichnis brennt, so wird nicht das Verzeichnis als "Wurzel" angelegt, sonderne die Daten aus dem Verzeichnis (Dateien, Unterverzeichnisse) direkt übernommen. Beim Brennen werden dann nur diese Daten gebrannt. Ich hätte aber ganz gerne zuerst einen Eitrag des zu brennenden Direktories und darunter die Daten des Dirs.
Das kriege ich einfach nicht hin!!!
Weißt Du, wie man das machen kann?

Allgemeiner wäre es gut, wenn man ein String direkt als "Storage ohne Inhalt" anlegen könnte, da nur aus einem Storage heraus gebrannt werden kann. Und zwar mit dessen Name. Ob das geht? (Auch das geht wieder in die Richtung Deiner Frage!)

Schönen Gruß
Matthias
  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 15: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