15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


message map problem in dll

Ajay K Sanghi -- sanghi@giasdl01.vsnl.net.in
Friday, January 31, 1997

Environment : VC++ 4.0, Windows 95.

Hello, 

My requirement is to implement message map for a window class in a dll
whose base window class is implemented in another mfc extension dll.

I have class CBaseWnd derrived from CWnd. So the message map inplementation
looks something like 
   BEGIN_MESSAGE_MAP( CBaseWnd, CWnd )
	ON_WM_LBUTTONDOWN()   
   END_MESSAGE_MAP()

This class CBaseWnd is there in a MFC Extension DLL.

I have got another class CDerrivedWnd derrived from CBaseWnd and this 
derrived class is in another mfc extension dll.
So my message map implementaion looks like

    BEGIN_MESSAGE_MAP( CDerrivedWnd, CBaseWnd )
	ON_WM_SIZE()
    END_MESSAGE_MAP()

While linking, it gives a linking error : 

  error LNK2001: unresolved external symbol "protected: static struct 
AFX_MSGMAP 
  const  CBaseWnd::messageMap"(?messageMap@CBaseWnd@@1UAFX_MSGMAP@@B)


If I put the implementation of the derrived class in a application 
project, then 
it does not give this linking error.

or
If I make the message map implemetation like 
       BAGIN_MESSAGE_MAP( CDerrivedWnd, CWnd )
then it does not give any linking error but now all my message processing 
in the 
CBaseWnd class is lost.


What do I need to do ?

Thank you,


ashok
email: sanghi@giasdl01.vsnl.net.in



David A. Pickett -- dabbler@concentric.net
Sunday, February 02, 1997

[Mini-digest: 3 responses]

Make sure you include an import library for the DLL containing your CBaseWnd in the project with the CDerivedWnd.

----------
From: 	Ajay K Sanghi[SMTP:sanghi@giasdl01.vsnl.net.in]
Sent: 	Friday, January 31, 1997 4:29 AM
To: 	mfc-l@netcom.com
Subject: 	message map problem in dll

Environment : VC++ 4.0, Windows 95.

Hello, 

My requirement is to implement message map for a window class in a dll
whose base window class is implemented in another mfc extension dll.

I have class CBaseWnd derrived from CWnd. So the message map inplementation
looks something like 
   BEGIN_MESSAGE_MAP( CBaseWnd, CWnd )
	ON_WM_LBUTTONDOWN()   
   END_MESSAGE_MAP()

This class CBaseWnd is there in a MFC Extension DLL.

I have got another class CDerrivedWnd derrived from CBaseWnd and this 
derrived class is in another mfc extension dll.
So my message map implementaion looks like

    BEGIN_MESSAGE_MAP( CDerrivedWnd, CBaseWnd )
	ON_WM_SIZE()
    END_MESSAGE_MAP()

While linking, it gives a linking error : 

  error LNK2001: unresolved external symbol "protected: static struct 
AFX_MSGMAP 
  const  CBaseWnd::messageMap"(?messageMap@CBaseWnd@@1UAFX_MSGMAP@@B)


If I put the implementation of the derrived class in a application 
project, then 
it does not give this linking error.

or
If I make the message map implemetation like 
       BAGIN_MESSAGE_MAP( CDerrivedWnd, CWnd )
then it does not give any linking error but now all my message processing 
in the 
CBaseWnd class is lost.


What do I need to do ?

Thank you,


ashok
email: sanghi@giasdl01.vsnl.net.in
-----From: "Peter Hodgman" 

     To solve your problem you need to export the class CBaseWnd from the 
     DLL it is defined in and then use the DLL import library for this DLL 
     when linking the second DLL. Your can export  your classes with the 
     declspec specifier as follows:
     
     
     #define EXPORTCLASS __declspec(dllimport) 
     
        and 
     
     #define EXPORTCLASS __declspec(dllexport) 
     
     
class EXPORTCLASS CBaseWnd {
:
:
:
};


when building the DLL that exports the class CBaseWnd the definition of 
EXPORTCLASS should be:

#define EXPORTCLASS __declspec(dllexport) 

when building the DLL that imports/derives from this class  (class CDerrivedWnd)
the EXPORTCLASS should be:

#define EXPORTCLASS __declspec(dllimport) 

Additionally, you must place the export library for the CBaseWnd DLL in your 
library list for the linking of the DLL's that use this class...

Hope this helps..

Pete Hodgman (pgh@autodesk.com)

______________________________ Reply Separator _________________________________
Subject: message map problem in dll
Author:  mfc-l@netcom.com at SMTPCC3
Date:    2/1/97 9:27 PM


