![]() |
IStorage.CreateStream -> Länge des Namens/EOleSysError
So, wiedermal ein Problem *gg*
Ich muss mich im Rahmen meines Programmes mit dem IStorage-Interface auseinandersetzen. Genauer, mit IStorage.CreateStream (nachzulesen ![]() 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:
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:
Ich hoff, ihr könnt mir (wie schon so oft *schleim* :mrgreen:) sagem, was ich anders machen muss, damit alles klappt :)
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; 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 :mrgreen: Wäre gut, wenn mir jemand helfen könnte :) |
Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro
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.
|
Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro
Hi Jim.
Zitat:
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? :-| |
Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro
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^^ |
Re: IStorage.CreateStream -> Länge des Namens/EOleSysErro
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 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