Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi C++ vs. Delphi - Ist der Code richtig übersetzt? (https://www.delphipraxis.net/123162-c-vs-delphi-ist-der-code-richtig-uebersetzt.html)

napsterxx 28. Okt 2008 18:39


C++ vs. Delphi - Ist der Code richtig übersetzt?
 
Also vll hat der ein oder andere schon in diesem Thread herumgestöbert:
http://www.delphipraxis.net/internal...t.php?t=145044

In diesem ging es einfach ob es Möglich sei dies zu Übersetzen.
Da ich letzen Endes nicht wusste ob es nun möglich ist oder nicht, habe ich es einfach einmal gemacht.
Kurz zu dem Programm Garena.
Läd es eine DLL so wird eine Funktion namens CreatePlugin aufgerufen und dann wird eine weitere Funktion namens GetName aufgerufen.
Ich habe mir ein lauffähiges Plugin (geschrieben in C++) mit Soucecode besorgt um es zu übersetzen.

Hoffe der ein oder andere hat einen Denkanstoß :D
Ich glaube, das ich etwas hier falsch übersetz habe:
C++ Code
Delphi-Quellcode:
//   this is how garena gets a pointer to the plugin class
extern "C" __declspec(dllexport)
IGamePlugin*  CreatePlugin()
{
   static CExampleTcpPlugin _plugin;
    return &_plugin;
}
Delphi Code
Delphi-Quellcode:
function CreatePlugin(): Pointer; stdcall;
var
  _plugin: IGamePlugin;
begin
  _plugin := IGamePlugin.Create;
  Result := @_plugin;
end;

exports
  CreatePlugin;

Apollonius 28. Okt 2008 20:14

Re: C++ vs. Delphi - Ist der Code richtig übersetzt?
 
Das müsste meiner Ansicht nach Result := Pointer(_plugin) heißen.
Ist IGamePlugin kein Interface?

napsterxx 29. Okt 2008 00:08

Re: C++ vs. Delphi - Ist der Code richtig übersetzt?
 
Interface?

Ich habe es geschafft, endlich wird die Funktion GetName aufgerufen, jedoch auch schon beim start von Garena AfterInitGame. Was eigentlich nicht sein dürft.

Also wenn das funktionierende Plugin bei jedem Aufruf einer Methode den Namen dieser in eine Text Datei schreibt sieht der Inhalt dieser nach dem einloggen wie folgt aus:
Zitat:

Constructor() called
GetName() called
IsGameType() called
Bei meinem Delphi-Plugin sieht der Inhalt jedoch so aus:
Zitat:

Constructor() called
OnAfterInitGame() called
GetName() called

nicodex 29. Okt 2008 06:59

Re: C++ vs. Delphi - Ist der Code richtig übersetzt?
 
Code:
class IGamePlugin
{
public:
   virtual int IsGameType(int * gameTypes, int nMax) = 0;
};
Das ist compilerspezifisch und sieht bei MSVC in Delphi-Pseudo-Code etwa so aus:
Delphi-Quellcode:
type
  IGamePluginVtbl = record
    IsGameType: function(gameTypes: PInteger; nMax: Integer): Integer; stdcall; // ecx = this (Self)!
    //...
  end;
  IGamePlugin = record
    Vtbl: ^IGamePluginVtbl;
    //...
  end;
Alleine schon wegen der Aufrufkonvention (__thiscall) lässt sich das nicht ohne Tricks (und Assembler) in Delphi32 abbilden.

Kurz: Was Du vorhast, ist eigentlich Arbeit für jemanden, der sich in beiden Welten auskennt (und Lust und Zeit hat).

napsterxx 29. Okt 2008 11:04

Re: C++ vs. Delphi - Ist der Code richtig übersetzt?
 
Habe das jetzt so alles geändert wie von dir beschrieben, aber immernoch ruft er in der falschen Reihenfolge die funktionen auf

napsterxx 1. Nov 2008 17:37

Re: C++ vs. Delphi - Ist der Code richtig übersetzt?
 
Mh ich denke nicht das das jemand kann und macht


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz