GameSpy DLL einbinden



  • Hallo

    ist einfach eine Überprüfung

    if (lHandle)
    {
      // Hier Code ausführen, wenn lHandle gültig (!= NULL) ist
      }
    else
    {
      // Hier Code ausführen, wenn lHandle nicht gültig (== NULL) ist
      }
    

    bis bald
    akari



  • Ist bestimmt gut gemeint, aber dein String ist unter BCB auch nichts anderes als eine typedef auf einen AnsiString (siehe sysmac.h). Das hilft dir so gar nichts.
    Dll's arbeiten normalerweise mit char* auf einen String.

    Das mit dem überprüfen ist einfach, das meiste steht ja schon in Pascal vor dir:

    if(hdll == NULL){
     //- tu was, die Dll wurde nicht geladen
    }else{
     //- tu was anderes, die Dll wurde geladen
    }
    

    Die Rückgabewerte dieser Funktionen ( auch GetProcAddress )kriegst du über die Borlandhilfe.



  • ups,
    sorry akari für das doppelposting, da warst du schneller



  • HINSTANCE hdll=LoadLibrary("gsmsalg.dll");
    if(hdll == NULL){
     ShowMessage("gsmsalg.dll konnte nicht geladen werden!");
    }else{
     ShowMessage("DLL erfolgreich geladen!");
    }
    

    Also dll wurde erfolgreich geladen!

    Fehler also beim aufruf.

    Beispiel:

    Secure := ExtractServerToken(TempString);
              //secure =     function  GetGameKey(GameAbbr: String): String; also secure ist ein string!
    
              Key := GetGameKey(GameName);
              Key := uGameSpyKey.getHandoff(Key);
              // ist auch ein string
    
              // Create a client token from the the server token, UT key, and appropriate 'enctype'
              case RadioGroup1.ItemIndex of
                0: AuthReply := GameSpyAuth(Secure, Key, 0);       // benutze DLL !!!!!
                1: AuthReply := uGameSpyKey.gsseckey(Secure, Key); // benutze Delphi unit
              end;
              Memo2.Lines.Add('Generated client token = ' + AuthReply);
            except
              raise;
            end;
    
            // SEND AUTH
            // hier sendet er den code dann über idtcp das kann ich....
    

    man hat ja die wahl zwischen der dll und dem

    delphi code:

    [/cpp]unit uGameSpyKey;

    interface
    function addchar(var Validate: string; number: byte): string;
    function getHandoff(const Handoff: string): string;
    function gsseckey(SecureKey, HandOff: String): String;

    implementation

    function getHandoff(const Handoff: string): string;
    var
    i : byte ; // Loop-var
    // Handoff is too short:
    begin
    Result := '';
    if Length(Handoff) < 13 Then
    Result := Handoff
    else begin
    i := 3;
    while i <= 13 do begin
    // Add next char to our new Handoff
    Result := Result + Copy(Handoff, i, 1);
    Inc(i, 2);
    end;
    end;
    end; { function }

    function addchar(var Validate: string; number: byte): string;
    var
    newchar: String;
    begin
    if (Number < 26) then
    newchar := Chr(Number + 65)
    else if (Number < 52) then
    newchar := Chr(Number + 71)
    else if (Number < 62) then
    newchar := Chr(Number - 4)
    else if (Number = 62) then
    newchar := '+'
    else if (Number = 63) then
    newchar := '/';
    Validate := validate + newchar;
    end;

    function gsseckey(SecureKey, HandOff: String): String;
    var
    Table: Array[0..255] Of Byte;
    Key: Array of Byte;
    Len: Array[0..1] Of Byte;
    Temp: Array[0..3] Of Byte;
    I, X: Integer;
    Validate: String;
    begin
    FillChar(Temp,4,0);

    for I := 0 to 255 do
    Table[I] := I;

    Len[0] := Length(Handoff);
    Len[1] := Length(SecureKey);

    for i := 0 to 255 do begin

    Temp[0] := (Temp[0] + Table[i] + Ord(Handoff[i mod Len[0] + 1])) AND 255;
    Temp[1] := Table[Temp[0]];
    Table[Temp[0]] := Table[i];
    Table[i] := Temp[1];

    end;

    Temp[0] := 0;
    SetLength(Key,Len[1]);
    Len[1] := Len[1] Div 3;

    for I := 0 to High(Key) do begin
    Key[i] := Ord(SecureKey[i+1]);
    Temp[0] := (Temp[0] + Key[i] + 1) AND 255;
    Temp[1] := Table[Temp[0]];
    Temp[2] := (Temp[2] + Temp[1]) AND 255;
    Temp[3] := Table[Temp[2]];

    Table[Temp[2]] := Temp[1];
    Table[Temp[0]] := Temp[3];

    Key[i] := Key[i] XOR Table[(Temp[1] + Temp[3]) AND 255];
    end;

    i := 0;

    while Len[1] >= 1 do begin
    Len[1] := Len[1] - 1;

    Temp[1] := Key[i];
    Temp[3] := Key[i + 1];
    addchar(Validate,(Temp[1] shr 2));
    addchar(validate,((Temp[1] AND 3) shl 4 OR Temp[3] shr 4));

    Temp[1] := Key[i + 2];

    addchar(validate,((Temp[3] AND 15) shl 2 OR Temp[1] shr 6));
    addchar(validate,Temp[1] AND 63);

    i := i + 3;
    end;

    Result := validate;
    end;
    end.[cpp]

    Aber wie soll man das nur übersetzen?

    gibt es keinen Delphi -> BCB übersetzer?



  • Jetzt machst du es dir doch zu einfach.
    Hier sind bestimmt viele Leute, die dir beim einbinden deiner dll aufs Pferd helfen, reiten musst du aber schon alleine.



  • Hm schon wahr.

    Also ich habe jetzt hier entnommen:

    function TForm1.GameSpyAuth(Secure, Key: String; AuthType: Integer): String;
    var
      lHandle: THandle;
      func: TSkynetAuthDll;
    begin
      lHandle := LoadLibrary(pchar(FCurrentDir + '\' + FAuthDLL));
      try
        if lHandle <> 0 then begin
          @func := GetProcAddress(lHandle, 'gsseckey'); //seckey
          if @func <> nil then begin
            SetLength(Result, Round(Length(Secure) * (4 / 3)));
            func(PChar(Result), PChar(Secure), PChar(Key), AuthType);
          end else
            raise EExternalLibraryMethodNotFound.Create('Error locating function in DLL library: ' + FCurrentDir + '\' + FAuthDLL);
        end else
          raise EFileNotFoundError.Create('Missing DLL library file: ' + FCurrentDir + '\' + FAuthDLL);
      finally
        FreeLibrary(lHandle);
      end;
    end;
    

    genauer dort:
    [/cpp]@func := GetProcAddress(lHandle, 'gsseckey'); //seckey[cpp]

    ,dass GameSpyAuth nicht die Funktion der DLL sondern des Delphi Beispiels ist.

    gsseckey heisst die Funktion in der DLL.

    habe das jetzt angepasst und bekomme immerhin schon eine andere Fehlermeldung:

    Projekt nggserver.exe raised exception class EAccessVoilation with message 'Access violation at address 40006B10 in module 'rtl60.bpl'. Read of address 73686363'. Process stopped. Use Step or Run to continue.

    das kommt, wenn ich gsseckey als funktion nehme. Wenn ich etwas anderen als funktion schreibe kommt ein anderer fehler und als speicheraddresse 0000000...

    das bedeutet ich habe die richtige funktion, diese aber falsch angewand.



  • Hier wird die Funktion der DLL genutzt um den code zu erzeugen:

    SetLength(Result, Round(Length(Secure) * (4 / 3)));
            func(PChar(Result), PChar(Secure), PChar(Key), AuthType);
    

    Aber wie soll ich das übersetzen?



  • habs gleich geschaft! ganz alleine 😉



  • Habs doch noch nicht geschafft 😞 denn:

    func(PChar(Result), PChar(Secure), PChar(Key), AuthType);
    

    Ist ja nicht die anwendung der Funktion. Aber ich finde im Beispiel kein anwendung (wo dann ja auch zu erkennen sein sollte, was für ein wert AuthType ist)....



  • {*******************************************************************************
    *     Create a client token using the 'gsmsalg.dll' file available from:       *
    *                                                                              *
    ********************************************************************************}
    function TForm1.GameSpyAuth(Secure, Key: String; AuthType: Integer): String;
    var
      lHandle: THandle;
      func: TSkynetAuthDll;
    begin
      lHandle := LoadLibrary(pchar(FCurrentDir + '\' + FAuthDLL));
      try
        if lHandle <> 0 then begin
          @func := GetProcAddress(lHandle, 'gsseckey'); //seckey
          if @func <> nil then begin
            SetLength(Result, Round(Length(Secure) * (4 / 3)));
            func(PChar(Result), PChar(Secure), PChar(Key), AuthType);
          end else
            raise EExternalLibraryMethodNotFound.Create('Error locating function in DLL library: ' + FCurrentDir + '\' + FAuthDLL);
        end else
          raise EFileNotFoundError.Create('Missing DLL library file: ' + FCurrentDir + '\' + FAuthDLL);
      finally
        FreeLibrary(lHandle);
      end;
    end;
    

    das ist eine funktion, die beinhaltet ein weitere funktion zu definieren. 😕

    Also ich kann da nicht erkennen, das eine funktion der DLL angewand wird.

    Sei denn,

    func(PChar(Result), PChar(Secure), PChar(Key), AuthType);

    Result soll eich char sein, wo Secure und key durch AuthType herreingeneriert wird? mal versuchen



  • So habe wieder eine fehlermeldung wunderbar!

    Projekt nggserver.exe raised exception... in module 'gsmsalg.dll'. Read of address...

    zumindest ist jetzt die funktion richtig, aber immer noch fehler -.-


Anmelden zum Antworten