Problem mit GetProcAddress



  • nun gut, nehmen wir an wir kriegen wirklich am ende __declspec(dllexport).

    Dann ist das immernoch schlicht das, was vorher schon in meinem Code stand...
    Präprozessordirektiven haben die Eigenschaft dass sie vom Compiler ausgeführt werden und im eigentlichen programm nicht mehr auftreten, folglich ist der unterschied ob ich sage

    #define foo __declspec(dllexport)
    foo int bar(int x, int y);
    

    oder gleich

    __declspec(dllexport) int bar(int x, int y);
    

    gleich 0!

    Andere Unterschiede die ich gesehen habe:

    1.da steht ein DLLEntyPoint. Wie gesagt, ich hab meinen unverändert gelassen, er ist aber noch im code. Er macht genau so viel wie deiner, nämlich gar nichts.

    2. Du definierst in deinem Programm eine Klasse die du nie verwendest. Schön für dich. Brauch ich nicht.

    3. der Sinn dass du wenn ich das richtig seh die Header deiner DLL auch in deinen Programmcode includest ergibt sich mir nicht.

    das waren alle gravierenden Unterschiede die ich bis jetzt gesehen hab.
    Wäre sehr dankbar, wenn du mir sagen könntest was ich noch übersehen habe.

    Sorry, dass ich da nun so lang rumtu, aber
    1. will ich wissen wo mein fehler liegt
    2. seh ich wirklich keinen unterschied zwischen den codes, der das problem lösen könnte
    3. hasse ich es, fremden code einfach zu importieren, ohne zu wissen, was da nun eigentlich (anderes) steht.



  • Und solangsam gehst du mir auf den ... 😉

    Naja.. also... die Klasse hab ich dir nur als Sample angelegt, damit du sehen kannst wie man das Makro in einer Klasse benutzt...

    Dann... ist eine ungravierende änderung wie du schon sagtest, das alles über eine "Hauptheaderdatei" läuft... ist nicht nötig, aber praktisch.

    Dann... hab ich dir Fehlerüberprüfung reingebaut wie es sein muss 😉

    Guck dir folgende Zeile an:

    typedef int(WINAPI*fCalculate)(int, int);
    

    Hö öhm.. nen reinterpret_cast ist da schon angebracht...

    Soo... wenn du das ganze so buildest wie ichs dir geschrieben hab... funktioniert es zu 100%. An sonnsten sind deine Proj.-Einstellungen nicht korrekt.



  • Pudel des Todes schrieb:

    und wo ist der große Unterschied zu meinem? Dem einzigen was ich nicht folgen kann, ist der teil ...

    der ist eigentlich für dich auch nicht wichtig da du dll dynamisch laden möchtest und nicht statisch binden willst

    Pudel des Todes schrieb:

    Und ich weiß ehrlich gesagt nicht, wo das MEINEDLL_EXPORTS definiert werden soll oder nicht, kann also auch nicht sagen, was das eigentlich werden soll.
    Aber wenn ich das genau so übernehmen würd wie's dasteht, würd doch am ende in der DLL stehen
    __declspec(dllimport) int calculate(int, int);

    ist wiederrum nicht wichtig für deinen fall

    Pudel des Todes schrieb:

    Und ob ich etz reinterpret_cast<foo> oder nur (foo) hernehm is ja auch egal, weil nur NULL aus GetProcAdress rauskommt.

    du hast recht der c++ cast ist auch nicht besser (nur typensicherer aber das ist ein anderes thema)

    lösungsvorschlag:
    mach ne ganze normale dll in der nichts anderes drin steht wie

    __declspec(dllexport) int calculate(int x1, int x2)
    { return (x1 + x2); }
    

    mehr brauchst du im moment nicht.
    dann nimmst du den http://www.dependencywalker.com/ und schaust dir deine dll an, dort steht auch der name der exportiert wurde. namen importieren, fertig

    ps: evtl. solltest du dir auch noch ein paar gedanken zu den aufrufkonventionen machen (declspec, stdcall usw)

    @(d)evil
    [korrektur]



  • Hmm? Er kann die Func net richtig mit GetProcAddress loaden, richtig?

    [quote Pudel des Todes]
    Und ich weiß ehrlich gesagt nicht, wo das MEINEDLL_EXPORTS definiert werden soll oder nicht, kann also auch nicht sagen, was das eigentlich werden soll.
    Aber wenn ich das genau so übernehmen würd wie's dasteht, würd doch am ende in der DLL stehen
    __declspec(dllimport) int calculate(int, int);

    ist wiederrum nicht wichtig für deinen fall
    [/quote]Ich will dir ja nicht dumm kommen.... ABER: Guck mal was ich geschrieben hab. Danke.

    Der einzigst sinnvolle Teil deiner Aussage ist mit DWalker einmal die Dll anzugucken...

    PS: Sry. ich bin müde und garantiere nicht für meine Aussagen.



  • Vielen Dank miller_m, funktioniert jetzt einwandfrei!

    Schönen Abend noch,

    mfg Pudel



  • @Pudel des Todes:
    Naja... das zeigt mir so ziemlich das du dir meinen Code kein einziges Mal wirklich durchgesehen hast... insgesammt steht dort nicht soo viel anderes... k noch nen paar Fehlerabfragen usw mit drin... aber an sonnsten... naja... egal.. ich geh pennen 😃



  • ich wollte eben keine diskussion mit dir anfangen aber sowas fand ich sehr provokativ

    (D)Evil schrieb:

    Mach es einfach so wie ich es gesagt hab... und es funktioniert.

    das es imho keinerlei erklärung zu deinem obrigen code gab.

    (D)Evil schrieb:

    Der einzigst sinnvolle Teil deiner Aussage ist mit DWalker einmal die Dll anzugucken...

    fand ich nicht so, ich habe es nur auf das wesentliche beschränkt. (wenn wir von einer dynamisch geladenen dll ausgehen)

    ist auch jetzt egal ich bin auch müde und habe vielleicht überreagiert deswegen kam gleich von mir die korrektur aber anscheinend zu spät. egal. 😃



  • Um es zusammen zu fassen, der einzig wirklich wichtige Unterschied ist IMHO folgender:

    Pudel des Todes schrieb:

    int __declspec(dllexport)calculate(int x, int y)

    miller_m/(D)Evil schrieb:

    __declspec(dllexport) int calculate(int x1, int x2)

    Alles weitere ist Geschmackssache.

    Mfg, North.



  • North schrieb:

    Alles weitere ist Geschmackssache.

    imho eben nicht, den eine dll statisch oder dynamisch zu linken ist ein unterschied und beim dynamischen laden brauche ich keine präprozessordirektiven, header, etc.
    natürlich will ich wenn ich eine dll schreibe alles abdecken und werde dieses auch dann entsprechend mit einfliessen lassen somit wäre es dann wieder geschmackssache das hat aber wieder nichts mit dem thread zu tun.



  • Da hast du recht, ich wollte lediglich hervorheben, wo im Endeffekt der Fehler in PdT's Code lag. Wenn man eine Library statisch linken will, sollte man sie IMHO ohnehin direkt als .lib erstellen und entsprechend einbinden.

    MfG, North.



  • Hey,

    ich wollt noch zum Abschluss schnell sagen, was nun wirklich der Fehler war.

    Ich habe das Programm Dependency Walker nicht gekannt, und somit immer den falschen Namen bei GetProcAddress verwendet.

    Habe zu dem Zeitpunkt aber immernoch

    int __declspec(dllexport)calculate(int x, int y)
    

    verwendet, hat alles funktioniert, dies scheint also nichts auszumachen.
    Habs nun aber nachträglich zur Sicherheit trotzdem korregiert.

    mfg,
    Pudel


Anmelden zum Antworten