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:
file:///C:/Daten/SystemAdmin/Eigene%...og_public.html
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.