[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

Exporting Classes from WINNT40 dlls?

Posted on 1998-07-19
7
Medium Priority
?
259 Views
Last Modified: 2013-12-14
Is it possible to export non-MFC classes from a winnt dll.
If so, would someone be able to point me in the right direction? please?

thanx in advance....
0
Comment
Question by:binkle
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 2
7 Comments
 
LVL 11

Accepted Solution

by:
alexo earned 100 total points
ID: 1168140
Sure!  Just declare it as __declspec(dllexport).

Details comming...
0
 
LVL 11

Expert Comment

by:alexo
ID: 1168141
You can declare C++ classes with the dllimport or dllexport attribute. These forms imply that the entire class is imported or exported. Classes exported this way are called exportable classes.

The following example defines an exportable class. All its member functions and static data are exported:
 
class __declspec(dllexport) C
{
    int i;
    virtual int func() { return 1; }
};
 
Note that explicit use of the dllimport and dllexport attributes on members of an exportable class is prohibited.

dllexport Classes
-------------------------
When you declare a class dllexport, all its member functions and static data members are exported. You must provide the definitions of all such members in the same program. Otherwise, a linker error is generated. The one exception to this rule applies to pure virtual functions, for which you need not provide explicit definitions. However, because a destructor for an abstract class is always called by the destructor for the base class, pure virtual destructors must always provide a definition. Note that these rules are the same for nonexportable classes.

If you export data of class type or functions that return classes, be sure to export the class.

dllimport Classes
-------------------------
When you declare a class dllimport, all its member functions and static data members are imported. Unlike the behavior of dllimport and dllexport on nonclass types, static data members cannot specify a definition in the same program in which a dllimport class is defined.

Inheritance and Exportable Classes
---------------------------------------------------
All base classes of an exportable class must be exportable. If not, a compiler warning is generated. Moreover, all accessible members that are also classes must be exportable.
This rule permits a dllexport class to inherit from a dllimport class, and a dllimport class to inherit from a dllexport class (though the latter is not recommended). As a rule, everything that is accessible to the DLL’s client (according to C++ access rules) should be part of the exportable interface. This includes private data members referenced in inline functions.

Selective Member Import/Export
----------------------------------------------
Because member functions and static data within a class implicitly have external linkage, you can declare them with the dllimport or dllexport attribute, unless the entire class is exported. If the entire class is imported or exported, the explicit declaration of member functions and data as dllimport or dllexport is prohibited. If you declare a static data member within a class definition as dllexport, a definition must occur somewhere within the same program (as with nonclass external linkage).

Similarly, you can declare member functions with the dllimport or dllexport attributes. In this case, you must provide a dllexport definition somewhere within the same program.

It is worthwhile to note several important points regarding selective member import and export:

* Selective member import/export is best used for providing a version of the exported class interface that is more restrictive; that is, one for which you can design a DLL that exposes fewer public and private features than the language would otherwise allow. It is also useful for fine-tuning the exportable interface: when you know that the client, by definition, is unable to access some private data, you need not export the entire class.

* If you export one virtual function in a class, you must export all of them, or at least provide versions that the client can use directly.

* If you have a class in which you are using selective member import/export with virtual functions, the functions must be in the exportable interface or defined inline (visible to the client).

* If you define a member as dllexport but do not include it in the class definition, a compiler error is generated. You must define the member in the class header.

* Although the definition of class members as dllimport or dllexport is permitted, you cannot override the interface specified in the class definition.

* If you define a member function in a place other than the body of the class definition in which you declared it, a warning is generated if the function is defined as dllexport or dllimport (if this definition differs from that specified in the class declaration).
0
 
LVL 11

Expert Comment

by:alexo
ID: 1168142
Note, however, that all the exported method names will be mangled ("decorated" in microsofteese) as any other C++ function.  You may need some extern "C" and/or .DEF file gymnastics to make the names "normal".
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
LVL 22

Expert Comment

by:nietod
ID: 1168143
And here again, alex, you sound just like a text book  : - )
0
 
LVL 11

Expert Comment

by:alexo
ID: 1168144
>> And here again, alex, you sound just like a text book
Which comment?  The first one was pasted as-is from the MSVC help.  The second looks OK to me.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1168145
Once again, humor does not digitize well, but I'll never learn.  The first one sounded a lot like a text book---it obviously was.
0
 
LVL 11

Expert Comment

by:alexo
ID: 1168146
All this trouble for an autograde???
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
THe viewer will learn how to use NetBeans IDE 8.0 for Windows to perform CRUD operations on a MySql database.
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…

656 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question