tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
20
ZUGRIFFE
791
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    T0day Tutorials.de Gastzugang
    Moin,
    Ich stehe momentan so ziehmlich am Anfang was DLLs betrifft und habe daher eine kleine Frage. In meiner test.exe habe ich eine Funktion zb
    Code :
    1
    
    void machZeug(int ganzviel) { /* hier passiert was :) */ }
    Wie rufe ich machZeug jetzt aus einer DLL heraus auf?
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Das geht nicht direkt. Man kann Funktionen einer DLL aus Anwendungen aufrufen, aber nicht umgekehrt.

    Du könntest natürlich einen Zeiger auf diese Funktion an eine DLL Funktion übergeben und dann innerhalb der DLL Funktion die per Zeiger übergebene Funktion (zurück)aufrufen. (siehe Callback-Funktionen).

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    Zitat Zitat von T0day Beitrag anzeigen
    Wie rufe ich machZeug jetzt aus einer DLL heraus auf?
    verstehe ich Dich richtig, Du willst aus einer DLL heraus Dein Testprogramm aufrufen
    Das wird kaum gehen, denn eine (beliebige) DLL wird Dein Testprogramm kaum kennen - oder ist es eine selbstgeschriebene DLL

    Normalerweise sind Libraries Sammlungen von Funktionen, die Du per include Deinem Testprogramm zur Verfügung stellen kannst - und somit nicht neu programmieren musst !!

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  4. #4
    T0day Tutorials.de Gastzugang
    Nun ich habe ein Programm dessen Funktionen mir bekannt sind. Den Sourcecode des Programms habe ich allerdings nicht und kann daher keinen Zeiger übergeben.
    Ich will jetzt eine mir bekannte Funktion innerhalb der Anwendung ausführen zB FuncA aus der DLL heraus aufrufen.
     

  5. #5
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    Zitat Zitat von T0day Beitrag anzeigen
    Nun ich habe ein Programm dessen Funktionen mir bekannt sind.
    Den Sourcecode des Programms habe ich allerdings nicht und kann daher keinen Zeiger übergeben.
    Ich will jetzt eine mir bekannte Funktion innerhalb der Anwendung ausführen zB FuncA aus der DLL heraus aufrufen.
    offengestanden verstehe ich noch immer nicht so ganz, was Du nun genau versucht ....
    Willst Du innerhalb Deiner DLL sowas wie "TestProg::FuncA()" aufrufen oder doch eher im TestProg die "FuncA()" der DLL

    Zeig' mal ein bisschen mehr Code (bitte mit den Code-Tags) - vlt. blickt man durch ....

    Im übrigen gibt das, was deepthroat und ich zuvor schon schrieben ...

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  6. #6
    T0day Tutorials.de Gastzugang
    Ich will aus der DLL die FuncA() der Anwendung aufrufen.
    anwendung.exe
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    int FuncA(int zahl) {
    printf(%d,zahl);
    if(zahl > 100) exit(1);
    return zahl;
    }
    int main() {
    int zahl  = 0;
    while(1) {
    Sleep(1000);
    FuncA(zahl++);
    }
    Jetzt will ich zB (von der DLL aus) FuncA(101); aufrufen und damit das Programm beenden
    etwa
    Code :
    1
    
    Rufe_Anwendungsfunktionauf("FuncA",101);
    Allerdings funktioniert das so ja nicht :/

    Du könntest natürlich einen Zeiger auf diese Funktion an eine DLL Funktion übergeben und dann innerhalb der DLL Funktion die per Zeiger übergebene Funktion (zurück)aufrufen. (siehe Callback-Funktionen).
    Wie gesagt habe ich nur den Namen der Funktionen die ich gerne Aufrufen würde und nicht den Sourcecode. Daher kann ich ja keinen Zeiger einbauen der auf die Funktion zeigt.
     

  7. #7
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    mal theoretisch gesprochen: um in Deiner DLL eine Funktion einer anderen Source aufrufen zu können, würdest Du quasi ein API benötigten, sprich: Du müsstest von "anwendung.exe" eine Header-Datei mit den jeweiligen Signaturen der Funktionen haben, die Du in der DLL includen könntest ....

    Aber wie wir hier schon geschrieben haben, kann so etwas nicht funktionieren .... und das für sind LIBs auch nicht gedacht

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von T0day Beitrag anzeigen
    Ich will aus der DLL die FuncA() der Anwendung aufrufen.
    anwendung.exe
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    int FuncA(int zahl) {
    printf(%d,zahl);
    if(zahl > 100) exit(1);
    return zahl;
    }
    int main() {
    int zahl  = 0;
    while(1) {
    Sleep(1000);
    FuncA(zahl++);
    }
    Jetzt will ich zB (von der DLL aus) FuncA(101); aufrufen und damit das Programm beenden
    etwa
    Code :
    1
    
    Rufe_Anwendungsfunktionauf("FuncA",101);
    Allerdings funktioniert das so ja nicht :/


    Wie gesagt habe ich nur den Namen der Funktionen die ich gerne Aufrufen würde und nicht den Sourcecode. Daher kann ich ja keinen Zeiger einbauen der auf die Funktion zeigt.
    Du möchtest also in einen laufenden Prozess eindringen und dann dort eine bestimmte Funktion aufrufen, was zur Beendigung des Programmes führt?

    Oder bekommst du das Programm freiwillig dazu deine DLL (über einen Plugin-Mechanismus) zu laden?

    Deine Vorgehensweise scheint mir doch irgendwie suspekt zu sein...

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    T0day Tutorials.de Gastzugang
    Du möchtest also in einen laufenden Prozess eindringen und dann dort eine bestimmte Funktion aufrufen, was zur Beendigung des Programmes führt?
    Nicht zur beendigung das war nur ein Beispiel... Die Funktionen sind unterschiedlichster Art...
    Oder bekommst du das Programm freiwillig dazu deine DLL (über einen Plugin-Mechanismus) zu laden?
    Jop via Plugin Mechanismus.
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von T0day Beitrag anzeigen
    Jop via Plugin Mechanismus.
    Also gibt es eine Plugin-API. Die Funktionen die du aufrufen möchtest sind aber nicht Teil dieser API, oder wie?

    Um welches Programm handelt es sich denn? Link?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    T0day Tutorials.de Gastzugang
    Leider nicht sonst würde das ja alles kein Problem darstellen. Die Plugin API beinhaltet nur Funktionen die für das Scripten geeignet sind. Ich kann über diese meine Funktionen zwar auch umleiten aber das würde natürlich die Performance drücken.
     

  12. #12
    Slypy Slypy ist offline Rookie
    Registriert seit
    Jun 2010
    Ort
    Duisburg
    Beiträge
    5
    Nun ich kann mittlerweile auch nicht mehr ganz folgen, von daher:

    Also du hast irgendein Programm (.exe), zu welchem du ein Plugin/Addon in Form einer DLL schreiben möchtest.
    Dazu ruft dieses Programm exportierte Funktionen deiner DLL auf, und ebenso stellt es eigene Funktionen für die DLL zur Verfügung, und von genau diesen Funktionen möchtest du jetzt wissen wie du sie aufrufen kannst ?

    Wenn ich das so richtig begriffen habe, dann:

    Muss das Programm (die .exe) ebenfalls jene Funktionen exportieren (ansonsten kommst du nicht ohne Assemblerkenntnisse weiter).
    Was dir nun 2 Möglichkeiten verschafft:

    1. Du greifst von deiner DLL aus genauso darauf zu wie umgekehrt:

    Code cpp:
    1
    2
    3
    4
    5
    6
    
    typedef void (*functypedef)(int);
     
    HMODULE hExe = GetModuleHandle(0);
    functypedef hFunc = (functypedef)GetProcAddress(hExe, "name_der_funktion");
     
    hFunc(123);

    2. Dir wurde eine .lib Datei mit in die Wiege gelegt (oder .def, dann kannst du mittels VS Command Prompt "lib /DEF:datei.def" eine .lib erstellen).
    Diese musst du dann deinem Projekt hinzufügen, damit dagegen gelinkt wird, entweder in den Projekteinstellungen, oder mittels:

    #pragma comment(lib, "datei.lib")

    Mit den entsprechenden Prototypen der Funktion(en) kannst du sie dann ganz normal wie gewohnt aufrufen.

    Sollte dies auch kein Stückchen weiterhelfen, schlage ich vor du zeigst uns genau, was und womit du Probleme hast (ich rede von Code / Programmnamen, und nicht von weiteren vagen Problembeschreibungen), damit wir dir helfen können
    Geändert von Slypy (22.06.10 um 01:57 Uhr)
     

  13. #13
    T0day Tutorials.de Gastzugang
    Muss das Programm (die .exe) ebenfalls jene Funktionen exportieren (ansonsten kommst du nicht ohne Assemblerkenntnisse weiter).
    Tut es aber nicht wie ich schon gesagt habe.

    Also gibt es eine Plugin-API. Die Funktionen die du aufrufen möchtest sind aber nicht Teil dieser API, oder wie?
    Leider nicht sonst würde das ja alles kein Problem darstellen.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    int iVar = 1;
    float teile(int a, int b) {
        return a / b;
    }
     
    int multipliziere(int a, int b) {
        return a * b;
    }
    void setzeVar(int a) {
        iVar = a;
    }
    int main(void) {
        while(1) {
            iVar = multipliziere(teile(223,3),iVar);
            Sleep(1000);
        }
    }
    Jetzt möchte ich setzeVar(); aus meiner DLL heraus aufrufen.
     

  14. #14
    Slypy Slypy ist offline Rookie
    Registriert seit
    Jun 2010
    Ort
    Duisburg
    Beiträge
    5
    Ja dann wie gesagt, mir ist mit deinen Informationen kein anderer Weg bekannt als direkt über (inline)Assembler. Und natürlich muss du's erstmal schaffen, die Funktionen zu finden
    Da du die ganze Zeit keine Programmnamen oder überhaupt du nicht registriert bist, vermute ich nicht gerade die besten Absichten deinerseits, und werde dich daher nicht mit Links versorgen ...

    Deine ganze Fragestellung kommt mir wie ein Euphemismus für Cracken vor Nach dem Motto "Hm wie komm ich möglicherweise, mit einer scheinbar harmlosen Problemstellung, an Informationen heran, die mir rote Hörner wachsen lassen"

    MfG
     

  15. #15
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Zitat Zitat von Slypy Beitrag anzeigen
    Ja dann wie gesagt, mir ist mit deinen Informationen kein anderer Weg bekannt als direkt über (inline)Assembler.
    Wenn man Funktionszeiger verwendet, kommt man auch ohne Assembler aus. Man muss nur die Signatur den Funktion (inkl. Aufrufkonvention) kennen.

    Zitat Zitat von Slypy Beitrag anzeigen
    Und natürlich muss du's erstmal schaffen, die Funktionen zu finden
    Das allerdings auf jeden Fall. Solange das Programm von sich aus die Adresse dieser Funktion nicht zur Verfügung stellt, brauchen wir überhaupt nicht weiter zu diskutieren.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

Ähnliche Themen

  1. In PHP eine JS-Funktion aufrufen
    Von chuvak im Forum PHP
    Antworten: 6
    Letzter Beitrag: 26.04.08, 17:10
  2. mit enter eine funktion aufrufen
    Von CryingBaby im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 17.07.06, 15:25
  3. In onEnterFrame eine Funktion aufrufen
    Von Orphelina im Forum Flash Plattform
    Antworten: 16
    Letzter Beitrag: 21.11.05, 14:43
  4. Nach confirm() eine PHP-Funktion aufrufen
    Von Eistee im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 13.07.05, 02:12
  5. [MX] Eine Funktion von aussen aufrufen
    Von alma im Forum Flash Plattform
    Antworten: 13
    Letzter Beitrag: 24.08.03, 16:22