Wechsel VS2008 zu VS2010: Danach Fehler C2733 (2. C-Bindung für überladene Funktion nicht zulässig)
-
Vielen Dank! Das sind schonmal super Sachen!
Die stdafx.h ist doch als erstes drin, oer nicht?Der Fehler "error C2733: Zweite C-Bindung für überladene Funktion 'OpenTransaction' nicht zulässig" ist jedoch leider immernoch vorhanden.
Außerdem wird auch immer kurz dieser Fehler angezeigt, verschwindet dann aber schnell wieder wenn ich an der Stelle bin (war auch vorher schon so):
IntelliSense: Mindestens eine Instanz der überladenen Funktion ""OpenTransaction"" weist eine "C"-Verknüpfung auf.
-
In ktmw32.h ist noch ein BOOL OpenTransaction vorhanden.
Was kann ich nun machen?Testweise habe ich den Bereich in ktmw32.h auskommentiert. Das will ich natürlich nicht so lassen.
Nun bekomme ich wieder die Linker-Fehler. Wie genau kann ich diese wegbekommen?
-
Hallo,
OpenTransaction ist doch eine API-Funktion, die du nicht selbst definiert hast? Dann ist auch keine eigene Deklaration notwendig.
MfG,
Probe-Nutzer
-
Sehe gerade, hast du doch selber definiert. Dann darf deine Funktion eben nicht OpenTransaction heissen, wenn du ktmw32.h unbedingt includieren musst.
MfG,
Probe-Nutzer
-
Das ist mir mittlerweile ja bewusst. Leider habe ich gerade keine andere Möglichkeit, als sie genau so zu nennen da die Funktion von anderen Programmen genau so genutzt werden soll.
Ob ich die ktmw32.h wirklich brauche, weiß ich nicht. Sie kommt ja von den Windows SKDs. Habe das Projekt so übernommen und muss selber erst schauen, was wo gebraucht wird. Schaue gerade, wo denn steht, dass ich diese Datei wirklich benötige bzw. wo sie inkludiert wird. Bisher konnte ich dazu nichts finden. Sie steht auf jeden Fall mit bei den 'externen Abhängigkeiten'.
-
Die Kette könnte lauten atlbase.h - atltransactionmanager.h - ktmw32.h. Wenn man vorher _KTMUSER_ #definiert, kommt der Fehler nicht mehr. Dafür kann man nicht mehr die Transaction-Funktionen verwenden. Und man muss hoffen, dass der Linker deine Funktion nicht mit der aus der Ktmw32.dll "verwechselt".
Ist leider so, MS scheint es nicht für nötig zu halten, ihren Funktionen und Defines einen Präfix zu geben. Auf der anderen Seite hätte der Verantwortliche für deine Bibliothek von Anfang an Präfixe für die Funktionsnamen schaffen müssen. Das ist das A und O von C-Schnittstellen.
-
Und warum arbeitest Du nicht mit einer DEF Datei?
http://msdn.microsoft.com/en-us/library/hyx1zcd3(VS.71).aspx
entryname[=internalname]Nenne das Ding MyOpenTransaction. In der Def Datei setzt Du dann in der Exports Section!
OpenTransaction=MyOpenTransaction
-
Das ändert aber nichts an der Namenskollision für Benutzer der Lib. Wenn sie ATL und flixLib zusammen in einer translation unit verwenden wollen, fliegen sie erst mal auf die Nase.
-
Superlexx schrieb:
Das ändert aber nichts an der Namenskollision für Benutzer der Lib. Wenn sie ATL und flixLib zusammen in einer translation unit verwenden wollen, fliegen sie erst mal auf die Nase.
Das ist korrekt. Aber Implizites laden wäre möglich.
Und wenn der DLL extern vorgeschrieben ist, kann ich mir nicht vorstellen, dass dieses Proble bei jeder Vorgängerversion von VS-200x nicht auch vorhanden war, sofern eben das Vista SDK (oder später) verwendet wird.Bleibt also immer noch die Option einfach nur bis Windows XP die defines für die Header zu setzen.
Siehe http://msdn.microsoft.com/en-us/library/aa366315(VS.85).aspx
-
Vielen Dank an alle. Ich habe es nun vorerst mit Hilfe der DEF Datei gelöst.
Stehe aber auch mit den Leuten in Kontakt, die die Namensvergabe gemacht haben. Somit lässt sich dort evtl. noch etwas ändern.Die Linker Fehler sind alle weg - somit läuft vorerst alles. Ich habe zwar noch ein anderes Problem, aber dafür würde ich, wenn ich es nicht gelöst bekomme, wohl einen neuen Thread eröffnen.
Vielen Dank an alle, Ihr habt mir sehr geholfen.
