![]() |
Laden einer alten 16 Bit dll unter WinXP?
Hallo,
ich habe eine alte dll aus win3.1 Zeiten. Ich besitze den Quelltext, weiß aber auch, das unter windows NT das Laden und Verwenden von 16 Bit dlls nicht mehr so einfach möglich ist. Um nun nicht alles neu schreiben zu müssen und auch aus Interesse am Problem an sich, will ich diese DLL nun mit eigenen Routinen in den Speicher laden. Meine konkrete Dll verwendet außerdem Bibliotheken, die ich momentan nur im 16 Bit Format verfügbar habe. Neben dem Ouellcode der Dll besitze ich noch den Binärcode der Dll. Meine Überlegung ist folgende: Die CPU (32Bit) kann 16 Bit Code noch immer ausführen. Win 3.1 Programme laufen auf Windows XP. Deshalb sollte es doch möglich sein, unter Beachtung des anderen Formats der Startadresse der Funktionen in der DLL (32 Bit -> Flat Modell -> 32 Bit Offset) (16 Bit -> Segment Modell -> 32 Bit Pointer -> Segment:Offset) Lineare Adresse := Sement * 16 + Offset Offset := Lineare Adresse - Segment * 16 Segment := (Lieare Adresse - Offset) div 16 So sollte es doch möglich sein, die in der DLL codierten Funktionen dennoch aufzurufen, ja wenn ich das exakte Format der guten alten 16 Bit DLL genau kennen würde. Dann nämlich könnte ich mir die Laderoutinen schreiben und eine Tabelle mit den von der DLL exportierten Funktionen bereit setellen. Von dieser Tabelle aus sollte der Aufruf doch dann klappen, oder? Ich bin nicht ausschließlich an der Nutzung der DLL Funktionen, sondern auch an der Lösung des hier geschilderten Problems interessiert. Die DLL enthält zudem auch sehr viele Funktionen. Eine Neukodierung würde also auch recht vielZeit in Anspruch nehmen, nicht nur wegen veränderter Direktiven (stdcall statt export, ...) Wo also finde ich das genaue Format der alten 16 Bit dll. Ich habe das hier: ![]() gefunden. Das bezieht sich aber auf heutige 32 Bit DLLs und die Beschreibung des Formates ist mir dort nicht dateiliiet genug. Die Seite verlinkt außerdem auf eine c++ Bibliothek zum Laden einer DLL in den Ram, nutzt aber auch Standard Windows Funktionen zum Laden. Wegen der Problematik, das eine 16 Bit DLL unter Windows NT nur mit Einschränkungen nutzbar ist, will ich die Laderoutinen komplett selber schreiben und die Exporttabelle auf der 32 Bit Seite als Array bereit stellen. Wenn das klappt, könnte man damit auch Dlls die von anderen Compilern übersetzt wurden und bisher in Delphi Probleme machen auf die gleiche Weise verfügbar machen, solange entweder der Quellcode der DLL verfügbar ist oder eine .def Datei mit den exportierten Funktionen. Wo finde ich exakte Informationen zum Dll Format? Sowohl für 16 Bit als auch für 32 Bit. 64 Bit dlls will ich vorerst ausklammern. Zuerst will ich das oben genannte Problem lösen. |
AW: Laden einer alten 16 Bit dll unter WinXP?
Hallo,
Ich kann mich irren, aber ich glaube es gibt da ein weiteres Problem und zwar, dass sich die Opcodes eines Befehls in 16- und 32-Bit Assembler z.T. unterscheiden. Ich bin mir nicht 100%ig sicher, aber ich habe da was im Kopf. Und von daher würde es nicht reichen die Adressen der Funktionen rauszufinden und dir eine Tabelle zu machen. Informationen wie DLLs aufgebaut sind: ![]() (DLLs sind zu 99% normale .exe Dateien) Andere Frage: Kannst du die DLL nicht einfach als 32-Bit DLL neu compilieren wenn du den Code hast? Müsste doch relativ einfach machbar sein oder? Zumindest kann ich mir nicht vorstellen, dass es aufwendiger ist als das was du vorhast. |
AW: Laden einer alten 16 Bit dll unter WinXP?
Danke für den Link. Werde ich mir anschauen.
Zitat:
Und hier in diesem Fall? Zitat:
Ich habe zwar den Quellcode der Dll aber nicht von allen in dieser dll verwendeten Bibliotheken. |
AW: Laden einer alten 16 Bit dll unter WinXP?
Was Neutral General da sagt über unterschiedlich interpretierte OPCodes bei 16-Bit und 32-Bit, kommt mir auch dunkel bekannt vor. Ich hatte vor einiger Zeit mal versucht, einen Disassembler zu schreiben, und hatte da glaube ich auch so ein Problem...
Aber du schreibst was von Windows XP. Da kann man 16-Bit-Programme ja noch direkt laufen lassen. Wäre es nicht einfacher, eine 16-bittige Wrapper-Applikation für die DLL zu schreiben und diese vom Hauptprogramm aus mit Pipes o.ä. anzusteuern? Spätestens wenn mal auf ein neues Windows geupdatet werden soll, wird es dann aber wieder haarig. Da müsste man dann wohl die DLL bzw. den Wrapper emulieren, vielleicht mit DOSBox als Vermittlungsstelle (ich weiß nicht ob das so schon geht, oder ob man diese Funktionalität erst noch in DOSBox einbauen müsste...). So baut man Schicht um Schicht um eine antike Bibliothek... ob man das wirklich will? Also alles in allem wird das nicht gerade einfach, denke ich. Wäre vermutlich effizienter, die Bibliotheken der DLL einfach zu ersetzen/neu zu schreiben. |
AW: Laden einer alten 16 Bit dll unter WinXP?
Wie wärs damit die DLL mit Wrapper-Programm in
![]() Dann würde das ganze auch auf aktuellen Betriebsystemen laufen. |
AW: Laden einer alten 16 Bit dll unter WinXP?
Aber ganz im Ernst, wenn du den Quelltext besitzt, warum dann mühevoll versuchen das Alte irgendwie brutal in die eigene Anwendung reinzuhäcken oder es über wilde Umwege und mithilfe von Zusatzprogrammen zum Laufen bekommen,
Wenn es wesentlich leichter wäre den Quellcode an 32 Bit anzupassen und vielleicht auch gleich auch mit für 64 Bit und die DLL dann ganz normal ins Programm einzubinden? OK, eine 16-Bit-Host-Anwendung als Out-Of-Process-Server zu verwenden, wäre der andere "einfache"/gängige Weg, aber bei aktuellen 64-Bit-Windowsen wurde nun endlich das 16-Bit-Subsystem komplett rausgeworfen, womit da 16-Bit-Anwendung garnicht mehr laufen. (Emulatoren und VMs mit Emulierung ausgeschlossen) |
AW: Laden einer alten 16 Bit dll unter WinXP?
Zitat:
Deshalb wäre ein 16-Bit Wrapper am sinnvollsten, aber 64-Bit Betriebssysteme wären dann tabu. |
AW: Laden einer alten 16 Bit dll unter WinXP?
Zitat:
![]() ![]() Zitat:
Gruß, Sven |
AW: Laden einer alten 16 Bit dll unter WinXP?
Zu den gennanten Problemen kommt hinzu, so eine DLL läuft ja nicht im leeren Raum.
Da werden 16-Bit API-Funktionen aufgerufen, mit 16-Bit Parametern und Rückgabewerten, aus weitere 16-Bit DLLs des Betriebssystems z.B.. Neben der CPU müsste man die 16-Bit Betriebssystem-Umgebung emulieren. |
AW: Laden einer alten 16 Bit dll unter WinXP?
Danke Euch allen. Werde mich jetzt erst mal mit der Problematik beschäftigen. Ich tendiere zur Nutzung des 486 Emulators, wie ihn JamesTKirk vorgeschlagen hat. Oder VirtualBox, QEmu,...
Allerdings interessirt mich auch der Aufbau des 486 Emulators. Und da kann ich ja den Quellcode studieren. Dann sehe ich weiter. 8-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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