Frage

Ich habe eine DLL, die exportiert

extern "C" __declspec(dllexport) int __stdcall Foo( void );

Ein Dump der DLL wird angezeigt

******************************************************************************
Section:             Exports
File Offset:         00001400 (5120)
  Flags:             00000000
  Time Stamp:        00000000
  Major Version:     0000
  Minor Version:     0000

Exports from simple.dll
  3 exported name(s), 3 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00002104    3 0000 std::nothrow
    00001258    2 0001 Foo
    000020F8    1 0002 ___CPPdebugHook

******************************************************************************

Ich habe mit der folgenden Def-Datei begonnen:

LIBRARY simple.dll 
EXPORTS
  Foo

Dadurch wurde eine lib-Datei mit den folgenden Exporten erstellt:

Exports
       ordinal    name
                  _Foo

Wenn ich mit dieser Bibliothek verlinke, beschwert sich der MSVC-Linker, dass er _Foo@0 nicht finden kann.Um dieses Problem zu beheben, habe ich der Def-Datei einen Alias ​​hinzugefügt.

LIBRARY simple.dll 
EXPORTS
  Foo
  Foo@0=Foo

Was zu einer lib-Datei mit Exporten führt

Exports
       ordinal    name
                  _Foo
                  _Foo@0

Jetzt lässt sich das Projekt problemlos verknüpfen.Wenn ich jedoch versuche, es auszuführen, erhalte ich die Meldung

„Der Prozedureinstiegspunkt Foo@0 konnte in der Dynamic Link Library simple.dll nicht gefunden werden.“

Obwohl ich lib.exe mitgeteilt habe, dass Foo@0 ein Alias ​​für Foo ist, scheint es also immer noch eine Importbibliothek zu erstellen, die versucht, „Foo@0“ namentlich zu laden.

Gibt es eine Möglichkeit, die Importbibliothek dazu zu bringen, „Foo“ zu laden, wenn ich nach „Foo@0“ gefragt habe?

Danke,

David

War es hilfreich?

Lösung

Sie hatten die richtige Idee, einen Alias ​​zu verwenden ...

„Es scheint, dass LIB keine Alias-Formen akzeptiert (der Teil nach dem Gleichheitszeichen wird einfach ignoriert);2) Es übernimmt alle Funktionen in der DEF-Datei __cdecl.Der zweite Punkt liegt in der Tatsache, dass die von ihr erzeugte Importbibliothek jedes Symbol in der DLL einem internen Namen mit einem vorangestellten Unterstrich zuordnet, d. h. der Linker, der die Importbibliothek verwendet, wird versuchen, ein undefiniertes Symbol _Function in das Symbol Function in aufzulösen die DLL.Die __stdcall-Aufrufkonvention muss nicht besonders beachtet werden.Mit einigen Techniken könnten wir LIB verwenden, um Importbibliotheken für __stdcall-Funktionen zu erstellen, aber der Aufrufer könnte sie nur über die Ordinalzahl und nicht über den Namen aufrufen.Die Details bleiben als Übung übrig :-)." (http://wyw.dcweb.cn/stdcall.htm)

Verwenden Sie anstelle eines Alias ​​eine Ordnungszahl:(anhand Ihres Beispiels):

LIBRARY simple.dll 
EXPORTS
     Foo
     Foo@0    @2 ;(from your dumpbin)

Hat bei mir funktioniert :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top