Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Header übersetzung, kleines Problemchen (https://www.delphipraxis.net/120270-header-uebersetzung-kleines-problemchen.html)

DelphiNub 8. Sep 2008 13:25


Header übersetzung, kleines Problemchen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moinsen, ich hätte da ma 'n Problem ^^

Ich schreib zZ an einem Progrämmchen zum überwachen und steuern von Gameservern auf Source-Engine Basis (HL2,CSS,etc)
(Durch Zufall) bin ich dann vor kurzem auf eine Bibliothek direkt von Valve (von denen ist HL2 usw ^^) gestoßen um die dedizierten Server direkt anzusprechen. Geliefert wird eine .dll inkl. Hifle und Header datei für C/C++. (Link)

Eigentlich sollte es ja kein Problem sein das ganze für Delphi verwendbar zu machen, allerdings bin ich da auf was gestoßen womit ich (noch) nichts anfangen kann :(

Folgendes:
Code:
typedef(WINAPI* SSQ_CALLBACK)(DWORD type,PSSQ_REPLY_UNION reply);

"SSQ_CALLBACK" ist ein "typedef union":
Code:
typedef union
{
  PSSQ_BATCH_REPLY batch_reply;
  char* log_reply;
  PSSQ_RULES_REPLY rules_reply;
  char* rcon_reply;
  BOOL log_notify;
} SSQ_REPLY_UNION, *PSSQ_REPLY_UNION;

"SSQ_CALLBACK" wird auch später in einer Funktion als Parameter erwartet.

Im Anhang mal der gesamte header und mein bisheriger Versuch für Delphi (Der soweit auch funktioniert, nur halt alles was im zusammenhang mit diesem SSQ_CALLBACK ist funktioniert nicht :/).

Danke für jegliche Hilfe schonmal im Vorraus ^^

himitsu 8. Sep 2008 14:23

Re: Header übersetzung, kleines Problemchen
 
auf den ersten Bilck würd ich es so übersetzen :gruebel:
Delphi-Quellcode:
type
  SSQ_REPLY_UNION = record
    batch_reply: PSSQ_BATCH_REPLY;
    log_reply:  PChar;
    rules_reply: PSSQ_RULES_REPLY;
    rcon_reply: PChar;
    log_notify: LongBool;
  end;
  PSSQ_REPLY_UNION = ^SSQ_REPLY_UNION;
  SSQ_CALLBACK = Procedure(typ: DWORD; reply: PSSQ_REPLY_UNION); StdCall;

DelphiNub 8. Sep 2008 17:21

Re: Header übersetzung, kleines Problemchen
 
Ja schonmal danke dafür ^^
Hab mal ein wenig in der Doku gekramst und das stand über die SSQ_Callback funktion:

Code:
The SSQ_Callback function is an application-defined callback function.

BOOL WINAPI SSQ_Callback(
   DWORD type,
   PSSQ_REPLY_UNION reply
);
[...]
Return Values:

The function should return TRUE to get all messages of a message loop.
If the function returns FALSE a message loop, if exists, will break.
Von daher nehme ich mal an das dann so aussehen müsste:
Delphi-Quellcode:
SSQ_CALLBACK = function( typ: DWORD; reply: PSSQ_REPLY_UNION ):BOOL; StdCall;
Da SSQ_REPLY_UNION ein uniun struct ist und google mir bisher ausgespuckt hat das das dann ein variant record in delphi wäre sieht's bei mir nu so aus:
Delphi-Quellcode:
 
  SSQ_REPLY_UNION = record
    case Word of
     0: (batch_reply: PSSQ_BATCH_REPLY;);
     1: (log_reply: PChar;);
     2: (rules_reply: PSSQ_RULES_REPLY;);
     3: (rcon_reply: PChar;);
     4: (log_notify: Bool;);
  end;
  PSSQ_REPLY_UNION = ^SSQ_REPLY_UNION;
Meine funktion danach dann (als test)
Delphi-Quellcode:
function MyCB( typ: DWORD; reply: PSSQ_REPLY_UNION ): BOOL; stdcall;
begin
  form1.ListBox1.Items.Add( inttostr( typ ) ); // jaja, is nich schön
  result:= true;
end;
Beim OnCreate dann die initialisierung und ein "SSQ_SetCallbackAddress( MyCB )", was auch true zurück gibt, also von daher ja schonmal alles i.O.

Wenn ich nun aber eine funktion aufrufe die damit im zusammenhang steht gibt mir der Debugger: "Invalid parameter/packet" und danach funktioniert garnichts mehr..

DelphiNub 8. Sep 2008 20:08

Re: Header übersetzung, kleines Problemchen
 
Hmmm, hab mir mal ein wenig die quelldatei der dll angeschaut.
(einigermaßen) zurückführen konnte ich das ganze auf die Überprüfung der Callback-Addresse.

Code:
HIWORD(Callback)==0
Scheint immer richtig zu sein und gibt deswegen die besagte Debug-Nachricht raus. Bin alle funktionen die callback überprüfen durch gegangen, es gibt noch eine weiter überprüfung ob die dll initialisiert wäre aber da andere Funktionen damit ohne Probleme laufen wirds wohl das erste sein.

Hmmm, irgendwie wirds dann wohl doch einfacher wenn ich das ganze von Hand selber schreibe...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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