Hola.
Estoy desarrollando un motor para jugar a las damas españolas
http://www.terra.es/personal9/aggg63/damas/damas.htm con la interficie CheckerBoard
http://www.fierz.ch/checkers.htm de Martin Fierz. Ed Gilbert ha desarrollado una DLL que accede a las bases de datos de finales de las damas americanas
http://pages.prodigy.net/eyg/Checkers/egdb_rev3.zip. He creado un pequeño programa que intenta acceder a las bases de datos, pero no me carga bien las funciones que exporta la DLL. A continuacion teneis un resumen de las unidades que uso. La primera funcion me identifica la base de datos pero cuando intento abrir un handle con la segunda, me da un error. ¿Alguien puede ayudarme un poco? Gracias.
Código Delphi
[-]
unit uTiposEGDB;
interface
const
EGDB_BLACK = 0; EGDB_WHITE = 1;
EGDB_UNKNOWN = 0; EGDB_WIN = 1; EGDB_LOSS = 2; EGDB_DRAW = 3;
EGDB_NOT_IN_CACHE = 4; MTC_THRESHOLD = 10; MTC_LESS_THAN_THRESHOLD = 1;
MTC_UNKNOWN = 0;
type
EGDB_TYPE = ( EGDB_KINGSROW_WLD=0, EGDB_KINGSROW_MTC,
EGDB_CAKE_WLD, EGDB_CHINOOK_WLD,
EGDB_KINGSROW32_WLD, EGDB_KINGSROW32_MTC,
EGDB_CHINOOK_ITALIAN_WLD, EGDB_KINGSROW32_ITALIAN_WLD,
EGDB_KINGSROW32_ITALIAN_MTC);
EGDB_STATS = record
lru_cache_hits,lru_cache_loads,autoload_hits,db_requests,
db_returns, db_not_present_requests: cardinal;
end;
EGDB_BITMAP_TYPE = (EGDB_NORMAL=0, EGDB_ROW_REVERSED);
EGDB_NORMAL_BITMAP = record
black,white,king: cardinal;
end;
EGDB_ROW_REVERSED_BITMAP = record
black_man,black_king,white_man,white_king: cardinal;
end;
EGDB_BITMAP = record
case integer of
0: (normal: EGDB_NORMAL_BITMAP);
1: (row_reversed: EGDB_ROW_REVERSED_BITMAP);
end;
PEGDB_BITMAP = ^EGDB_BITMAP;
PEGDB_STATS = ^EGDB_STATS;
PEGDB_driver = ^TEGDB_driver;
TEGDB_driver = record
lookup: function (handle: PEGDB_driver; position: PEGDB_BITMAP;
color: integer; cl: integer):longint; cdecl;
reset_stats: procedure (handle: PEGDB_driver);
get_stats: function (handle: PEGDB_driver): PEGDB_STATS;
verify: function (handle: PEGDB_driver): integer;
close: function (handle: PEGDB_driver): integer;
internal_data: pointer;
end;
type
TFMensajes = procedure(texto: pAnsiChar); cdecl;
var
FicheroTexto: TextFile;
HandleDLL: THandle;
function IdentificarTablaFinales(directory: pAnsiChar;
var db_type: EGDB_TYPE; var max_pieces: Integer):integer; stdcal;
function AbrirTablaFinales(bitmap_type: EGDB_BITMAP_TYPE; pieces,
cache_mb: Integer;directory: pAnsiChar; FMensajes: TFMensajes) : PEGDB_DRIVER;
cdecl; external 'egdb.dll' index 6;
procedure FMensaje(texto: pAnsiChar); cdecl;
begin
AssignFile(FicheroTexto,'FicheroEGDB.txt');
Rewrite(FicheroTexto);
Write(FicheroTexto,texto);
CloseFile(FicheroTexto);
end;
function CargarFuncionDLL(FicheroDLL: String; var HandleDLL:
THandle; Nombre: String; Indice: Integer=-1) :Pointer;
begin
Result:=nil;
HandleDLL:=0;
HandleDLL:=LoadLibrary(pAnsiChar(FicheroDLL));
If HandleDLL=0 then Exit;
If Indice<0 then
Result:=GetProcAddress(HandleDLL,pAnsiChar(Nombre))
else
Result:=GetProcAddress(HandleDLL,pAnsiChar(Indice));
end;
function DescripcionTipoEGDB(tipo: EGDB_TYPE):string;
begin
case tipo of
EGDB_KINGSROW_WLD: result:='KingsRow WLD';
EGDB_KINGSROW_MTC: result:='KingsRow MTC';
end;
end;
procedure TForm1.btnIdentificarTFClick(Sender:TObject);
var
directorio: pAnsiChar;
TipoEGDB: EGDB_TYPE;
HandleEGDB: PEGDB_DRIVER;
piezas: Integer;
tipo: Integer;
FMensajes: TFMensajes;
begin
HandleDLL:=LoadLibrary('egdb.dll');
IdentificarTablaFinales:=CargarFuncionDLL'egdb.dll',HandleDLL,'egdb_identify');
directorio:='c:\damas\damas\egdb\cake';
IdentificarTablaFinales(directorio,TipoEGDB,piezas);
memResultados.Lines.Add('Tipo EGDB: '+DescripcionTipoEGDB(TipoEGDB));
memResultados.Lines.Add('Piezas: '+inttostr(piezas));
AbrirTablaFinales:=CargarFuncionDLL('egdb.dll',HandleDLL,'egdb_open',6);
HandleEGDB:=AbrirTablaFinales(EGDB_NORMAL,piezas,300,directorio,FMensajes);
FreeLibrary(HandleDLL);
end;