Environment : VC++ 4.0, Windows 95.
     
Hello, 
     
My requirement is to implement message map for a window class in a dll 
whose base window class is implemented in another mfc extension dll.
     
I have class CBaseWnd derrived from CWnd. So the message map inplementation 
looks something like 
   BEGIN_MESSAGE_MAP( CBaseWnd, CWnd )
 ON_WM_LBUTTONDOWN()   
   END_MESSAGE_MAP()
     
This class CBaseWnd is there in a MFC Extension DLL.
     
I have got another class CDerrivedWnd derrived from CBaseWnd and this 
derrived class is in another mfc extension dll.
So my message map implementaion looks like
     
    BEGIN_MESSAGE_MAP( CDerrivedWnd, CBaseWnd )
 ON_WM_SIZE()
    END_MESSAGE_MAP()
     
While linking, it gives a linking error : 
     
  error LNK2001: unresolved external symbol "protected: static struct 
AFX_MSGMAP 
  const  CBaseWnd::messageMap"(?messageMap@CBaseWnd@@1UAFX_MSGMAP@@B)
     
     
If I put the implementation of the derrived class in a application 
project, then 
it does not give this linking error.
     
or
If I make the message map implemetation like 
       BAGIN_MESSAGE_MAP( CDerrivedWnd, CWnd )
then it does not give any linking error but now all my message processing 
in the 
CBaseWnd class is lost.
     
     
What do I need to do ?
     
Thank you,
     
     
ashok
email: sanghi@giasdl01.vsnl.net.in

-----From: "P. Senthil" 

Ajay K Sanghi wrote:
> While linking, it gives a linking error :
> 
>   error LNK2001: unresolved external symbol "protected: static struct
> AFX_MSGMAP
>   const  CBaseWnd::messageMap"(?messageMap@CBaseWnd@@1UAFX_MSGMAP@@B)
> 
Since you have the name mangled CBaseWnd::messageMap, all you have to do
is export it. (EXPORTS section in the DEF file of the extension DLL
which implements it).

P.Senthil
http://www.geocities.com/SiliconValley/Heights/6504/




Bing Hou -- hou@tfn.com
Monday, February 03, 1997


Surround your derived class declaration with this compiler switch:

        #undef AFX_DATA
        #define AFX_DATA _declspec(dllimport)

        class CDerivedWnd : public CBaseWnd
        {
                ...
        };

        #undef AFX_DATA                
        #define AFX_DATA

MFC uses AFX_DATA in its message map macros.

By defining AFX_DATA to be _declspec(dllimport), you ensure that the static data
member CBaseWnd::messageMap is imported correctly. Provided that the extension 
DLL which contains the CBaseWnd uses AFX_EXT_CLASS correctly to export CBaseWnd 
class or its data member.


Bing Hou
hou@tfn.com
------------------------------------------------------------------------
  Recall it as often as yo wish, a happy memory never wears out.
                



______________________________ Reply Separator _________________________________
Subject: message map problem in dll
Author:  Ajay K Sanghi  at Internet
Date:    1/31/97 10:29 AM


Environment : VC++ 4.0, Windows 95.
     
Hello, 
     
My requirement is to implement message map for a window class in a dll 
whose base window class is implemented in another mfc extension dll.
     
I have class CBaseWnd derrived from CWnd. So the message map inplementation 
looks something like 
   BEGIN_MESSAGE_MAP( CBaseWnd, CWnd )
        ON_WM_LBUTTONDOWN()   
   END_MESSAGE_MAP()
     
This class CBaseWnd is there in a MFC Extension DLL.
     
I have got another class CDerrivedWnd derrived from CBaseWnd and this 
derrived class is in another mfc extension dll.
So my message map implementaion looks like
     
    BEGIN_MESSAGE_MAP( CDerrivedWnd, CBaseWnd )
        ON_WM_SIZE()
    END_MESSAGE_MAP()
     
While linking, it gives a linking error : 
     
  error LNK2001: unresolved external symbol "protected: static struct 
AFX_MSGMAP 
  const  CBaseWnd::messageMap"(?messageMap@CBaseWnd@@1UAFX_MSGMAP@@B)
     
     
If I put the implementation of the derrived class in a application 
project, then 
it does not give this linking error.
     
or
If I make the message map implemetation like 
       BAGIN_MESSAGE_MAP( CDerrivedWnd, CWnd )
then it does not give any linking error but now all my message processing 
in the 
CBaseWnd class is lost.
     
     
What do I need to do ?
     
Thank you,
     
     
ashok
email: sanghi@giasdl01.vsnl.net.in



TBielo@aol.com
Tuesday, February 04, 1997

[Mini-digest: 2 responses]

>> My requirement is to implement message map for a window class in a dll
>> whose base window class is implemented in another mfc extension dll.
>> 
>> I have class CBaseWnd derrived from CWnd. So the message map 
>> inplementation
>> looks something like 
>>   BEGIN_MESSAGE_MAP( CBaseWnd, CWnd )
>>	ON_WM_LBUTTONDOWN()   
>>   END_MESSAGE_MAP()
>>
>> This class CBaseWnd is there in a MFC Extension DLL.
>>
>> I have got another class CDerrivedWnd derrived from CBaseWnd and this 
>> derrived class is in another mfc extension dll.
>> So my message map implementaion looks like

I assume you are using the AFX_EXT_CLASS macro to export/import classes
to/from your DLL?  Problem is that if you import/export more than one level 
(e.g. have a DLL use a class in another DLL than uses a class in another DLL)
AFX_EXT_CLASS macro gets confused.

I implemented the following code at the beginning of my DLL external
declarations.
Use the /D"BUILD_ExampleDLL" compiler switch when building the DLL.  This
will set the class decl to export when building the DLL and will set the
class decl
to import when including the DLL decl in client source files.  See technical
note #33
for more information.

#ifdef IMPORT_EXPORT_FLAG
   #undef IMPORT_EXPORT_FLAG
#endif

#ifdef BUILD_ExampleDLL
  #define  IMPORT_EXPORT_FLAG   __declspec(dllexport) 
#else 
   #define  IMPORT_EXPORT_FLAG   __declspec(dllimport) 
#endif 


class IMPORT_EXPORT_FLAG Foo
   {
   };

#undef IMPORT_EXPORT_FLAG 


Tony
-----From: Ajay K Sanghi 


Hi Netters:

Thank you very much for helping me solve my problem.
The problem is solved by explicitly importing the CBaseWnd
class.

Due to some early screw-up with our internet account, All mfc-l
mails were getting forwarded to us through our old internet 
account through which we were subscribed to mfc-l. Suddenly,
the ISP has stopped forwarding those mails and hence I did not
receive any reply that were posted to net.

I have requested for subscribtion again and hopefully Mr. Elliot
would oblige.

Special thanks to Mr. Bing, for sending me direct mail, which helped
me solve the problem.

Thank you all,

Regards,

-Ashok


On Tue, 4 Feb 1997, Bing Hou wrote:

