IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

wxwidget et dll


Sujet :

wxWidgets

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut wxwidget et dll
    Bonjour,

    apres avoir longuement cherché sur le net, et ici aussi, j'ai pas reussi à trouver et creer une application wxwidget en dll. Je m'explique.

    Je creer une fonction simple qui return un wxFrame:
    extern "C" WXEXPORT wxFrame* Make_MainFrame(){
    wxFrame *fr=new wxFrame(NULL,-1,_("FENETRE DANS DLL"));
    return fr;
    }

    je complie ceci en dll avec codeblock(qui permet de créer des "build target" different et de specifier le type de compilation)

    Bien ma DLL est générer.

    Je la capture et je l'execute via mon wxApp:

    #ifdef WX_PRECOMP //
    #include "wx_pch.h"
    #endif

    #ifdef __BORLANDC__
    #pragma hdrstop
    #endif //__BORLANDC__

    #include "LAURYGEN_App.h"
    #include "mainframe.h"
    #include <wx/dynlib.h>

    IMPLEMENT_APP(LAURYGEN_App);

    bool LAURYGEN_App::OnInit()
    {
    typedef MainFrame* dialogPtr;
    wxDynamicLibrary* dynlib=new wxDynamicLibrary();
    bool isLoad=dynlib->Load(_("library/SimpleDesign.dll"),wxDL_LAZY);
    if(!isLoad){
    wxMessageBox(_("erreur de chargement de la DLL"));
    exit(0);
    }else{
    wxMessageBox(_("DLL chargee"));
    dialogPtr (*dialfct)();
    dialfct=(dialogPtr(*)())dynlib->GetSymbol(_("Make_MainFrame"));
    //wxASSERT_MSG(dialfct,_("erreur"));
    if(dialfct==NULL){
    wxMessageBox(_("Fonction non chargee"));
    exit(0);
    }
    wxFrame* fr=dialfct(); //C'est ici que ca merde
    dynlib->Unload();
    }

    return true;
    }

    Voila avec wxDynamicLibrary pas de soucis, il est simple et efficace. Tous les teste e chargement de la dll et de la fonction marque succès.

    MAis a l'instaciation de mon wxFrame a partir de la fonction receuilit, la erreur fatale 0x00000000....

    Voila mon hypothese, apres chargement mon programme lit une partir de la memoire qui ne doit pas l'etre.( c'est tout ce que j'ai trouve)

    C'est comme si l'objet n'est pq exporter.

    Quelqu'un l'a t'il deja fait? PLEASE HELP ME, cela fait 1 mois
    que j'essais.

    Merci de me comprendre et de m'aider si possible

  2. #2
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    toujours pas de reponse? bon, je sais pas trop si je dois oublié ce choix de faire une librairie de mes interfaces.

    Voila j'ai trouvé des liens qui expliquent un peu le principe, mais quand je les teste ya toujours cette fenetre "l'application a l'adresse "0x0320....." ...ne peut etre read"

    voici les lien des sites:
    http://wiki.wxwidgets.org/Creating_A...An_Application

    voici par un exemple trouvé, qui ne fonctionne pas aussi chez moi,(je signal que ces sources ne viennent pas de moi) :

    ************** wxDLL.h:

    #pragma once

    #include "wx/wxprec.h"

    #ifndef WX_PRECOMP
    #include "wx/wx.h"
    #endif

    #include "wx/app.h"

    #include "windows.h"


    #ifdef DLLFUNCTIONS_EXPORTS
    #define DLLFUNCTIONS_API __declspec(dllexport)
    #else
    #define DLLFUNCTIONS_API __declspec(dllimport)
    #endif

    extern "C" DLLFUNCTIONS_API void DLLFunction(HWND);
    extern "C" DLLFUNCTIONS_API void TestReport(HWND handle);

    class wxDLLApp : public wxApp
    {
    bool OnInit();
    void OnButton(wxCommandEvent& evt);
    DECLARE_EVENT_TABLE()
    };

    **********************wxDLL.cpp:

    #include "wx/wx.h"

    #include "wxDLL.h"
    #include "wx/wxhtml.h"
    #include "wx/msw/private.h" //for wxSetInstance

    // We use IMPLEMENT_APP_NO_MAIN so we can start the app from DllMain
    // as we don't have a WinMain or main entry point
    //
    BEGIN_EVENT_TABLE(wxDLLApp, wxApp)
    EVT_BUTTON(123,wxDLLApp::OnButton)
    END_EVENT_TABLE()

    IMPLEMENT_APP_NO_MAIN(wxDLLApp)

    BOOL APIENTRY DllMain( HANDLE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    { //use wxInitialize() if you don't want GUI instead of the following 12 lines
    wxSetInstance((HINSTANCE)hModule);
    int argc = 0;
    char **argv = NULL;
    wxEntryStart(argc, argv);
    if ( !wxTheApp || !wxTheApp->CallOnInit() )
    return FALSE;
    }
    break;

    case DLL_THREAD_ATTACH:
    break;

    case DLL_THREAD_DETACH:
    break;

    case DLL_PROCESS_DETACH:
    wxEntryCleanup(); //use wxUninitialize() if you don't want GUI
    break;
    }
    return TRUE;
    }

    // extern "C" so we don't need a DEF file

    // This is the function to be called from the host app
    extern "C" DLLFUNCTIONS_API void DLLFunction(HWND handle)
    {
    // Create a dummy wxWindow so we can use the HWND passed from the
    // host application

    wxWindow win;
    win.SetHWND((WXHWND)handle);
    win.Enable(false);

    wxDialog dlg(&win, -1, _("wxDialog in DLL"), wxDefaultPosition, wxSize(150,150));
    wxButton b(&dlg, 123,_("Press me please"));
    dlg.ShowModal();

    // Clean up else the caller can't use its window
    win.Enable(true);
    win.SetHWND(0);
    }

    extern "C" DLLFUNCTIONS_API void TestReport(HWND handle)
    {
    wxWindow win;

    win.SetHWND((WXHWND)handle);
    win.Enable(false);

    wxDialog dlg(&win, wxID_ANY, wxString(_("About")), wxDefaultPosition, wxSize(400,180));

    wxHtmlWindow html1(&dlg,wxID_ANY, wxDefaultPosition, wxSize(380, 160), wxHW_SCROLLBAR_NEVER);
    html1.SetPage(_("<html><body>"
    "<h1>Error</h1>"
    "Some error occurred Smile)"
    "</body></hmtl>"));

    dlg.ShowModal();

    // Clean up else the caller can't use its window
    win.Enable(true);
    win.SetHWND(0);
    }

    bool wxDLLApp::OnInit()
    {
    return true;
    }
    void wxDLLApp::OnButton(wxCommandEvent& evt)
    {
    wxMessageBox(_("You really did it.... I don't believe it!"));
    }


    Je compile ces deux fichiers dans code::block en mode dynamic library, et cela me produit un dll. Puis:

    ************DLLCaller.cpp

    // This is a simple Windows app which loads and calls our DLL on request
    //
    // Tony Edgecombe
    // (C) 2004 Frogmore Computer Services Ltd
    // www.frogmorecs.com
    // Edited by upCASE

    #pragma once

    #include "windows.h"

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow);

    // Just a test app no real need for seperate .h file
    // #include "DLLTestApp.h"

    #include "assert.h"

    typedef void (*DLLFunctionPtr) (HWND);
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);

    // Entry point
    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow)
    {
    WNDCLASSEX wcx;

    wcx.cbSize = sizeof(wcx);
    wcx.style = CS_HREDRAW | CS_VREDRAW;
    wcx.lpfnWndProc = MainWndProc;
    wcx.cbClsExtra = 0;
    wcx.cbWndExtra = 0;
    wcx.hInstance = hInstance;
    wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcx.hbrBackground = (HBRUSH)( COLOR_WINDOW+1 );
    wcx.lpszMenuName = "MainMenu";
    wcx.lpszClassName = "MainWClass";
    wcx.hIconSm = NULL;

    ATOM a = RegisterClassEx(&wcx);
    assert(a);

    HWND hwnd = CreateWindow("MainWClass",
    "Test DLL",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    (HWND) NULL,
    (HMENU) NULL,
    hInstance,
    (LPVOID) NULL);
    assert(hwnd);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    long bRet;
    MSG msg;
    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 )
    {
    if (bRet != -1)
    {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }
    }

    return 0;
    }

    // Windows Callback Procedure
    LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    PAINTSTRUCT ps;
    HDC hDC;

    switch( msg ) {
    case WM_PAINT:
    hDC = BeginPaint( hWnd, &ps );
    TextOut( hDC, 10, 10, "Left Click on this form to launch function: DLLFunction", 55 );
    TextOut( hDC, 10, 30, "Right Click on this form to launch function: TestReport", 55 );
    EndPaint( hWnd, &ps );
    break;

    case WM_DESTROY:
    PostQuitMessage( 0 );
    break;

    case WM_LBUTTONUP:
    {
    // Load up the DLL and call DLLFunction(
    HMODULE hModule = LoadLibrary("Test.dll");
    assert(hModule);
    DLLFunctionPtr pProc = (DLLFunctionPtr)GetProcAddress(hModule, "DLLFunction");
    assert(pProc);
    (pProc)(hWnd);
    FreeLibrary(hModule);
    }
    break;

    case WM_RBUTTONUP:
    {
    // Load up the DLL and call DLLFunction(
    HMODULE hModule = LoadLibrary("Test.dll");
    assert(hModule);
    DLLFunctionPtr pProc = (DLLFunctionPtr)GetProcAddress(hModule, "TestReport");
    assert(pProc);
    (pProc)(hWnd);
    FreeLibrary(hModule);
    }
    break;

    default:
    return( DefWindowProc( hWnd, msg, wParam, lParam ));
    }
    return 0;
    }


    Tout compile bien, mais a l'execution, cette fameuse fenetre apparait toujours.

    Je dois laisser tomber cette idée de faire du dll des interfaces, et me mettre au XRC (que je vais alors apprendre)? si oui c'est quoi les désavantages de cette solution?

  3. #3
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    je crois bien qu'il ya des fois ou on doit trouver soit meme certain trucs. J'ai finalement reussit a exporter les widgets dans les DLL et tout wxwidget, pas de windows.h inclu ou autre.

    J'eai eu une info sur une biblio sur le net, wxDynamicLibrary et je me suis document dessus, apres cela, j'ai planté plusieurs fois ma machine durant le weekend, avant d'annuler petit a petit les probleme jusqu'a la solution.

    J'ai fait un petit texte dessus, ca pourra aidé, j'espere (en piece jointe)
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DLL & COleDispatchDriver en wxWidget
    Par didierdesie dans le forum wxWidgets
    Réponses: 0
    Dernier message: 27/07/2010, 15h02
  2. wxWidgets 2.6.4 et DLL avec paramètres
    Par carreau dans le forum wxWidgets
    Réponses: 1
    Dernier message: 13/11/2008, 14h20
  3. [wxWidgets 2.8.7] wxTooltip dans une DLL
    Par gastoudou dans le forum wxWidgets
    Réponses: 6
    Dernier message: 07/09/2008, 11h50
  4. Réponses: 7
    Dernier message: 05/12/2006, 08h33
  5. wxWidgets et msvcr71.dll
    Par kor6k dans le forum Visual C++
    Réponses: 2
    Dernier message: 10/10/2006, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo