DLL und Name Dekoration
-
Hi,
ich hab eine Dll geschrieben, die sich prima statisch binden läßt. Gerade habe ich aber festgestellt, das dynamische Binden nicht klappt, weil die exportierten Namen dekoriert werden. Beispiel:
#define WIN32_LEAN_AND_MEAN #include <windows.h> bool g_done; int g_count; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } extern "C" __declspec(dllexport) int __stdcall anyStart(const char* name) { g_done = false; g_count = 0; return g_count; } int extern "C" __declspec(dllexport) __stdcall anyDo(int value) { if (g_done) g_count += value; return g_count; } extern "C" __declspec(dllexport) void __stdcall anyStop(void) { g_done = true; }Ergebnis aus dumpbin:
ordinal hint RVA name
1 0 00001070 _anyDo@4 = _anyDo@4
2 1 00001060 _anyStart@4 = _anyStart@4
3 2 00001090 _anyStop@0 = _anyStop@0Wie bekomme ich diese häßliche Dekoration weg?
Irgendwie muss das gehen, denn die Win32-Dlls haben das nicht.Danke,
don_basto.
-
Hab gerade mal den Weg über die DEF-Datei ausprobiert:
EXPORTS
anyStart=_anyStart@4
anyDo=_anyDo@4
anyStop=_anyStop@0Dann ergibt kommt dabei raus:
ordinal hint RVA name
1 0 00001020 _anyDo@4 = _anyDo@4
2 1 00001010 _anyStart@4 = _anyStart@4
3 2 00001040 _anyStop@0 = _anyStop@0
4 3 00001020 anyDo = _anyDo@4
5 4 00001010 anyStart = _anyStart@4
6 5 00001040 anyStop = _anyStop@0Das ist erstmal eine Lösung, aber nicht schön, da man bei Schnittstellenänderungen nicht vergessen darf, dass zu aktualisieren.

Aber warum stehen noch die dekorierten Namen, die auf sich selbst zeigen?
Falls jemand einen besseren Weg kennt, bitte posten.Grüße,
don_basto.
-
So:
EXPORTS anyStart anyDo anyStopmuss die DEF-Datei aussehen.
-
Danke, so siehts gleich viel besser aus.

-
Noch zwei Frage zu den Def-Dateien. In der MSDN wird als Vorteil der DEFs die Zuordnung der Exportordinalzahlen hervorgehoben. Ich habe als Anwender von Dlls noch nie etwas mit diesen Zahlen zu tun gehabt.
(1) Was soll der Vorteil von der Kontrolle der Exportordinalzahlen sein, bzw. inwiefern hat das für den Anwender einer Dll eine Bedeutung?Ausserdem hab ich in der MSDN eine DATA-Attribut für die EXPORTS-Anweisung gefunden.
(2)Wie importiert man als Anwender solche Daten?