DLL vs. Applikation, 64 Bit vs. 32 Bit
-
Hallo allerseits!
Ich schreibe eine Tools, das spezielle DLLs verarbeiten soll. Das ganze unter VC++2003 und WinXP.
Ich würde gerne so kompatibel wie möglich bleiben, das heißt möglichst jede DLL und jedes Applikations-Release sollten miteinander arbeiten (binärkompatibel).
Ich frage mich jetzt Folgendes: Was passiert unter 64-Bit Systemen? Immerhin werden 64-Bit Systeme immer häufiger und ihnen gehört vermutlich die Zukunft. Was passiert also, wenn ich meine Applikation oder eine DLL (oder beides) für ein 64-Bit-Windows compiliere? Sind sie dann noch in der Lage zusammenzuarbeiten? Das web gibt dazu nicht viel her.
32+32 und 64+64 sind ja kein Problem. Was aber, wenn z.B. eine 64-Bit-Applikation auf eine 32-Bit-DLL trifft? Wie soll die Applikation dann einen C-String an eine DLL-Funktion übergeben, wenn der Zeiger der übergeben wird 64 Bit breit ist, aber ein 32 Bit breiter Zeiger erwartet wird (oder umgekehrt)?
Wie kann man sowas interoperabel machen? Ich habe in C++ schließlich keine Möglichkeit die Breite eines Zeigers zu erzwingen (schon garnicht wenn ich kompatibel zu verschiedenen Compilern und Plattformen bleiben möchte).
Ich könnte natürlich sowohl von DLLs als auch von Applikationen jeweils eine 32-Bit- und eine 64-Bit-Variante compilieren, aber die Binärkompatibilität wäre dann vermutlich dahin.
Ich mache mir auch Sorgen um andere Datentypen. Gibt es, außer Zeigern, noch andere Datentypen (int?) die sich zwischen einem 64-Bit- und einem 32-Bit-compilat unterscheiden ?
Interessieren würde mich auch, wie sowas unter Unix aussieht. Da müßte es doch eigentlich ähnliche Probleme mit Shared-Libraries geben?!
-
Jordy schrieb:
Ich würde gerne so kompatibel wie möglich bleiben, das heißt möglichst jede DLL und jedes Applikations-Release sollten miteinander arbeiten (binärkompatibel).
So lange sich die Schnittstelle nie ändert geht es.
Jordy schrieb:
Ich frage mich jetzt Folgendes: Was passiert unter 64-Bit Systemen?
Was soll da anders sein als bei 32-Bit Systemen?
Jordy schrieb:
Was passiert also, wenn ich meine Applikation oder eine DLL (oder beides) für ein 64-Bit-Windows compiliere? Sind sie dann noch in der Lage zusammenzuarbeiten?
Was soll denn passieren? Wenn Du keine Fehler gemacht hast, wird sie ganz normal laufen.
Jordy schrieb:
32+32 und 64+64 sind ja kein Problem. Was aber, wenn z.B. eine 64-Bit-Applikation auf eine 32-Bit-DLL trifft?
Das geht nicht. (Punkt)
Jordy schrieb:
Ich könnte natürlich sowohl von DLLs als auch von Applikationen jeweils eine 32-Bit- und eine 64-Bit-Variante compilieren,
Dir bleibt gar nichts anderes übrig.
Jordy schrieb:
aber die Binärkompatibilität wäre dann vermutlich dahin.
Wieso? Die 32-Bit Anwendung lädt die 32-Bit DLL und die 64-Bit eben die 64-Bit DLL.
Jordy schrieb:
Interessieren würde mich auch, wie sowas unter Unix aussieht. Da müßte es doch eigentlich ähnliche Probleme mit Shared-Libraries geben?!
Dazu bist Du hier im falschen Sub-Forum...
-
Jochen Kalmbach schrieb:
Jordy schrieb:
32+32 und 64+64 sind ja kein Problem. Was aber, wenn z.B. eine 64-Bit-Applikation auf eine 32-Bit-DLL trifft?
Das geht nicht. (Punkt)
Jordy schrieb:
Ich könnte natürlich sowohl von DLLs als auch von Applikationen jeweils eine 32-Bit- und eine 64-Bit-Variante compilieren,
Dir bleibt gar nichts anderes übrig.
Ok, klare Auskunft. Danke!
Gibt es irgendeine vernünftige Methode dafür zu sorgen, daß niemand versucht eine Applikation mit der falschen DLL zu kombinieren (ich werde die beiden jeweils getrennt weitergeben und die Benutzer dürfen auch eigene DLLs erzeugen und im Programm einladen)? Ich könnte natürlich irgendein "_64", "_32" im DLL-Namen erzwingen, aber das scheint mir recht unelegant. Gibt es eine von Windows vorgesehene Methode 32-Bit DLLs von 64-Bit DLLs zu unterschieden? Gibt es irgendwelche Fehlermeldungen wenn man versucht den flaschen Typ zu benutzen?
Jochen Kalmbach schrieb:
Jordy schrieb:
Interessieren würde mich auch, wie sowas unter Unix aussieht. Da müßte es doch eigentlich ähnliche Probleme mit Shared-Libraries geben?!
Dazu bist Du hier im falschen Sub-Forum...
Zugegeben... ich hatte gehofft daß sich das ganz kurz mit "genau wie bei Windows" beantworten läßt

