Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

exe <-> dll runtime povezivanje i koriscenje globalnih promenljivih

[es] :: C/C++ programiranje :: exe <-> dll runtime povezivanje i koriscenje globalnih promenljivih

[ Pregleda: 1765 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.vdial.verat.net.

ICQ: 208550327


+14 Profil

icon exe <-> dll runtime povezivanje i koriscenje globalnih promenljivih07.07.2005. u 17:28 - pre 229 meseci
Dll problem opet...

Zeleo bih da napravim modularnu aplikaciju koja koristi Dll plug-in ove.

Sve sam uspeo da uradim:

Svaki Dll se sastoji od klase i funkcije koja vraca pointer na tu klasu: npr.

extern "C" MY_EXPORT CObject * GetObject() { return new CSomeObject; }

U glavnoj aplikaciji pomocu pretrazivanja direktorijuma automatski ucitavam sve dll-ove u plugin folder-u i pomocu LoadLibrary() i GetProcAddress() nadjem funkciju i sve lepo radi.

Problem je u tome sto bih zeleo da u glavnom programu ( znaci u EXE fajlu ) zeleo da definisem globalnu varijablu:

npr: CMyAppView * g_pView

i da je pomocu include "MyAppView.h" u Dll (plugin-u), iskoristim za npr. prikaz ( Invalidate() )...

// glavni program
//MyAppView.h

class CMyAppView
{
...
}

extern MY_EXPORT CView * g_pView;


//MyAppView.cpp
CView * g_pView = NULL;

CMyAppView::OnCreate()
{
g_pView = this;
}

// plugin

#include "MyAppView.h"

CMyObject::LeftButtonDown(CPoint point)
{
g_pView->Invalidate(); // na primer
}

/////////////

Sve lepo radim, plugin prepoznaje g_pView ali ono je NULL.

Mislim da jo to zbog EXPORT IMPORT "sitnica" koju moram da ugradim i u DLL i u EXE ali ne znam kako...



[Ovu poruku je menjao glorius dana 07.07.2005. u 18:29 GMT+1]
EOF
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: exe <-> dll runtime povezivanje i koriscenje globalnih promenljivih07.07.2005. u 20:43 - pre 229 meseci
Nisam bas detaljno citao, ali mislim da ce morati da pogledas primere za
"Shared memory segment"-s:

Code:

#pragma data_seg ("shared") 
// npr:
char ch = 'a'; 
#pragma data_seg()

ili jos bolje API-je:
Code:

CreateFileMapping()
OpenFileMapping()
MapViewOf­File()



... kad sam vec tu, evo ti jedan moj primer... Ovde ja iz APP saljem DLL-u Handle
na glavnu formu da bi DLL kasnije mogao da mi salje poruke, preko SendMessage()

To bi moglo i sa FindWindow(), ali postoje neke prednosti zasto sam Handle
prosledio direktno (to je druga prica):

--- APP CPP ---
Code:

// ...
extern "C" __declspec(dllexport) __stdcall void SetHook(HWND);
extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
extern "C" __declspec(dllexport) __stdcall DWORD CheckKey(int, WORD,LONG);
// ...



--- DLL CPP ---
Code:

#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#define WM_KEYHOOK       (WM_USER + 1002)

HINSTANCE ghInst;

typedef struct _HookInfo
{
   HHOOK ghhookKB;
   HWND hAppWnd;

} HOOKINFO, *PHOOKINFO;

HANDLE hFileMapping = NULL;
PHOOKINFO pHookInfo = NULL;

#pragma argsused

//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) __stdcall void SetHook(HWND);
extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
extern "C" __declspec(dllexport) __stdcall DWORD CheckKey(int, WORD,LONG);
//---------------------------------------------------------------------------

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void *lpReserved)
{
   ghInst = hinst;

   switch ( reason )
   {
      case DLL_PROCESS_ATTACH:

           hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE,
                                             NULL,
                                             PAGE_READWRITE,
                                             0,
                                             sizeof(HOOKINFO),
                                             "DiHook" );
           if ( hFileMapping )
              pHookInfo = (PHOOKINFO)MapViewOfFile( hFileMapping,
                                                    FILE_MAP_WRITE,
                                                    0,
                                                    0,
                                                    0 );
           break;

      case DLL_PROCESS_DETACH:


           if( pHookInfo )
              UnmapViewOfFile( pHookInfo );

           if( hFileMapping )
              CloseHandle( hFileMapping );

           pHookInfo = NULL;
           hFileMapping = NULL;
           break;

   }

   return ( 1 );
}


