Einzelnen Beitrag anzeigen

NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Delphi Var Parameter in C++

  Alt 9. Jul 2011, 11:50
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.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.

Geändert von NickelM ( 9. Jul 2011 um 11:53 Uhr)
  Mit Zitat antworten Zitat