>      
>      I apologize, I didn't realize that your derived class is in another 
>      extension DLL. 
>      
>      As another person responded, you need to explicitly import the 
>      CBaseWnd's messageMap data member in your .DEF file's IMPORTS clause, 
>      then it should link fine.
>      
>      -Bing
> 
> 
> ______________________________ Reply Separator _________________________________
> Subject: message map problem in dll 
> Author:  Ajay K Sanghi  at Internet
> Date:    2/4/97 11:21 AM
> 
> 
> Hi, 
> Thanks for your earlier response.
>      
> I tried with the solution given by you, but now it gives compilation 
> errors.
>      
> After making changes, derrive class declaration looks like
>      
> #undef AFX_DATA
> #define AFX_DATA _declspec( dllimport )
>      
> class AFX_EXT_CLASS CDerrivedWnd : public CBaseWnd 
> {
> protected:
>         CStdTreeView();           // protected constructor used by 
> dynamic creation
>         DECLARE_DYNCREATE(CStdTreeView)
>         ------
>         DECLARE_MESSAGE_MAP()
> };
>      
> #undef AFX_DATA
> #define AFX_DATA
>      
> Compilation errors are : 
> error C2487: 'classCStdTreeView' : member of dll interface class may not 
> be declared with dll interface
>      
> This error is repeated for DECLARE_DYNCREATE(CStdTreeView) and 
> DECLARE_MESSAGE_MAP()
>      
> Note : I have not exported any members of the derrived class separately.
>      
> Thanks, 
>      
> Ashok
> Email : sanghi@giasdl01.vsnl.net.in
>      
>      
>      
>      
>      
>      
> On Mon, 3 Feb 1997, Bing Hou wrote:
>      
> > 
> > Surround your derived class declaration with this compiler switch: 
> > 
> >         #undef AFX_DATA
> >         #define AFX_DATA _declspec(dllimport) 
> > 
> >         class CDerivedWnd : public CBaseWnd 
> >         {
> >                 ...
> >         };
> > 
> >         #undef AFX_DATA                
> >         #define AFX_DATA
> > 
> > MFC uses AFX_DATA in its message map macros. 
> > 
> > By defining AFX_DATA to be _declspec(dllimport), you ensure that the static 
> data
> > member CBaseWnd::messageMap is imported correctly. Provided that the extension
>      
> > DLL which contains the CBaseWnd uses AFX_EXT_CLASS correctly to export 
> CBaseWnd 
> > class or its data member.
> > 
> > 
> > Bing Hou
> > hou@tfn.com
> > ------------------------------------------------------------------------ 
> >   Recall it as often as yo wish, a happy memory never wears out.
> >                 
> > 
> > 
> > 
> > ______________________________ Reply Separator 
> _________________________________
> > Subject: message map problem in dll
> > Author:  Ajay K Sanghi  at Internet 
> > Date:    1/31/97 10:29 AM
> > 
> > 
> > Environment : VC++ 4.0, Windows 95. 
> >      
> > Hello, 
> >      
> > My requirement is to implement message map for a window class in a dll 
> > whose base window class is implemented in another mfc extension dll.
> >      
> > I have class CBaseWnd derrived from CWnd. So the message map inplementation 
> > looks something like 
> >    BEGIN_MESSAGE_MAP( CBaseWnd, CWnd ) 
> >         ON_WM_LBUTTONDOWN()   
> >    END_MESSAGE_MAP()
> >      
> > This class CBaseWnd is there in a MFC Extension DLL. 
> >      
> > I have got another class CDerrivedWnd derrived from CBaseWnd and this 
> > derrived class is in another mfc extension dll.
> > So my message map implementaion looks like 
> >      
> >     BEGIN_MESSAGE_MAP( CDerrivedWnd, CBaseWnd ) 
> >         ON_WM_SIZE()
> >     END_MESSAGE_MAP()
> >      
> > While linking, it gives a linking error : 
> >      
> >   error LNK2001: unresolved external symbol "protected: static struct 
> > AFX_MSGMAP 
> >   const  CBaseWnd::messageMap"(?messageMap@CBaseWnd@@1UAFX_MSGMAP@@B) 
> >      
> >      
> > If I put the implementation of the derrived class in a application 
> > project, then 
> > it does not give this linking error. 
> >      
> > or
> > If I make the message map implemetation like 
> >        BAGIN_MESSAGE_MAP( CDerrivedWnd, CWnd )
> > then it does not give any linking error but now all my message processing 
> > in the 
> > CBaseWnd class is lost.
> >      
> >      
> > What do I need to do ?
> >      
> > Thank you,
> >      
> >      
> > ashok
> > email: sanghi@giasdl01.vsnl.net.in 
> > 
> 



Lin Sebastian Kayser -- Lin.Kayser@munich.netsurf.de
Thursday, February 06, 1997

You should #define a specifier that is unique for each module, for =
example use
#ifdef MYMODULE_DECL
#undef MYMODULE_DECL
#endif
#ifdef MYMODULE_EXPORT
#define MYMODULE_DECL   __declspec(dllexport)=20
#else=20
#define MYMODULE_DECL   __declspec(dllimport)=20
#endif=20

class MYMODULE_DECL Foo
   {
   };

where MYMODULE is the name of your module; otherwise you will again run =
into problems when importing a module within another module.

Regards,
Lin


  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .=20
.        Lin Sebastian Kayser, Kayser & Nass, Munich        .
. Lin.Kayser@Munich.Netsurf.de / Lin_Kayser@Compuserve.com  .
.    http://ourworld.compuserve.com/homepages/Lin_Kayser    .
.         Message composed at the 6-Feb-97 at 11:26         .
  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


-----Original Message-----

I assume you are using the AFX_EXT_CLASS macro to export/import classes =
to/from your DLL?  Problem is that if you import/export more than one =
level (e.g. have a DLL use a class in another DLL than uses a class in =
another DLL) AFX_EXT_CLASS macro gets confused.
I implemented the following code at the beginning of my DLL external =
declarations.
Use the /D"BUILD_ExampleDLL" compiler switch when building the DLL.  =
This will set the class decl to export when building the DLL and will =
set the class decl to import when including the DLL decl in client =
source files.  See technical note #33 for more information.
#ifdef IMPORT_EXPORT_FLAG
#undef IMPORT_EXPORT_FLAG
#endif
#ifdef BUILD_ExampleDLL
#define  IMPORT_EXPORT_FLAG   __declspec(dllexport)=20
#else=20
#define  IMPORT_EXPORT_FLAG   __declspec(dllimport)=20
#endif=20

class IMPORT_EXPORT_FLAG Foo
   {
   };

#undef IMPORT_EXPORT_FLAG=20

Tony




Become an MFC-L member | Вернуться в корень Архива |