Einzelnen Beitrag anzeigen

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, 14: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