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