AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Var Parameter in C++

Ein Thema von NickelM · begonnen am 8. Jul 2011 · letzter Beitrag vom 11. Jul 2011
 
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, 12: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 12:53 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 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 by Thomas Breitkreuz