Form in DLL



  • danke akari werd ich mir mal durchlesen



  • Hallo noch mal

    ich krieg das nicht so hin bei der dynamischen DLL...
    Entweder ist AddVals und SubVals undefiniert oder HINSTANCE unbekannt
    Ich habs jetzt 4 mal versucht. 2 mal selber schreiben und 2 mal kopieren.
    Weiß einer was ich da falsch gemacht haben könnte bzw was vielleicht im beispiel falsch ist? danke



  • Hallo

    dann hast du irgendetwas aus diesem Teil hier vergessen oder falsch gemacht.
    Ich vermute bei dem unresolved-Fehler hast du vergessen die aus dem Kompilieren der bei DLL entstehende lib-Datei mit in das Zielprojekt mit aufzunehmen.

    bis bald
    akari



  • das mit dem statischen einbinden war kein problem. Das problem bezieht sich auf das dynamische einbinden.

    mfg MoMo



  • Hallo

    sorry das mit dem dynamisch habe ich irgendwie überlesen.
    Aber auch dafür gibt es ja eine ausreichende Anleitung.
    Also hast du etwas falsch gemacht, läßt sich aber ohne relevanten Code und genaue Fehlerbeschreibung nur raten.

    bis bald
    akari



  • Ich werd mir immer sicherer das irgendwas dort am Code ist. Ich habe das nochmal wiederholt undzwar nach jedem schritt nochmal alles GANZ GENAU durchgesehen ob alles richtig geschrieben wurde usw.

    Ab dem Teil mit typedef kommen Fehler...
    Nachdem ich den Teil mit typedef gemacht habe und dann alle projekte erstelle kommen folgende Fehler:

    [Linker Fehler] Unresolved external 'AddVals(int, int)' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\AVC\EIGENE DATEIEN\PROJEKTE\C++\UNIT1.OBJ
      [Linker Fehler] Unresolved external 'SubVals(int, int)' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\AVC\EIGENE DATEIEN\PROJEKTE\C++\UNIT1.OBJ
    

    Nachdem nächsten Schritt im Tutorial die folgenden:

    [C++ Fehler] DLLImp.cpp(16): E2451 Undefiniertes Symbol 'HINSTANCE'
      [C++ Fehler] DLLImp.cpp(16): E2379 In Anweisung fehlt ;
      [C++ Fehler] DLLImp.cpp(17): E2451 Undefiniertes Symbol 'h'
      [C++ Fehler] DLLImp.cpp(19): E2268 Aufruf der undefinierten Funktion 'GetProcAddress'
      [C++ Fehler] DLLImp.cpp(21): E2451 Undefiniertes Symbol 'NULL'
      [C++ Fehler] DLLImp.cpp(29): E2268 Aufruf der undefinierten Funktion 'FreeLibrary'
      [C++ Fehler] DLLImp.cpp(37): E2451 Undefiniertes Symbol 'HINSTANCE'
      [C++ Fehler] DLLImp.cpp(37): E2379 In Anweisung fehlt ;
      [C++ Fehler] DLLImp.cpp(38): E2451 Undefiniertes Symbol 'h'
      [C++ Fehler] DLLImp.cpp(40): E2268 Aufruf der undefinierten Funktion 'GetProcAddress'
      [C++ Fehler] DLLImp.cpp(42): E2451 Undefiniertes Symbol 'NULL'
      [C++ Fehler] DLLImp.cpp(50): E2268 Aufruf der undefinierten Funktion 'FreeLibrary'
    

    Aber wie gesagt ich habe alles genau durchgeguckt und bin mir sehr sicher das ich alles richtig eingebgeben habe



  • Ist die windows.h mit inkludiert (als erstes Include)?
    Ansonsten hilft hier nur etwas Code.



  • danke XD



  • Aber jetzt weiß ich immer noch nicht wie ich Forms in DLLs packe ...entweder ich habe es im Tutorial irgendwie übersehen oder das steht nicht dabei.



  • Möglicherweise habe ich mich falsch ausgedrückt ich meinte das man Forms in einer DLL speichert und die in einem anderen Projekt dann während der laufzeit aufruft



  • Hallo

    Dazu must du die Form-Klasse exportieren, Anleitung siehe hier.

    Allerdings ist es meistens gar nicht notwendig, die wirkliche Form-Klasse über die DLL-Schnittstelle offenzulegen. Außerdem ist man damit mit der Benutzung der DLL an Builder-Projekte gebunden, teilweise auch an die Builder-Version.

    Wenn du eine Compiler/Sprachunabhängige DLL haben willst, must du ein reines C-Interface erschaffen. Meistens brauchst du ja bei Fenstern nur einen Aufruf zum modalen Anzeigen. Das läßt sich so ausführen

    //DLL mit Form, hier als Beispiel zum Eingeben/Auswerten einer Interger-Zahl
    int DLL_EXPORT ShowForm(int* para)
    {
      TDLL_Form* form = new TDLL_Form(NULL);
      form-> ... // Wert aus para an entsprechendes Control im Form übergeben
      int result = form->ShowModal();
      if (result == ID_OK) *para = form->... // Wert aus Form wieder auslesen, wenn positiv
      delete form;
      return result;
    }
    

    Jetzt kannst du die DLL aus jedem beliebigen Windows-Programm heraus aufrufen, und hast trotzdem in der DLL vollen Zugriff auf VCL-Forms.
    Das ganze läßt sich auch auf nicht-modale Fenster ausweiten, indem man das auf mehrere Interface-Funktionen hin ausweitet.

    bis bald
    akari


Anmelden zum Antworten