unit uMyDLL; interface uses Windows; type PMyVar = ^TMyVar; TMyVar = record iStrLen: Longint; sValue: PAnsiChar; iValue: Longint; dValue: double; end; PMyField = ^TMyField; TMyField = record iStrLen: Longint; sName: PAnsiChar; iDatatype: Longint; iMaxlen: Longint; iFlags: Longint; end; procedure mydll_free; function mydll_load( name: PChar ): boolean; var mydll_handle: HMODULE = 0; mydll_createNewConnection: function: Longint; stdcall; mydll_setOptions: procedure( iConn: Longint; sHost: PAnsiChar; iPort: Longint; sUser: PAnsiChar; sPass: PAnsiChar ); stdcall; mydll_connect: function( iConn: Longint ): bool; stdcall; mydll_disconnect: procedure( iConn: Longint ); stdcall; mydll_closeConnection: procedure( iConn: Longint ); stdcall; mydll_selectDatabase: function( iConn: Longint; sDBName: PAnsiChar ): bool; stdcall; mydll_openQuery: function( iConn: Longint; sQuery: PAnsiChar ): bool; stdcall; mydll_close: procedure( iConn: Longint ); stdcall; mydll_isLast: function( iConn: Longint ): bool; stdcall; mydll_next: function( iConn: Longint ): bool; stdcall; mydll_getFieldCount: function( iConn: Longint ): Longint; stdcall; mydll_getRecordCount: function( iConn: Longint ): Longint; stdcall; mydll_fetchValue: function( iConn: Longint; iIndex: Longint; iDatatype: Longint; pVar: PMyVar ): bool; stdcall; mydll_fetchField: function( iConn: Longint; iIndex: Longint; pField: PMyField ): bool; stdcall; implementation uses SysUtils; procedure assign_proc(var proc: FARPROC; name: PAnsiChar); begin proc := GetProcAddress( mydll_handle, name ); if proc = nil then begin raise Exception.Create('dll function ' + name + ' doesn''t exist'); end; end; function mydll_load(name: PChar): boolean; begin mydll_free; if name = nil then begin name := 'mydll.dll'; end; mydll_handle := LoadLibrary(name); if mydll_handle = 0 then begin Result := false; end else begin assign_proc(@mydll_createNewConnection, 'mydll_createNewConnection'); assign_proc(@mydll_setOptions, 'mydll_setOptions'); assign_proc(@mydll_connect, 'mydll_connect'); assign_proc(@mydll_disconnect, 'mydll_disconnect'); assign_proc(@mydll_closeConnection, 'mydll_closeConnection'); assign_proc(@mydll_selectDatabase, 'mydll_selectDatabase'); assign_proc(@mydll_openQuery, 'mydll_openQuery'); assign_proc(@mydll_close, 'mydll_close'); assign_proc(@mydll_isLast, 'mydll_isLast'); assign_proc(@mydll_next, 'mydll_next'); assign_proc(@mydll_getFieldCount, 'mydll_getFieldCount'); assign_proc(@mydll_getRecordCount, 'mydll_getRecordCount'); assign_proc(@mydll_fetchValue, 'mydll_fetchValue'); assign_proc(@mydll_fetchField, 'mydll_fetchField'); Result := true; end; end; procedure mydll_free; begin if mydll_handle <> 0 then begin FreeLibrary( mydll_handle ); end; mydll_handle := 0; end; INITIALIZATION begin mydll_load(nil); end; FINALIZATION begin mydll_free; end; end.