Hmm also die Funktion macht folgendes :
okay ich schreib mal den gesammten Code der Funktion rein. Es hängt nur an der einen. Die werte, wenn ich sie in C++ ausgeben stimmen auch.
Nur das mit PByte, wie ich es jetzt gemacht hab, geht nicht so...vermutlich immer Zugriefsverletzung unter C++. In Delphi funkt es.
Delphi-Quellcode:
//DLL Funktion
function ReadPackedFileData(PackFileHandle : Integer; DataPos : Integer; DataSize : Integer;
var Bytes : PByte): Integer;
stdcall;
var BytesStream : TBytesStream;
ReadBytes,EndPackBytes : TBytes;
RByte : Byte;
ZLibStream : TZDecompressionStream;
begin
FileSeek(PackFileHandle,DataPos,0);
SetLength(ReadBytes,DataSize);
If FileRead(PackFileHandle,ReadBytes[0],DataSize) = DataSize
then
begin
BytesStream := TBytesStream.Create(ReadBytes);
ZLibStream := TZDecompressionStream.Create(BytesStream);
while ZLibStream.
Read(RByte,1) = 1
do
begin
SetLength(EndPackBytes,High(EndPackBytes)+2);
EndPackBytes[High(EndPackBytes)] := RByte;
end;
Result := High(EndPackBytes)+1;
GetMem(Bytes,Result);
Move(EndPackBytes[0],Bytes^,Result);
ZLibStream.Free;
BytesStream.Free;
end
else
Result := -1;
end;
So funkt es in Delphi :
Delphi-Quellcode:
var I : Integer;
Bytes : TBytes;
BLength : Integer;
PB : PByte;
begin
If String(PackedFileInfo^.FileName) = FileName then
begin
BLength := ReadPackedFileData(FPackInfo.FileHandle,
PackedFileInfo^.FileDataPos,
PackedFileInfo^.FileSizeCompressed,
PB);
if BLength > -1 then
begin
SetLength(Bytes,BLength);
System.Move(PB^,Bytes[0],BLength);
Result := TMemoryStream.Create;
Result.Write(Bytes[0],High(Bytes));
Result.Position := 0;
Bytes := nil;
end;
end;
end;
So und so versuch ich sie aufzurufen (die Integer werte stimmen...') :
Code:
typedef int (*TReadPackedFileData) (int ,int ,int, byte*&);
int main()
{
byte* bytes = NULL;
int Bcount;
//Dynamisch geladen
Bcount = ReadPackedFileData(Test1->FileHandle,Test2->FileDataPos,Test2->FileSizeCompressed, bytes);
}
Der Sinn davon ist das ich die entpackten Daten zurückgeben will.
Da es nicht wie in Delphi mit TBytes geht, wollte ich den Pointer auf den anfange (wie ich auch denke hinbekommen habe) zurückgeben.
Damit man dann mit C++ ähnlichen Funktionen wie Move von Delphi darauf zugreifen kann.