![]() |
Datenbank: MySQL • Version: 5.5.3 • Zugriff über: libmysql.dll
MySQL-Header
Liste der Anhänge anzeigen (Anzahl: 3)
Wollte nur mal schnell meine kleinen MySQL-Header vorstellen.
im Anhang liegen auch noch eine libmysql.dll für 5.1 und 5.5 ... fehlt also nur noch ein MySQL-Server :roll: |
AW: MySQL-Header
Mir ist grade was aufgefallen:
Aus einem der anderem Header hatte ich mir das cdecl abgeguckt, aber an anderer Stelle steht plötzlich stdcall. Aus der Referenz (die Webseite) kann man leider diesbezüglich nichts erfahren (hab jedenfalls nichts gefunden). Also muß es nun stdcall oder cdecl sein? würde ja aus Erfahrung eher zu stdcall tendieren
Code:
[edit]
Direktive Parameterreihenfolge Bereinigung in Registern
cdecl Von rechts nach links Aufrufer Nein stdcall Von rechts nach links Routine Nein OK, das war'n LinuxCode ... also doch stdcall heißt also das cdecl im Download muß durch stdcall ersetzt werden [edit2] OK, Grund gefunden ... die bei Lazarus/FPC konnten sich nicht einigen und haben ihre Version der libmysql.dll teilweise mit cdecl und teilweise mit extdecl (extdecl entspricht unter Windows dem stdcall) gemischt erstellt :wall: |
AW: MySQL-Header
Was soll den der Unterschied zwischen deiner Lib und
![]() |
AW: MySQL-Header
Zitat:
(siehe ab Beitrag #327) ok, die 5.x upgrades waren nur versteckt im Changelog wer weiß, was da also schief läuft Mal sehn, was ein Vergleich beider Header erbringt. Meiner ist jetzt zumindestens auf dem aktuellsten Stand, welchen die mysql.com-Webseite offiziell bietet. Dieses hier soll praktisch ein Upgrade werden. Abgesehn davon sind das hier nur die reinen Header ohne alles Andere, was drüben noch mit verbaut wurde. (ohne Komponenten ist da übertrieben) [add] na wenn das so ist, dann kann ich mich ja doch hemmungslos auf neuere Compilerfeatures stürzen (wollte mich erst zurückhalten :roll: ) |
AW: MySQL-Header
Liste der Anhänge anzeigen (Anzahl: 1)
Es läuft endlich
anscheinend muß man urplötzlich mysql_server_init/mysql_library_init und mysql_thread_init aufrufen wobei angeglich das Server_Init doch nur für den Embedded-Server nötig sein sollte und irgendwie läßt dieses sich auch nicht parameterlos aufrufen, so wie man es überall sieht. :gruebel: Ansonsten soll mysql_server_init eigentlich (laut Dokumentation) intern von mysql_init aufgerufen werden, wenn es noch nicht wurde ... schon komisch das alles. Wenn ich es parameterlos versuche, so wie z.B. hier
Code:
Quelle:
(mysql_library_init(0, NULL, NULL))
![]() dann läuft dieses in eine Assert-Exception, ala Parameter erwartet im Anhang 3 Versionen, welche nun endlich lauffähig sind - die normalen Header, wie man sie auf mysql.com findet (statisch verlinkt) - dann alles in Klassen (Records) verpackt, statisch verlinkt und Vieles als direkte Verbindung von der Record-Methode zur DLL-Funktion - und dann nochmal alles komplett mit UTF8Strings/AnsiStrings dynamisch verlinkt und ebenfalls mit möglichst direkten Verknüpfungen. > bei Input-Parametern als Ansi/UTF8 wird direkt weitergeleitet (das ist intern ja kompatibel zu PAnsiChar) > bei Ausgabeparametern und bei Results als Ansi/UTF8 wurde nur noch eine Kopieroperation PChar->String eingefügt. die nötigen libmysql(d).dll's sind oben ja schonmal verlinkt und jetzt muß ich nur noch rausbekommen, was beim Embedded-Server schiefläuft ... Initialisieren läßt er sich aber schonmal :firejump: PS: sind hier C++-Profies? Aktuell hab ich nur den Embedded-Server als DLL, aber man kann ihn auch direkt in die EXE verlinken ... leider nur bei C++. Drum wäre die Frage: Könnte man das eigentlich auch irgendwie als OBJ kompilieren und dann doch direkt einbinden? (so wie z.B. die ZLib) Man benötigt ja eigentlich nur den "MySQL Community Server" und linke/kompiliere dann den Code statt gegen die mysql.h gegen die mysqld.h (oder irgendwie so). Und bevor nochmal einer meint, das würde gegen die MySQL-Lizenzpolitik verstoßen: die nutzen es auch > ![]() |
AW: MySQL-Header
Hallo Himitsu,
wenn man jetzt noch einen Mechanismus für die Memory-loaded-DLL einbaut, ist's doch schon fast perfekt. ;) Bei mysql.pas habe ich es so reinoperiert...
Delphi-Quellcode:
Dann habe ich noch die alten Aufrufe von GetProcAddress durch die neuen ersetzt. Das war's. 8-)
var
libmysql_handle: HMODULE = 0; libmysql_mem_handle: PBTMemoryModule = nil; libmysql_mem_buffer : Pointer; libmysql_in_memory : Boolean; . . . // Load library from Ressource into Memory. Internal Resname = libmysql procedure libmysql_mem_load(name : PChar); . . . procedure libmysql_mem_load(name : PChar); var ms : TMemoryStream; rs : TResourceStream; m_DllDataSize : Int64; begin if libmysql_mem_handle = nil then begin if 0 <> FindResource(hInstance, 'libmysql', RT_RCDATA) then begin rs := TResourceStream.Create(hInstance, 'libmysql', RT_RCDATA); ms := TMemoryStream.Create; try ms.LoadFromStream(rs); ms.Position := 0; m_DllDataSize := ms.Size; libmysql_mem_buffer := GetMemory(m_DllDataSize); ms.Read(libmysql_mem_buffer^, m_DllDataSize); finally ms.Free; rs.Free; end; if libmysql_mem_buffer <> nil then begin libmysql_mem_handle := BTMemoryLoadLibary(libmysql_mem_buffer, m_DllDataSize); if libmysql_mem_handle = nil then begin internal_libmysql_status := LIBMYSQL_MISSING; raise Exception.CreateFmt(ELibraryNotFound, [name]); end else begin libmysql_in_memory := True; internal_libmysql_ClientVersion := mysql_get_client_version; if internal_libmysql_ClientVersion >= mysql_not_compatible_version then begin internal_libmysql_status := LIBMYSQL_INCOMPATIBLE; raise Exception.CreateFmt(sLibMySql_Version_Incompatible, [mysql_get_client_info]); end else internal_libmysql_status := LIBMYSQL_READY; end; end; end; end; end; procedure libmysql_free; begin if libmysql_handle <> 0 then FreeLibrary(libmysql_handle); libmysql_handle := 0; if libmysql_mem_handle <> nil then begin BTMemoryFreeLibrary(libmysql_mem_handle); FreeMemory(libmysql_mem_buffer); end; libmysql_mem_handle := nil; libmysql_in_memory := False; internal_libmysql_status := LIBMYSQL_UNDEFINED; FinalizeLibmysql; end; procedure LoadProcAddress(var proc: FARPROC; name: PAnsiChar); var ModulPath: String; begin if proc = nil then begin if (libmysql_handle = 0) and (libmysql_mem_handle = nil) then raise Exception.Create(sLibMySql_Undefined); proc := GetProcAddress(name); if proc = nil then begin internal_libmysql_status := LIBMYSQL_INCOMPATIBLE; SetLength(ModulPath, MAX_PATH); SetLength(ModulPath, GetModuleFileName(libmysql_handle, Pointer(ModulPath), MAX_PATH)); raise Exception.CreateFmt(EProcNotFound, [name, ModulPath]) end; PushProc(@proc); end; end; function GetProcAddress(lpProcName: LPCSTR): FARPROC; overload; begin if libmysql_in_memory then result := BTMemoryGetProcAddress(libmysql_mem_handle, lpProcName) else result := GetProcAddress(libmysql_handle, lpProcName); end; Verwendet habe ich die Unit BTMemoryModule von Martin Offenwanger. ![]() Grüße, Uwe |
AW: MySQL-Header
Ich bin jetzt erstmal das ganze MySQL 5.4 durch und hab da nochmal nach Änderungen geschaut.
MySQL 6.0 kann man nicht schon jetzt einbauen, da sie die API zurückgezogen haben, da sich dort, in der Alpha- oder Betaphase (k.A. wo die genau waren), schon längere Zeit nichts mehr getan hat sie sich aktuell wieder mehr auf MySQL 5.5+ konzentrieren (seit MySQL 5.3 sind ja auch schon viele ehemals für die 6.0er gedachte Teile enthalten.) (MySQL 6.0 ist also erstmal tot) Nun werd ich nochmal die Units etwas aufräumen, die statische Variante wird vernichtet, da zuviele DLLs im Umlauf schon, wo schon grundlegende Funktionen fehlen oder fehlerhaft sind siehe da: ![]() in der Clientversion heißt es 0.0.0, in der ClientInfo steht zumindestens was von 5.0 (als String) und einige solcher DLLs besitzen nichtmal 'nen Expor für die ClientVersion (ich brauch also nur noch meine Ersatzfunktion/Umleitung etwas ausbauen) und danach wende ich mich mal an die DLL-Sache ran, mit 'ner kleinen Erweiterung, damit man die DLL auch leichter austauschen kann, um weniger Probleme mit dieser blöden GPL-Variante zu bekommen. |
AW: MySQL-Header
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Himitsu,
ich habe mit der 5.1.49 getestet. Die hat das auch so mit mysql_get_client_info ausgespuckt (also 50149). Die DLL habe ich mir von einer aktuellen Serverversion genommen. Ich hänge mal die mysql_wrapper.pas an, die ich derzeit verwende. Da habe ich die Funktionalität für die RES-DLL schon drin. Die enthaltene DLL (in libmysql.res) ist mit UPX gepackt, also nicht wundern, dass die so klein ist. :-D Grüße, Uwe |
AW: MySQL-Header
Einen ganzen Satz an libmysql's hatte ich hier schonmal irgendwo verlinkt (in 'nem anderem Thread).
hier nochmal der Link ![]() Dort ist auch eine generierte RTF, bzw eine XLS, mit den Exporten der ganzen DLLs. so, genug PHP für heute, deinen Anhang schau ich mir morgen an und jetzt schlaft schön :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz