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 -.-