void __stdcall SetHook( HWND hWnd )
{
   if ( pHookInfo )
   {
      if( pHookInfo->ghhookKB == NULL )
         pHookInfo->ghhookKB = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)CheckKey, ghInst, NULL );
      pHookInfo->hAppWnd = hWnd;
   }
}

void __stdcall RemoveHook( void )
{
   if ( pHookInfo )
   {
      if ( pHookInfo->ghhookKB )
      {
         UnhookWindowsHookEx( pHookInfo->ghhookKB );
         pHookInfo->ghhookKB = NULL;
      }
   }

}

DWORD __stdcall CheckKey( int nCode, WORD wParam, LONG lParam )
{
   if( pHookInfo )
   {
       if( ((nCode >= 0) && (nCode != HC_NOREMOVE))
           && ((lParam & 0x40000000) == 0) // Skip if it's a repeat
           && (lParam & 0x20000000) ) // Check if Alt is pressed
       {
           // Send key information to the main window
           if( pHookInfo->hAppWnd )
               SendMessage(pHookInfo->hAppWnd, WM_KEYHOOK, 0, lParam);
       }
       return CallNextHookEx(pHookInfo->ghhookKB, nCode, wParam, lParam);
   }
   return 0;

}


[Ovu poruku je menjao X Files dana 07.07.2005. u 21:51 GMT+1]
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.vdial.verat.net.

ICQ: 208550327


+14 Profil

icon Re: exe <-> dll runtime povezivanje i koriscenje globalnih promenljivih08.07.2005. u 12:12 - pre 229 meseci
Hvala ti X-Files. Ipak, cini mi se da postoji i drugaciji nacin ali ne znam kako ga implementirati.

Zeleo sam da uprostim nacin pristupa promenljivama tako da ne moram funkcijama u dll-u da prosledjujem parametre. Npr. funkcija iz mog primera bi izgledala ovako:

CMyObject::LeftButtonDown(CPoint point, CView * pView)
{
pView->Invalidate();

// umesto
// g_pView->Invalidate(); // na primer
}

i u glavnom programu prosledjujem pView promenljivu.

Inace, ovu plug-in arhitekturu sam video u flyEngine-u koji isporucuje lib fajlove za exe program tako da ne mogu da vidim kako je obezbedio svoju glavnu globalnu promenljivu i kako je prosledjuje dll-ovima.
EOF
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.beotel.net.



Profil

icon Re: exe <-> dll runtime povezivanje i koriscenje globalnih promenljivih08.07.2005. u 13:22 - pre 229 meseci
Zelis da plugin pozova neke funkcije core-a? To moze preko interface-a takodje.
Definisi class IMyView sa pure virtual metodama i prepravi GetObject u :

Code:

(u dll-u)
IMyView* g_pView = NULL;

extern "C" MY_EXPORT CObject * GetObject(IMyView* pView) 

g_pView = pView;
return new CSomeObject; 
}


A posle taj pView u implementaciji dodeli g_pView?

Ako us sve ovo koristis i MFC vodi radina da kada se poziva neka MFC metoda noekog MFC objekta moras da ukljucis sledece...

Code:

(ovo je wizard sam generisao)
//
//    Note!
//
//        If this DLL is dynamically linked against the MFC
//        DLLs, any functions exported from this DLL which
//        call into MFC must have the AFX_MANAGE_STATE macro
//        added at the very beginning of the function.
//
//        For example:
//
//        extern "C" BOOL PASCAL EXPORT ExportedFunction()
//        {
//            AFX_MANAGE_STATE(AfxGetStaticModuleState());
//            // normal function body here
//        }
//
//        It is very important that this macro appear in each
//        function, prior to any calls into MFC.  This means that
//        it must appear as the first statement within the 
//        function, even before any object variable declarations
//        as their constructors may generate calls into the MFC
//        DLL.
//
//        Please see MFC Technical Notes 33 and 58 for additional
//        details.
//


yooyo
 
Odgovor na temu

[es] :: C/C++ programiranje :: exe <-> dll runtime povezivanje i koriscenje globalnih promenljivih

[ Pregleda: 1765 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.