Du hattest nicht zu den anderen Datentypen gesagt. Sind Zeiger die einzigen C++ Datentypen für die man Sorge tragen muß?
-
Jordy schrieb:
Gibt es irgendeine vernünftige Methode dafür zu sorgen, daß niemand versucht eine Applikation mit der falschen DLL zu kombinieren
Wenn beide im gleichen Verzeichnis liegen, fällt mir nichts anderes ein als diese umzubenennen...
Jordy schrieb:
Gibt es eine von Windows vorgesehene Methode 32-Bit DLLs von 64-Bit DLLs zu unterschieden?
AFAIK nein. Warum auch. Du kannst sie einfach versuchen zu laden. Wenn es geht passt sie zu Deiner EXE. Geht es nicht so war es die falsche (genauer Fehler-Code müsste ich erst auch nachschlagen).
Jordy schrieb:
Gibt es irgendwelche Fehlermeldungen wenn man versucht den flaschen Typ zu benutzen?
Siege oben...
Jordy schrieb:
Du hattest nicht zu den anderen Datentypen gesagt. Sind Zeiger die einzigen C++ Datentypen für die man Sorge tragen muß?
AFAIK Ja. int und long sind bei den MS-Compilern immer 32-Bit; egal ob mit x86 oder x64/IA64 übersetzt wird.
Es gibt aber einen ganzen Leitfeiden für das Umstellen von x86 nach x64/IA64. Angefangen von den unterschiedlichen Verzeichnissen und Registries über COM-Interop und Alignment und alles was man sonst noch wissen muss (oder auch nicht).http://msdn.microsoft.com/isv/technology/64bitwindows/x64faq/developmentfaq/default.aspx
-
Jochen Kalmbach schrieb:
Jordy schrieb:
Gibt es eine von Windows vorgesehene Methode 32-Bit DLLs von 64-Bit DLLs zu unterschieden?
AFAIK nein. Warum auch. Du kannst sie einfach versuchen zu laden. Wenn es geht passt sie zu Deiner EXE. Geht es nicht so war es die falsche (genauer Fehler-Code müsste ich erst auch nachschlagen).
Na, das ist ja schonmal garnicht schlecht. Mehr als eine Fehlermeldung und einen Fehlercode hatte ich von Windows ja garnicht erhofft. Hauptsache die Applikation schmiert nicht einfach ab, beim Versuch auf eine falsche, geladene DLL zuzugreifen.
Jochen Kalmbach schrieb:
Jordy schrieb:
Du hattest nicht zu den anderen Datentypen gesagt. Sind Zeiger die einzigen C++ Datentypen für die man Sorge tragen muß?
AFAIK Ja. int und long sind bei den MS-Compilern immer 32-Bit; egal ob mit x86 oder x64/IA64 übersetzt wird.
Es gibt aber einen ganzen Leitfeiden für das Umstellen von x86 nach x64/IA64. Angefangen von den unterschiedlichen Verzeichnissen und Registries über COM-Interop und Alignment und alles was man sonst noch wissen muss (oder auch nicht).http://msdn.microsoft.com/isv/technology/64bitwindows/x64faq/developmentfaq/default.aspx
Ok, danke erstmal.
-
Jordy schrieb:
Na, das ist ja schonmal garnicht schlecht. Mehr als eine Fehlermeldung und einen Fehlercode hatte ich von Windows ja garnicht erhofft. Hauptsache die Applikation schmiert nicht einfach ab, beim Versuch auf eine falsche, geladene DLL zuzugreifen.
Wenn Du die DLL implizit lädst, bringt Windows aber eine Fehlermeldung. Den Fehler kannst Du nur unterbinden, wenn Du die DLL explizit via "LoadLibrary" lädst.