dll !?!



  • Moin Leuts...

    Hab mal ne Frage, und zwar will ich eine dll-Datei in einem Win32 Konsolen Programm einbauen... Ich habe überhaupt keine Ahnung, wie das gehen sollte. Ich habe einige Versuche gemacht, aber keiner ging. So wie ich es bis jetzt mal gemacht habe:

    Datei 5.cpp:

    // 5.cpp
    #include <stdio.h>
    #include <stdlib.h>
    #include <dos.h>
    #include <string.h>
    #include <conio.h>
    #include <windows.h>
    #include "test.h"
    
    void main()
    {
    LoadLibrary("test.dll");
    test();
    }
    

    Datei test.h:

    // test.h
    extern void test();
    

    Datei test.cpp: // Die Dll-Datei wird später dann test.dll

    // test.cpp
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dos.h>
    #include <conio.h>
    #include "test.h"
    
    void test()
    	{
    	printf ("Hallo");
       getch();
    	}
    

    Da funktioniert jetzt gar nix so wie es sollte. Immer kommt die Fehlermeldung, dass er test() nicht kennt. Was mache ich falsch...

    Hoffe ihr könnt mir helfen...

    Gruß
    Fräger



  • sie ist nicht von außen ansprechbar...

    hier ein wilder versuch.. mit ein wenig winapi gemisch.. aber vielleicht hilfts.. die funktioniert.

    ate.dll

    #include <stdio.h>
    __declspec(dllexport) void rechnen(int,int);

    // macht Funktionen von außen ansprechbar

    __declspec(dllexport) int buchstabe(char);

    void rechnen(int x,int y)
    {

    int z=x+y;
    printf( "Gerechnet: %i",z);
    }

    int buchstabe(char a)
    {
    printf( "buchstabe in zahl: %i",a );

    return 4000;
    }

    und ansprechen über:

    typedef void (*Punkt1)(int,int);
    typedef int (*Punkt2)(char);

    void rechnen (int, int ){};
    int main()
    {
    int Rueckgabe=0;

    int x=8;
    int y=4;
    char a='u';

    HINSTANCE Nummer = LoadLibrary("ate");

    if (!Nummer)
    printf("\nDLL nicht gefunden.\n"
    "Ueberpruefen Sie die Lage der Beispiel-DLL\n");
    else printf ("Jep: %i", Nummer);

    Punkt1 point1;
    Punkt2 point2;

    point1 = (Punkt1)GetProcAddress(Nummer,"rechnen");
    point2 = (Punkt2)GetProcAddress(Nummer,"buchstabe");

    rechnen(x,y);

    point1(x,y);

    point2(a);

    if(point2)
    /* hier wird jetzt von der DLL "funktion2" einfach importiert*/
    {
    Rueckgabe = point2(a);
    printf("Aus der *.DLL Uebergeben unser aktuelles Jahr: %d\n",Rueckgabe);
    }

    FreeLibrary(Nummer);
    return 0;
    }

    na ja, wildes beispiel.. aber mir hat es vor längerem mal die augen geöffnet.. ist aber total zusammengestückelt, geht auch einfacher ...



  • Der Code lässt sich bei mir problems los compilieren nur ausführen kann ich die Datei dann hinterher nicht. Da kommt dann bei mir:

    Diese Datei wird auf Grund eines ungültigen Vorgangs geschlossen.

    Ich muss auch die zwei zeilen in dem dll-Code entfernen:

    __declspec(dllexport) void rechnen(int,int); 
    __declspec(dllexport) int buchstabe(char);
    

    Wenn ich die stehen lasse, bekomme ich 4 Errors im dll-Code:

    Error ate.cpp 3: 'rechnen' is not a paramter
    Error ate.cpp 7: Declaration was expected
    Error ate.cpp 10: 'rechnen' is not a parameter
    Error ate.cpp 10: , expected
    

    Vielleicht liegt es daran, dass das Programm nicht läuft, weil ich die zwei Zeilen entferne... ???



  • die dll musst du als library compilieren.. nicht als ausführbaren code.

    im visual gibt es dafür extra eine möglichkeit zur auswahl.

    dann lade die dll ein.

    abstürzen tut das programm so wie es unten steht nicht.



  • Ich benutze Borland C++ 4.5 und habe erlich gesagt gerade überhaupt keine Ahnung wie du das meinst...



  • @Fräger
    Du musst bei den Projekteinstellungen einstellen, dass er es als DLL-Datei compilieren soll. Wenn das geklappt hat, dann hast du eine .obj oder vielleicht sogar eine .lib Datei. Diese Datei bindest du in ein neues Projekt ein, dass eine normale EXE-Datei macht. Dort musst du dann nur noch deine Headerdatei mit include einbinden und die Funktionen der DLL aufrufen.

    In der DLL selbst musst du natürlich drauf achten, dass sie auch extern aufgerufen werden können. Dazu würde ich mir mal die Hilfe anschauen von Borland!



  • Alles klar.
    Ich habe herausgefunden wie es geht...

    Auf jeden Fall mal Danke an alle...

    Also
    Thx @ all


Anmelden zum Antworten