summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorAndreas Baumann <abaumann@yahoo.com>2010-05-17 21:34:14 +0200
committerAndreas Baumann <abaumann@yahoo.com>2010-05-17 21:34:14 +0200
commitfcb0704b0f88583e89023a55d2a8964742b93852 (patch)
tree0710fb8fad6493af714117e4afb35887a823f193 /docs
parentc1c5169e2636209a9a60158d3d16a0f88e4a3cb9 (diff)
downloadwolfbones-fcb0704b0f88583e89023a55d2a8964742b93852.tar.gz
wolfbones-fcb0704b0f88583e89023a55d2a8964742b93852.tar.bz2
cleaned up mission and documentation of shared library modules
Diffstat (limited to 'docs')
-rw-r--r--docs/libraries/README5
-rw-r--r--docs/libraries/howto_export_cpp_classes.txt1610
2 files changed, 5 insertions, 1610 deletions
diff --git a/docs/libraries/README b/docs/libraries/README
index 9540b38..c33ea38 100644
--- a/docs/libraries/README
+++ b/docs/libraries/README
@@ -11,3 +11,8 @@ Nice Makefile examples how to do it without libtool and other unnecessary
helpers:
http://www.cse.iitb.ac.in/dbms/Data/Courses/CS631/PostgreSQL-Resources/postgresql-8.1.4/src/Makefile.shlib
http://root.cern.ch/root/Makefile.html
+
+Goal:
+- we want abstractions for varying versions of dlopen/LoadLibrary(Ex) etc.
+- only basic functionality, no module magic versions or other stuff, should
+ be in a separate library
diff --git a/docs/libraries/howto_export_cpp_classes.txt b/docs/libraries/howto_export_cpp_classes.txt
deleted file mode 100644
index 9c531d3..0000000
--- a/docs/libraries/howto_export_cpp_classes.txt
+++ /dev/null
@@ -1,1610 +0,0 @@
- #[1]CodeProject Latest articles - All topics [2]CodeProject Latest
- articles - MFC / C++ [3]CodeProject Latest articles - C# [4]CodeProject
- Latest articles - ASP.NET [5]CodeProject Latest articles - .NET
- [6]CodeProject Latest articles - VB.NET [7]CodeProject Lounge Postings
- [8]CodeProject
-
- [9]Click here to Skip to main content
-
- 6,491,710 members and growing! (15,072 online)
- Email ____________________ Password ____________________ Sign in [_]
- Remember me? [10]help Lost your password?
- [11]The Code Project
- * [12]Home
- * [13]Articles
- + [14]Search
- + [15]Latest Articles
- + [16]Top Articles
- + [17]Beginner Articles
- + [18]Technical Blogs
- + [19]Post an Article
- +
- + [20]Post your Blog
- + [21]Posting/Update Guidelines
- + [22]Article Competition
- + [23]Topic List
- * [24]Message Boards
- + [25]ASP.NET
- + [26]ATL / WTL / STL
- + [27]C / C++ / MFC
- + [28]Managed C++/CLI
- + [29]C#
- + [30]COM
- + [31]Hardware & Devices
- + [32]LINQ
- + [33].NET Framework
- + [34]System Admin
- + [35]Silverlight
- + [36]General Database
- + [37]Sharepoint
- + [38]Visual Basic
- + [39]Web Development
- + [40]WPF / WCF / WF
- + [41]XML / XSL
- + [42]General IT Issues
- + [43]Site Bugs / Suggestions
- + [44]The Soapbox 2.0
- + [45]All Message Boards...
- * [46]Job Board
- + [47]Latest
- + [48]Search
- + [49]Post a Job
- + [50]FAQ and Pricing
- * [51]Catalog
- + [52]Latest
- + [53]Search
- + [54]Post a Catalog Item
- + [55]FAQ and Pricing
- * [56]Help!
- + [57]What is 'The Code Project'?
- + [58]General FAQ
- + [59]Post a Question
- + [60]Site Directory
- + [61]About Us
- * [62]Lounge [63]Soapbox
-
- [64]Languages » [65]C / C++ Language » [66]Howto Beginner License:
- [67]The Code Project Open License (CPOL)
-
-HowTo: Export C++ classes from a DLL
-
- By [68]Alex Blekhman
- The C++ programming language and Windows DLLs can live in peace after
- all. C++ (VC6, VC7, VC7.1, VC8.0), C++/CLI, C, Windows, Dev
- Posted: 31 Aug 2008
- Views: 40,912
- Bookmarked: 129 times
-
- Announcements
- Comp [69]Monthly Competition
- Loading...
- Articles
- [70]Desktop Development
- [71]Button Controls
- [72]Clipboard
- [73]Combo & List Boxes
- [74]Dialogs and Windows
- [75]Desktop Gadgets
- [76]Document / View
- [77]Edit Controls
- [78]Files and Folders
- [79]Grid & Data Controls
- [80]List Controls
- [81]Menus
- [82]Miscellaneous
- [83]Printing
- [84]Progress Controls
- [85]Selection Controls
- [86]Shell and IE programming
- [87]Smart Client
- [88]Splitter Windows
- [89]Static & Panel Controls
- [90]Status Bar
- [91]Tabs & Property Pages
- [92]Toolbars & Docking windows
- [93]Tree Controls
- [94]Web Development
- [95]Ajax and Atlas
- [96]Applications & Tools
- [97]ASP
- [98]ASP.NET
- [99]ASP.NET Controls
- [100]ATL Server
- [101]Caching
- [102]Charts, Graphs and Images
- [103]Client side scripting
- [104]Custom Controls
- [105]HTML / CSS
- [106]ISAPI
- [107]Site & Server Management
- [108]Session State
- [109]Silverlight
- [110]Trace and Logs
- [111]User Controls
- [112]Validation
- [113]View State
- [114]WAP / WML
- [115]Web Security
- [116]Web Services
- [117]Enterprise Systems
- [118]Content Management Server
- [119]Microsoft BizTalk Server
- [120]Microsoft Exchange
- [121]Office Development
- [122]SharePoint Server
- [123]Multimedia
- [124]Audio and Video
- [125]DirectX
- [126]GDI
- [127]GDI+
- [128]General Graphics
- [129]OpenGL
- [130]Database
- [131]Database
- [132]SQL Reporting Services
- [133]Platforms, Frameworks & Libraries
- [134]ATL
- [135]MFC
- [136]STL
- [137]WTL
- [138]COM / COM+
- [139].NET Framework
- [140]Win32/64 SDK & OS
- [141]Vista API
- [142]Vista Security
- [143]Cross Platform
- [144]Game Development
- [145]Mobile Development
- [146]Windows CardSpace
- [147]Windows Communication Foundation
- [148]Windows Presentation Foundation
- [149]Windows Workflow Foundation
- [150]Libraries
- [151]Windows Powershell
- [152]LINQ
- [153]Languages
- [154]C / C++ Language
- [155]C++ / CLI
- [156]C#
- [157]MSIL
- [158]VBScript
- [159]VB.NET
- [160]VB6 Interop
- [161]Other .NET Languages
- [162]XML
- [163]Java
- [164]General Programming
- [165]Algorithms & Recipes
- [166]Bugs & Workarounds
- [167]Collections
- [168]Cryptography & Security
- [169]Date and Time
- [170]DLLs & Assemblies
- [171]Exception Handling
- [172]Localisation
- [173]Macros and Add-ins
- [174]Programming Tips
- [175]String handling
- [176]Internet / Network
- [177]Threads, Processes & IPC
- [178]WinHelp / HTMLHelp
- [179]Uncategorised FAQ Entries
- [180]Graphics / Design
- [181]Expression
- [182]Usability
- [183]Development Lifecycle
- [184]Debug Tips
- [185]Design and Architecture
- [186]Installation
- [187]Work Issues
- [188]Testing and QA
- [189]Code Generation
- [190]General Reading
- [191]Book Chapters
- [192]Book Reviews
- [193]Hardware Reviews
- [194]Interviews
- [195]Scrapbook
- [196]Hardware & System
- [197]Uncategorised Technical Blogs
- [198]Author Resources
- [199]Third Party Products
- [200]Product Showcase
- [201]Solution Center
- [202]Mentor Resources
- Services
- [203]Product Catalog
- [204]Code-signing Certificates
- [205]Job Board
- [206]CodeProject VS2008 Addin
- Feature Zones
- [207]Product Showcase
- Search ____________________ [Articles.......] Go!
- [208]Advanced Search
- print [209]Print add [210]Share
- Discuss [211]Discuss Broken Article? [212]Report
- 55 votes for this article.
- [red.gif] [red.gif] [red.gif] [red.gif] [red.gif] [white.gif]
- [213]Popularity: 8.33 Rating: 4.79 out of 5
- 1 vote, 1.8%
- 1 1 vote, 1.8%
- 2 1 vote, 1.8%
- 3 5 votes, 9.1%
- 4 47 votes, 85.5%
- 5
- * [214]Download source - 11.1 KB
-
-Contents
-
- * [215]Introduction
- * [216]C Language Approach
- + Handles
- + Calling Conventions
- + Exception Safety
- + Advantages
- + Disadvantages
- * [217]C++ Naive Approach: Exporting a Class
- + What You See Is Not What You Get
- + Exception Safety
- + Advantages
- + Disadvantages
- * [218]C++ Mature Approach: Using an Abstract Interface
- + How This Works
- + Why This Works With Other Compilers
- + Using a Smart Pointer
- + Exception Safety
- + Advantages
- + Disadvantages
- * [219]What About STL Template Classes?
- * [220]Summary
-
-Introduction
-
- Dynamic-Link libraries (DLL) are an integrated part of the Windows
- platform from its very beginning. DLLs allow encapsulation of a piece
- of functionality in a standalone module with an explicit list of C
- functions that are available for external users. In 1980's, when
- Windows DLLs were introduced to the world, the only viable option to
- speak to broad development audience was C language. So, naturally,
- Windows DLLs exposed their functionality as C functions and data.
- Internally, a DLL may be implemented in any language, but in order to
- be used from other languages and environments, a DLL interface should
- fall back to the lowest common denominator - the C language.
-
- Using the C interface does not automatically mean that a developer
- should give up object oriented approach. Even the C interface can be
- used for true object oriented programming, though it may be a tedious
- way of doing things. Unsurprisingly, the second most used programming
- language in the world, namely C++, could not help but to fall prey to
- the temptation of a DLL. However, opposite to the C language, where the
- binary interface between a caller and a callee is well-defined and
- widely accepted, in the C++ world, there is no recognized application
- binary interface (ABI). In practice, it means that binary code that is
- generated by a C++ compiler is not compatible with other C++ compilers.
- Moreover, the binary code of the same C++ compiler may be incompatible
- with other versions of this compiler. All this makes exporting C++
- classes from a DLL quite an adventure.
-
- The purpose of this article is to show several methods of exporting C++
- classes from a DLL module. The source code demonstrates different
- techniques of exporting the imaginary Xyz object. The Xyz object is
- very simple, and has only one method: Foo.
-
- Here is the diagram of the object Xyz:
- Xyz
- int Foo(int)
-
- The implementation of the Xyz object is inside a DLL, which can be
- distributed to a wide range of clients. A user can access Xyz
- functionality by:
- * Using pure C
- * Using a regular C++ class
- * Using an abstract C++ interface
-
- The source code consists of two projects:
- * XyzLibrary - a DLL library project
- * XyzExecutable - a Win32 console program that uses "XyzLibrary.dll"
-
- The XyzLibrary project exports its code with the following handy macro:
-#if defined(XYZLIBRARY_EXPORT) // inside DLL
-# define XYZAPI __declspec(dllexport)
-#else // outside DLL
-# define XYZAPI __declspec(dllimport)
-#endif // XYZLIBRARY_EXPORT
-
- The XYZLIBRARY_EXPORT symbol is defined only for the XyzLibrary
- project, so the XYZAPI macro expands into __declspec(dllexport) for the
- DLL build and into __declspec(dllimport) for the client build.
-
-C Language Approach
-
-Handles
-
- The classic C language approach to object oriented programming is the
- usage of opaque pointers, i.e., handles. A user calls a function that
- creates an object internally, and returns a handle to that object.
- Then, the user calls various functions that accept the handle as a
- parameter and performs all kinds of operations on the object. A good
- example of the handle usage is the Win32 windowing API that uses an
- HWND handle to represent a window. The imaginary Xyz object is exported
- via a C interface, like this:
-typedef tagXYZHANDLE {} * XYZHANDLE;
-
-// Factory function that creates instances of the Xyz object.
-XYZAPI XYZHANDLE APIENTRY GetXyz(VOID);
-
-// Calls Xyz.Foo method.
-XYZAPI INT APIENTRY XyzFoo(XYZHANDLE handle, INT n);
-// Releases Xyz instance and frees resources.
-XYZAPI VOID APIENTRY XyzRelease(XYZHANDLE handle);
-
-// APIENTRY is defined as __stdcall in WinDef.h header.
-
- Here is an example of how a client's C code might look like:
-#include "XyzLibrary.h"
-
-...
-
-/* Create Xyz instance. */
-XYZHANDLE hXyz = GetXyz();
-
-if(hXyz)
-{
- /* Call Xyz.Foo method. */
- XyzFoo(hXyz, 42);
-
- /* Destroy Xyz instance and release acquired resources. */
- XyzRelease(hXyz);
-
- /* Be defensive. */
- hXyz = NULL;
-}
-
- With this approach, a DLL must provide explicit functions for object
- creation and deletion.
-
-Calling Conventions
-
- It is important to remember to specify the calling convention for all
- exported functions. Omitted calling convention is a very common mistake
- that many beginners do. As long as the default client's calling
- convention matches that of the DLL, everything works. But, once the
- client changes its calling convention, it goes unnoticed by the
- developer until runtime crashes occur. The XyzLibrary project uses the
- APIENTRY macro, which is defined as __stdcall in the "WinDef.h" header
- file.
-
-Exception Safety
-
- No C++ exception is allowed to cross over the DLL boundary. Period. The
- C language knows nothing about C++ exceptions, and cannot handle them
- properly. If an object method needs to report an error, then a return
- code should be used.
-
-Advantages
-
- * A DLL can be used by the widest programming audience possible.
- Almost every modern programming language supports interoperability
- with plain C functions.
- * C run-time libraries of a DLL and a client are independent of each
- other. Since resource acquisition and freeing happens entirely
- inside a DLL module, a client is not affected by a DLL's choice of
- CRT.
-
-Disadvantages
-
- * The responsibility of calling the right methods on the right
- instance of an object rests on the user of a DLL. For example, in
- the following code snippet, the compiler won't be able to catch the
- error:
-/* void* GetSomeOtherObject(void) is declared elsewhere. */
-XYZHANDLE h = GetSomeOtherObject();
-
-/* Oops! Error: Calling Xyz.Foo on wrong object intance. */
-XyzFoo(h, 42);
- * Explicit function calls are required in order to create and destroy
- object instances. This is especially annoying for deletion of an
- instance. The client function must meticulously insert a call to
- XyzRelease at all points of exit from a function. If the developer
- forgets to call XyzRelease, then resources are leaked because the
- compiler doesn't help to track the lifetime of an object instance.
- Programming languages that support destructors or have a garbage
- collector may mitigate this problem by making a wrapper over the C
- interface.
- * If object methods return or accept other objects as parameters,
- then the DLL author has to provide a proper C interface for these
- objects, too. The alternative is to fall back to the lowest common
- denominator, that is the C language, and use only built-in types
- (like int, double, char*, etc.) as return types and method
- parameters.
-
-C++ Naive Approach: Exporting a Class
-
- Almost every modern C++ compiler that exists on the Windows platform
- supports exporting a C++ class from a DLL. Exporting a C++ class is
- quite similar to exporting C functions. All that a developer is
- required to do is to use the __declspec(dllexport/dllimport) specifier
- before the class name if the whole class needs to be exported, or
- before the method declarations if only specific class methods need to
- be exported. Here is a code snippet:
-// The whole CXyz class is exported with all its methods and members.
-//
-class XYZAPI CXyz
-{
-public:
- int Foo(int n);
-};
-
-// Only CXyz::Foo method is exported.
-//
-class CXyz
-{
-public:
- XYZAPI int Foo(int n);
-};
-
- There is no need to explicitly specify a calling convention for
- exporting classes or their methods. By default, the C++ compiler uses
- the __thiscall calling convention for class methods. However, due to
- different naming decoration schemes that are used by different
- compilers, the exported C++ class can only be used by the same compiler
- and by the same version of the compiler. Here is an example of a naming
- decoration that is applied by the MS Visual C++ compiler:
-
- C++ names are decorated or "mangled".
-
- Notice how the decorated names are different from the original C++
- names. Following is a screenshot of the same DLL module with name
- decoration deciphered by the [221]Dependency Walker tool:
-
- C++ names are undecorated by Dependency Walker.
-
- Only the MS Visual C++ compiler can use this DLL now. Both the DLL and
- the client code must be compiled with the same version of MS Visual C++
- in order to ensure that the naming decoration scheme matches between
- the caller and the callee. Here is an example of a client code that
- uses the Xyz object:
-#include "XyzLibrary.h"
-
-...
-// Client uses Xyz object as a regular C++ class.
-CXyz xyz;
-xyz.Foo(42);
-
- As you can see, the usage of an exported class is pretty much the same
- as the usage of any other C++ class. Nothing special.
-
- Important: Using a DLL that exports C++ classes should be considered no
- different than using a static library. All rules that apply to a static
- library that contains C++ code are fully applicable to a DLL that
- exports C++ classes.
-
-What You See Is Not What You Get
-
- A careful reader must have already noticed that the Dependency Walker
- tool showes an additional exported member, that is the CXyz&
- CXyz::operator =(const CXyz&) assignment operator. What we see is our
- C++ money at work. According to the C++ Standard, every class has four
- special member functions:
- * Default constructor
- * Copy constructor
- * Destructor
- * Assignment operator (operator =)
-
- If the author of a class does not declare and does not provide an
- implementation of these members, then the C++ compiler declares them,
- and generates an implicit default implementation. In the case of the
- CXyz class, the compiler decided that the default constructor, copy
- constructor, and the destructor are trivial enough, and optimized them
- out. However, the assignment operator survived optimization and got
- exported from a DLL.
-
- Important: Marking the class as exported with the __declspec(dllexport)
- specifier tells the compiler to attempt to export everything that is
- related to the class. It includes all class data members, all class
- member functions (either explicitly declared, or implicitly generated
- by the compiler), all base classes of the class, and all their members.
- Consider:
-class Base
-{
- ...
-};
-
-class Data
-{
- ...
-};
-
-// MS Visual C++ compiler emits C4275 warning about not exported base class.
-class __declspec(dllexport) Derived :
- public Base
-{
- ...
-
-private:
- Data m_data; // C4251 warning about not exported data member.
-};
-
- In the above code snippet, the compiler will warn you about the not
- exported base class and the not exported class of the data member. So,
- in order to export a C++ class successfully, a developer is required to
- export all the relevant base classes and all the classes that are used
- for the definition of the data members. This snowball exporting
- requirement is a significant drawback. That is why, for instance, it is
- very hard and tiresome to export classes that are derived from STL
- templates or to use STL templates as data members. An instantiation of
- an STL container like std::map<>, for example, may require tens of
- additional internal classes to be exported.
-
-Exception Safety
-
- An exported C++ class may throw an exception without any problem.
- Because of the fact that the same version of the same C++ compiler is
- used both by a DLL and its client, C++ exceptions are thrown and caught
- across DLL boundaries as if there were no boundaries at all. Remember,
- using a DLL that exports C++ code is the same as using a static library
- with the same code.
-
-Advantages
-
- * An exported C++ class can be used in the same way as any other C++
- class.
- * An exception that is thrown inside a DLL can be caught by the
- client without any problem.
- * When only small changes are made in a DLL module, no rebuild is
- required for other modules. This can be very beneficial for big
- projects where huge amounts of code are involved.
- * Separating logical modules in a big project into DLL modules may be
- seen as the first step towards true module separation. Overall, it
- is a rewarding activity that improves the modularity of a project.
-
-Disadvantages
-
- * Exporting C++ classes from a DLL does not prevent very tight
- coupling between an object and its user. The DLL should be seen as
- a static library with respect to code dependencies.
- * Both client code and a DLL must link dynamically with the same
- version of CRT. It is necessary in order to enable correct
- bookkeeping of CRT resources between the modules. If a client and
- DLL link to different versions of CRT, or link with CRT statically,
- then resources that have been acquired in one instance of the CRT
- will have been freed in a different instance of the CRT. It will
- corrupt the internal state of the CRT instance that attempts to
- operate on foreign resources, and most likely will lead to crash.
- * Both the client code and the DLL must agree on the exception
- handling/propagating model, and use the same compiler settings with
- respect to C++ exceptions.
- * Exporting a C++ class requires exporting everything that is related
- to this class: all its base classes, all classes that are used for
- the definition of data members, etc.
-
-C++ Mature Approach: Using an Abstract Interface
-
- A C++ abstract interface (i.e., a C++ class that contains only pure
- virtual methods and no data members) tries to get the best of both
- worlds: a compiler independent clean interface to an object, and a
- convenient object oriented way of method calls. All that is required to
- do is to provide a header file with an interface declaration and
- implement a factory function that will return the newly created object
- instances. Only the factory function has to be declared with the
- __declspec(dllexport/dllimport) specifier. The interface does not
- require any additional specifiers.
-// The abstract interface for Xyz object.
-// No extra specifiers required.
-struct IXyz
-{
- virtual int Foo(int n) = 0;
- virtual void Release() = 0;
-};
-
-// Factory function that creates instances of the Xyz object.
-extern "C" XYZAPI IXyz* APIENTRY GetXyz();
-
- In the above code snippet, the factory function GetXyz is declared as
- extern "C". It is required in order to prevent the mangling of the
- function name. So, this function is exposed as a regular C function,
- and can be easily recognized by any C-compatible compiler. This is how
- the client code looks like, when using an abstract interface:
-#include "XyzLibrary.h"
-
-...
-IXyz* pXyz = ::GetXyz();
-
-if(pXyz)
-{
- pXyz->Foo(42);
-
- pXyz->Release();
- pXyz = NULL;
-}
-
- C++ does not provide a special notion for an interface as other
- programming languages do (for example, C# or Java). But it does not
- mean that C++ cannot declare and implement interfaces. The common
- approach to make a C++ interface is to declare an abstract class
- without any data members. Then, another separate class inherits from
- the interface and implements interface methods, but the implementation
- is hidden from the interface clients. The interface client neither
- knows nor cares about how the interface is implemented. All it knows is
- which methods are available and what they do.
-
-How This Works
-
- The idea behind this approach is very simple. A member-less C++ class
- that consisting of pure virtual methods only is nothing more than a
- virtual table, i.e., an array of function pointers. This array of
- function pointers is filled within a DLL with whatever an author deems
- necessary to fill. Then, this array of pointers is used outside of a
- DLL to call the actual implementation. Bellow is the diagram that
- illustrates the IXyz interface usage.
-
- Click on the image to view the full sized diagram in a new window:
-
- [222]Using IXyz interface from the outside of a DLL
-
- The above diagram shows the IXyz interface that is used both by the DLL
- and the EXE modules. Inside the DLL module, the XyzImpl class inherits
- from the IXyz interface, and implements its methods. Method calls in
- the EXE module invoke the actual implementation in the DLL module via a
- virtual table.
-
-Why This Works With Other Compilers
-
- The short explanation is: because COM technology works with other
- compilers. Now, for the long explanation. Actually, using a member-less
- abstract class as an interface between modules is exactly what COM does
- in order to expose COM interfaces. The notion of a virtual table, as we
- know it in the C++ language, fits nicely into the specification of the
- COM standard. This is not a coincidence. The C++ language, being the
- mainstream development language for at least over a decade now, has
- been used extensively with COM programming. It is thanks to natural
- support for object oriented programming in the C++ language. It is not
- surprising at all that Microsoft has considered the C++ language as the
- main heavy-duty instrument for industrial COM development. Being the
- owner of the COM technology, Microsoft has ensured that the COM binary
- standard and their own C++ object model implementation in the Visual
- C++ compiler do match, with as little overhead as possible.
-
- No wonder that other C++ compiler vendors jumped on the bandwagon and
- implemented the virtual table layout in their compilers in the same way
- as Microsoft did. After all, everybody wanted to support COM
- technology, and to be compatible with the existing solution from
- Microsoft. A hypothetical C++ compiler that fails to support COM
- efficiently is doomed to oblivion in the Windows market. That is why
- ,nowadays, exposing a C++ class from a DLL via an abstract interface
- will work reliably with every decent C++ compiler on the Windows
- platform.
-
-Using a Smart Pointer
-
- In order to ensure proper resource release, an abstract interface
- provides an additional method for the disposal of an instance. Calling
- this method manually can be tedious and error prone. We all know how
- common this error is in the C world where the developer has to remember
- to free the resources with an explicit function call. That's why
- typical C++ code uses [223]RAII idiom generously with the help of smart
- pointers. The XyzExecutable project uses the AutoClosePtr template,
- which is provided with the example. The AutoClosePtr template is the
- simplest implementation of a smart pointer that calls an arbitrary
- method of a class to destroy an instance instead of operator delete.
- Here is a code snippet that demonstrates the usage of a smart pointer
- with the IXyz interface:
-#include "XyzLibrary.h"
-#include "AutoClosePtr.h"
-
-...
-typedef AutoClosePtr<IXyz, void, &IXyz::Release> IXyzPtr;
-
-IXyzPtr ptrXyz(::GetXyz());
-
-if(ptrXyz)
-{
- ptrXyz->Foo(42);
-}
-
-// No need to call ptrXyz->Release(). Smart pointer
-// will call this method automatically in the destructor.
-
- Using a smart pointer will ensure that the Xyz object is properly
- released, no matter what. A function can exit prematurely because of an
- error or an internal exception, but the C++ language guarantees that
- destructors of all local objects will be called upon the exit.
-
-Exception Safety
-
- In the same way as a COM interface is not allowed to leak any internal
- exception, the abstract C++ interface cannot let any internal exception
- to break through DLL boundaries. Class methods should use return codes
- to indicate an error. The implementation for handling C++ exceptions is
- very specific to each compiler, and cannot be shared. So, in this
- respect, an abstract C++ interface should behave as a plain C function.
-
-Advantages
-
- * An exported C++ class can be used via an abstract interface, with
- any C++ compiler.
- * C run-time libraries of a DLL and a client are independent of each
- other. Since resource acquisition and freeing happens entirely
- inside a DLL module, a client is not affected by a DLL's choice of
- CRT.
- * True module separation is achieved. The resulting DLL module can be
- redesigned and rebuilt without affecting the rest of the project.
- * A DLL module can be easily converted to a full-fledged COM module,
- if required.
-
-Disadvantages
-
- * An explicit function call is required to create a new object
- instance and to delete it. A smart pointer can spare a developer of
- the latter call, though.
- * An abstract interface method cannot return or accept a regular C++
- object as a parameter. It has be either a built-in type (like int,
- double, char*, etc.) or another abstract interface. It is the same
- limitation as for COM interfaces.
-
-What About STL Template Classes?
-
- The Standard C++ Library containers (like vector, list, or map) and
- other templates were not designed with DLL modules in mind. The C++
- Standard is silent about DLLs because this is a platform specific
- technology, and it is not necessarily present on other platforms where
- the C++ language is used. Currently, the MS Visual C++ compiler can
- export and import instantiations of STL classes which a developer
- explicitly marks with the __declspec(dllexport/dllimport) specifier.
- The compiler emits a couple of nasty warnings, but it works. However,
- one must remember that exporting STL template instantiations is in no
- way different from exporting regular C++ classes, with all accompanying
- limitations. So, there is nothing special about STL in that respect.
-
-Summary
-
- The article discussed different methods of exporting a C++ object from
- a DLL module. Detailed description is given of the advantages and
- disadvantages for each method. Exception safety considerations are
- outlined. The following conclusions are made:
- * Exporting an object as a set of plain C functions has an advantage
- of being compatible with the widest range of development
- environments and programming languages. However, a DLL user is
- required to use outdated C techniques or to provide additional
- wrappers over the C interface in order to use modern programming
- paradigms.
- * Exporting a regular C++ class is no different than providing a
- separate static library with the C++ code. The usage is very simple
- and familiar; however, there is a tight coupling between the DLL
- and its client. The same version of the same C++ compiler must be
- used, both for the DLL and its client.
- * Declaring an abstract member-less class and implementing it inside
- a DLL module is the best approach to export C++ objects, so far.
- This method provides a clean, well-defined object oriented
- interface between the DLL and its client. Such a DLL can be used
- with any modern C++ compiler on the Windows platform. The usage of
- an interface in conjunction with smart pointers is almost as easy
- as the usage of an exported C++ class.
-
- The C++ programming language is a powerful, versatile, and flexible
- development instrument.
-
-License
-
- This article, along with any associated source code and files, is
- licensed under [224]The Code Project Open License (CPOL)
-
-About the Author
-
- [225]Alex Blekhman
-
- [{5874ff19-35c6-4efd-9554-30f827a5475e}.png]
-
- Member
- Occupation: Software Developer
- Location: Israel Israel
-
-Other popular C / C++ Language articles:
-
- * [226]Member Function Pointers and the Fastest Possible C++
- Delegates
- A comprehensive tutorial on member function pointers, and an
- implementation of delegates that generates only two ASM opcodes!
- * [227]How a C++ compiler implements exception handling
- An indepth discussion of how VC++ implements exception handling.
- Source code includes exception handling library for VC++.
- * [228]A Beginner's Guide to Pointers
- An article showing the use of pointers in C and C++
- * [229]XML class for processing and building simple XML documents
- Link CMarkup into your VC++ app and avoid complex XML tools and
- dependencies
- * [230]PugXML - A Small, Pugnacious XML Parser
- Discussion of techniques for fast, robust, light-weight XML
- parsing.
-
- [231]Article Top
- [232]Sign Up to vote for this article
- Your reason for this vote:
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
-
- IFRAME: [233]/script/Adm/ServeLinks.aspx?C=False&ids=10693,5226,8560
-
- You must [234]Sign In to use this message board.
- FAQ [235]FAQ ____________________ Search
-
- Noise Tolerance[Medium...] Layout[Expand Posts & Replies] Per
- page[25] Update
-
- Msgs 1 to 25 of 42 (Total in Forum: 42) ([236]Refresh)
- FirstPrev[237]Next
- General [238]source file path in c++ [239]Pin member [240]JinXu 19:50
- 19 May '09
- Hi, Alex,
- I use Visual Studio to generate my DLLs. But I find that c++ source
- paths are often stored in the generated DLLs as strings, even in
- release version. Frown Can you tell me why?
- Thanks a lot!
- Hello world!
- [241]Sign In·[242]View Thread·[243]PermaLink
- General [244]Re: source file path in c++ [245]Pin member [246]Alex
- Blekhman 23:36 19 May '09
- I don't know why. This is the way MS linker builds executable modules.
- However, you can select the .PDB file during debug session manually if
- VC++ IDE doesn't find the one specified in the .EXE/.DLL module.
- [247]Sign In·[248]View Thread·[249]PermaLink
- General [250]Static library [251]Pin member [252]Osman Kevin 15:57 21
- Mar '09
- In my project, I want to eliminate the dependency of DLL, so I am
- planning to use static library, does this method apply to the static
- library as well ?
- [253]Sign In·[254]View Thread·[255]PermaLink
- General [256]Re: Static library [257]Pin member [258]Alex Blekhman 2:51
- 22 Mar '09
- If you want to use static library, then you don't need to worry about
- DLL techniques at all. just compile your code as a .LIB, thne link with
- it. That's all.
- [259]Sign In·[260]View Thread·[261]PermaLink
- General [262]calling convention for each method in abstract class is
- required [263]Pin member [264]chipmunk 3:13 18 Feb '09
- Great article, thanks !
- But I found out that APIENTRY macro is required for each method in
- abstract interface.
- While I used different Microsoft C++ compilers - there were all ok. But
- when I tried out MinGW and Borland C++ - method arguments were
- corrupted. Adding macros solved this problem:
-// The abstract interface for Xyz object.
-// No extra specifiers required.
-struct IXyz
-{
- virtual int APIENTRY Foo(int n) = 0; // APIENTRY is required
- virtual void APIENTRY Release() = 0; // APIENTRY is required
-};
-
- [265]Sign In·[266]View Thread·[267]PermaLink
- General [268]Re: calling convention for each method in abstract class
- is required [269]Pin member [270]Alex Blekhman 4:05 18 Feb '09
- I don't have Borland compiler handy to check this. However, if your
- compiler supports __declspec(novtable) specifier, then you may apply it
- to the IXyz interface:
-struct __declspec(novtable) IXyz
-{
- virtual int Foo(int n) = 0;
- virtual void Release() = 0;
-};
-
- Pure virtual methods should not require any exporting as long as you
- use only basic types (or interface pointers) as parameters.
- [271]Sign In·[272]View Thread·[273]PermaLink
- General [274]deriving the interface in EXE module [275]Pin member
- [276]arif.setiawan 13:28 6 Feb '09
- Hi,
- First, thank you for this great article.
- I want to know your opinion about my case.
- Suppose that I want to derive a child class from abstract interface in
- EXE module and this child class can also use then implementation of the
- interface in a class inside the dll which accessible through factory
- function. An example would be :
- I have a class:
-class IAttribute
-{
-public:
- virtual int Save(const char *filename) = 0;
- virtual int Load(const char *filename) = 0;
-protected:
- int left, right, top, bottom;
-};
-
- The actual implementation will be hidden in the dll by a class
-class CAttribute : public IAttribute
-{
- CAttribute();
- ~CAttribute();
- int Save(const char *filename);
- int Load(const char *filename);
-}
-
- which accessible by factory function GetAttribute()
- Now I want to have a class in the MFC EXE which can draw the the
- attributes, so I make a new class
-class CEntity : public IAttribute
-{
- CEntity ();
- ~CEntity ();
- void Draw(CDC* dc);
- int Save(const char *filename);
- int Load(const char *filename);
-}
-
- Since the IAttribute provide no implementation of Save() and Load(), I
- add a member pointer to the CAttribute so I can use functions defined
- in the dll.
-class CEntity : public IAttribute
-{
-public:
- CEntity ();
- ... // same as above
-private:
- IAttribute *m_pAtttibute;
-}
-
- Please tell me what your opinion about this, is this even possible? or
- not correct from OOP perspective, really a bad design, or maybe there
- is another approach that better than this.
- I am doing this to make the dll MFC-independent and in some application
- scenerio I just need to load the attribute only.
- Thank you.
- [277]Sign In·[278]View Thread·[279]PermaLink
- General [280]Re: deriving the interface in EXE module [281]Pin member
- [282]Alex Blekhman 1:27 7 Feb '09
- Hello,
- First of all, you cannot have data members in IAttribute class. Having
- data members in a class effectively makes it compiler dependent. If you
- need data members, then provide getter/setter functions:
-struct IAttribute
-{
- ...
- virtual int Left(void) const = 0;
- virtual void Left(int l) = 0;
-};
-class CAttribute : public IAttribute
-{
-public:
- // IAttribute implementation
- ...
- virtual int Left() const { return m_left; }
- virtual void Left(int l) { m_left = l; }
-private:
- int m_left;
-};
-
- Now regarding CEntity class. There is no any problem in using data
- member of type IAttribute that points to actual implementation in a
- DLL. You have two options of reusing DLL's implementation:
- 1. Containment/Delegation (forwarding calls):
-class CEntity : public IAttribute
-{
-public:
- ...
- int Save(const char *filename)
- {
- return m_pAttibute->Save(filename);
- }
- int Load(const char *filename)
- {
- return m_pAttibute->Load(filename);
- }
-};
-
- 2. Aggregation:
-class CEntity
-{
-public:
- ...
- IAttribute *GetAttribute() const { return m_pAttibute; }
-private:
- IAttribute *m_pAttibute;
-}
-
- Both methods are acceptable and quite common. Which of them is most
- suitable for your project depends on your needs.
- BTW, I'd suggest to use wide characters for filenames, so you will be
- able to handle non-English filenames, as well.
- [283]Sign In·[284]View Thread·[285]PermaLink
- General [286]Re: deriving the interface in EXE module [287]Pin member
- [288]arif.setiawan 19:35 8 Feb '09
- Thank you for your explanation.
- Smile
- [289]Sign In·[290]View Thread·[291]PermaLink
- General [292]Abstract interface - question about disadvantages [293]Pin
- member [294]mariusz102102 22:26 18 Nov '08
- You wrote: "An abstract interface method cannot return or accept a
- regular C++ object as a parameter."
- Could you explain me this limitation? What will (can) happen when I
- pass regular C++ object to interface method?
- Best regards,
- Mariusz
- [295]Sign In·[296]View Thread·[297]PermaLink
- General [298]Re: Abstract interface - question about disadvantages
- [299]Pin member [300]Alex Blekhman 23:49 18 Nov '08
- This problems stems from the binary incompatibility between C++
- compilers. When you pass a C++ object as a parameter, then teh compiler
- should know how to call necessary copy constructors, destructors, etc;
- what to do if any of this throws an exception; how to
- allocate/deallocate memory, if the object (or one of its members)
- requires that, etc. All this is compiler specific and cannot be shared
- across different compilers.
- If you want to accept C++ objects as a parameters (or return them from
- methods) then you should treat such code as a static library, which can
- be used with the same compiler only.
- [301]Sign In·[302]View Thread·[303]PermaLink 5.00/5 (1 vote)
- General [304]Importing to C# [305]Pin member [306]prodakn 11:27 10 Nov
- '08
- That is a very good explanation for the "C++ Mature Approach".
- Using this approach, would it be possible to access the C++ virtual
- method from a C# wrapper?
- [307]Sign In·[308]View Thread·[309]PermaLink
- General [310]Re: Importing to C# [311]Pin member [312]Alex Blekhman
- 12:20 10 Nov '08
- Hello,
- Unfortunately C# cannot call C++ methods (be it global function, a
- method of an abstract class or whatever). The C# programming language
- has different object layout and method calling mechanics. That's what
- Microsoft introduced C++/CLI - the C++ programming language that
- supports both native and managed programming. C++/CLI is meant to be
- the bridge between native world and .NET world.
- If you need to use existing C++ code in .NET assembly, then C++/CLI is
- the way to go. You can make a wrapper assembly with C++/CLI that calls
- native C++ internally. Then such assembly could be used from other
- managed languages. As an alternative, you can expose a C++ class with
- plain C functions, which C# knows how to call via interop.
- HTH
- Alex
- [313]Sign In·[314]View Thread·[315]PermaLink
- General [316]Re: Importing to C# [317]Pin member [318]prodakn 17:14 10
- Nov '08
- Thanks for your quick reply. I will try the wrapper assembly with
- C++/CLI.
- Edit:
- So I started looking into writing such a wrapper in C++/CLI. I'm
- relatively unfamiliar with this language, but it looks like I can
- #include the original C++ header file which uses the abstract
- interface, and implement it as I would with C++; would this be the
- route to go?
- Appreciate your help,
- Daniel
- [319]Sign In·[320]View Thread·[321]PermaLink
- General [322]Re: Importing to C# [323]Pin member [324]Alex Blekhman
- 20:55 10 Nov '08
- Yes, C++/CLI is the full featured C++ plus additional extensions that
- provide support for managed programming. The resulting code is compiled
- into CLI, not to native binaries. If you want to connect between
- existing C++ DLL and .NET assembly, then you can create a regular
- managed class, which will call native C++ DLL.
- In order to practice that, in Visual C++ go to new project wizard and
- select there Visual C++ -> CLR -> CLR Console Application. Wizard will
- generate an empty project very similar to C# console aplication. You
- can include any C++ header in that project and use native DLL's without
- any problem.
- [325]Sign In·[326]View Thread·[327]PermaLink
- General [328]unit testing [329]Pin member [330]rioch 23:03 23 Oct '08
- How would I go about unit testing classes in the dll that aren't
- exported?
- [331]Sign In·[332]View Thread·[333]PermaLink
- General [334]Re: unit testing [335]Pin member [336]Alex Blekhman 22:13
- 2 Nov '08
- Hi. Sorry for delayed response, I've been on vacation last week.
- Actually, there is nothing special about internal C++ classes that
- reside within a DLL. You, as an author of the DLL have full control
- over the source code. So, naturally, you develop test cases (using your
- favourite testing framework) for internal classes in the same manner as
- you do this for any other code you write.
- Of course, TDD approach requires that you bear in mind the testing
- process during design of software components, be it single C++ class or
- full blown DLL module. There is no simple answer to your question.
- Testing approach greatly depends on the nature of a class, its
- interdependencies with other classes, etc.
- Basically, I do similar unit tests for C++ classes within a DLL
- regardless of whether they are exported or not. As a testing framework
- I use CppUnit most of the time. Sometimes a project can require
- slightly different testing framework, which is more tuned to the needs
- of the project. Although it's a lot of a code to write for decent
- testing coverage, but it pays off nicely during acceptance period
- before releases.
- [337]Sign In·[338]View Thread·[339]PermaLink
- General [340]Re: unit testing [341]Pin member [342]rioch 3:02 5 Nov '08
-
- No problem, thanks for replying, and I hope you enjoyed your holiday!
- Smile
- I think the problem lies in that the test framework runs in a separate
- project, which includes the dll projects to be tested. Since my test
- code is in a different project, only the exported classes are visible,
- which leaves a lot of classes untestable.
- [343]Sign In·[344]View Thread·[345]PermaLink
- General [346]Re: unit testing [347]Pin member [348]Alex Blekhman 3:23 5
- Nov '08
- Engineering is all about tradeoffs. For each module/class one should
- decide where to draw a line and what to test. Ideally, we should test
- everything. It may involve some kind of a macro that will export every
- class for test configuration builds. However, in practice testing every
- single class/function can be prohibitively expensive.
- Maybe in your case testing at the module level is good enough. After
- all, as long as the module behaves as documented it is less important
- (from the test point of view) how the module is implemented inside. In
- my opinion, if you treat the module as a black box and make
- comprehensive test harness that successfully covers all functionality
- (including garbage input and extreme input), then you can assume quite
- reliably that the module is tested well enough.
- [349]Sign In·[350]View Thread·[351]PermaLink
- General [352]Re: unit testing [353]Pin member [354]rioch 1:26 26 Feb
- '09
- I'm not sure if I agree. Some of the code is gui based, but includes
- complex elements such as zooming, which is in a non-exported class.
- This zoom code is a prime candidate for unit testing, and doing this
- via the dll interface is nigh on impossible.
- I can think of two solutions:
- 1) Write test classes in the dll and export them also. These classes
- can be picked up by the test program.
- 2) Export everything (I've never been a fan of exporting classes).
- [355]Sign In·[356]View Thread·[357]PermaLink
- General [358]Re: unit testing [359]Pin member [360]Alex Blekhman 2:49
- 26 Feb '09
- There is also third option: make special build for testing. In that
- build one could export more than in regular release build etc. However,
- as I wrote in the other post, it's a matter of tradeoff.
- [361]Sign In·[362]View Thread·[363]PermaLink
- General [364]Auto-releasing with boost::shared_ptr [365]Pin member
- [366]Chris Marski 15:18 26 Sep '08
- I just wanted to point out that it is also possible to use
- boost::shared_ptr for auto-releasing:
-#include <boost/mem_fn.hpp>
-#include <boost/shared_ptr.hpp>
-boost::shared_ptr<IFoo> foo (::GetFoo (), boost::mem_fn (&IFoo::Release))
-
- (More interesting smart-pointer techniques here:
- [367]http://www.boost.org/doc/libs/release/libs/smart_ptr/sp_techniques
- .html[[368]^])
- It was a pleasure to read such a crystal-clear article. How about
- expanding it and covering other platforms like Linux or Darwin.
- [369]Sign In·[370]View Thread·[371]PermaLink
- Question [372]DLLs and exception [373]Pin member [374]Member 3843328
- 12:42 22 Sep '08
- I wonder why DLLs and exception propagation do not mix.
- Is it because including <exception> introduces a STL dependency? (I
- checked STLport 5.1.4 - it seems to include the compilers' <exception>
- only ...)
- Or do different compilers really implement exception handling
- differently? Could it be that even different compiler switches in the
- DLL and the client cause trouble?
- Roland
- [375]Sign In·[376]View Thread·[377]PermaLink
- Answer [378]Re: DLLs and exception [379]Pin member [380]Alex Blekhman
- 12:53 22 Sep '08
-
- Member 3843328 wrote:
-
- Or do different compilers really implement exception handling
- differently? Could it be that even different compiler switches in
- the DLL and the client cause trouble?
-
- Correct. This is exactly the reason.
- [381]Sign In·[382]View Thread·[383]PermaLink
- General [384]Inheritance [385]Pin member [386]NTRF 7:00 3 Sep '08
- Changing behaviour of base class in derived (using virtual functions)
- is imposible using COM-like method because base classes can not
- implement functions (in XPCOM this problem is solved using a huge and
- ugly "defines"). The "Native C++" approach solves this problem, but
- different DLLs created by different compilers might be incompatible.
- The only posible approach is to use C-like functions with "handles".
- This is exactly how IBM did class exports in their SOM (System Object
- Model).
- [387]Sign In·[388]View Thread·[389]PermaLink
- Last Visit: 0:00 27 Sep '09 Last Update: 0:00 27 Sep '09 1[390]2
- [391]Next »
-
- General General News News Question Question Answer Answer
- Joke Joke Rant Rant Admin Admin
- [392]PermaLink | [393]Privacy | [394]Terms of Use
- Last Updated: 31 Aug 2008
- Editor: [395]Smitha Vijayan
- Copyright 2008 by Alex Blekhman
- Everything else Copyright © [396]CodeProject, 1999-2009
- Web12 | [397]Advertise on the Code Project
-
-References
-
- 1. http://www.codeproject.com/webservices/articlerss.aspx?cat=1
- 2. http://www.codeproject.com/webservices/articlerss.aspx?cat=2
- 3. http://www.codeproject.com/webservices/articlerss.aspx?cat=3
- 4. http://www.codeproject.com/webservices/articlerss.aspx?cat=4
- 5. http://www.codeproject.com/webservices/articlerss.aspx?cat=5
- 6. http://www.codeproject.com/webservices/articlerss.aspx?cat=6
- 7. http://www.codeproject.com/webservices/LoungeRSS.aspx
- 8. http://www.codeproject.com/info/OpenSearch.xml
- 9. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#Main
- 10. http://www.codeproject.com/script/Membership/SendPassword.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 11. http://www.codeproject.com/
- 12. http://www.codeproject.com/
- 13. http://www.codeproject.com/script/Articles/Latest.aspx
- 14. http://www.codeproject.com/info/search.aspx
- 15. http://www.codeproject.com/script/Articles/Latest.aspx
- 16. http://www.codeproject.com/script/Articles/TopArticles.aspx?ta_so=4
- 17. http://www.codeproject.com/info/search.aspx?vidlst=152&sa_us=True
- 18. http://www.codeproject.com/script/Articles/BlogArticleList.aspx
- 19. http://www.codeproject.com/info/Submit.aspx
- 20. http://www.codeproject.com/script/Articles/BlogFeed.aspx
- 21. http://www.codeproject.com/info/Submit.aspx
- 22. http://www.codeproject.com/script/Awards/CurrentCompetitions.aspx?cmpTpId=1
- 23. http://www.codeproject.com/script/Content/SiteMap.aspx
- 24. http://www.codeproject.com/script/Forums/List.aspx
- 25. http://www.codeproject.com/Forums/12076/ASP-NET.aspx
- 26. http://www.codeproject.com/Forums/4486/ATL-WTL-STL.aspx
- 27. http://www.codeproject.com/Forums/1647/C-Cplusplus-MFC.aspx
- 28. http://www.codeproject.com/Forums/3785/Managed-Cplusplus-CLI.aspx
- 29. http://www.codeproject.com/Forums/1649/Csharp.aspx
- 30. http://www.codeproject.com/Forums/1648/COM.aspx
- 31. http://www.codeproject.com/Forums/186301/Hardware-Devices.aspx
- 32. http://www.codeproject.com/Forums/1004117/LINQ.aspx
- 33. http://www.codeproject.com/Forums/1650/NET-Framework.aspx
- 34. http://www.codeproject.com/Forums/1644/System-Admin.aspx
- 35. http://www.codeproject.com/Forums/1004257/Silverlight.aspx
- 36. http://www.codeproject.com/Forums/1725/General-Database.aspx
- 37. http://www.codeproject.com/Forums/1540733/Sharepoint.aspx
- 38. http://www.codeproject.com/Forums/1646/Visual-Basic.aspx
- 39. http://www.codeproject.com/Forums/1640/Web-Development.aspx
- 40. http://www.codeproject.com/Forums/1004114/WPF-WCF-WF.aspx
- 41. http://www.codeproject.com/Forums/3421/XML-XSL.aspx
- 42. http://www.codeproject.com/Forums/1642/General-IT-Issues.aspx
- 43. http://www.codeproject.com/Forums/1645/Site-Bugs-Suggestions.aspx
- 44. http://www.codeproject.com/Forums/1536756/The-Soapbox-2-0.aspx
- 45. http://www.codeproject.com/script/Forums/List.aspx
- 46. http://www.codeproject.com/script/Jobs/List.aspx
- 47. http://www.codeproject.com/script/Jobs/List.aspx
- 48. http://www.codeproject.com/script/Jobs/Search.aspx
- 49. http://www.codeproject.com/script/Jobs/Edit.aspx
- 50. http://www.codeproject.com/script/Jobs/FAQ.aspx
- 51. http://www.codeproject.com/script/Catalog/List.aspx
- 52. http://www.codeproject.com/script/Catalog/List.aspx?ctls=DatePostedDescending
- 53. http://www.codeproject.com/script/Catalog/List.aspx
- 54. http://www.codeproject.com/script/Catalog/Edit.aspx
- 55. http://www.codeproject.com/script/Catalog/FAQ.aspx
- 56. http://www.codeproject.com/info/FAQ.aspx
- 57. http://www.codeproject.com/info/guide.aspx
- 58. http://www.codeproject.com/info/FAQ.aspx
- 59. http://www.codeproject.com/script/Forums/List.aspx
- 60. http://www.codeproject.com/script/Content/SiteMap.aspx
- 61. http://www.codeproject.com/info/about.aspx
- 62. javascript:void();
- 63. javascript:void();
- 64. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=5
- 65. http://www.codeproject.com/KB/cpp/
- 66. http://www.codeproject.com/KB/cpp/index.aspx?#C / C++ Language - Howto
- 67. http://www.codeproject.com/info/cpol10.aspx
- 68. http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=224996
- 69. http://www.codeproject.com/Feature/ArticleCompetition/
- 70. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=1
- 71. http://www.codeproject.com/KB/buttons/
- 72. http://www.codeproject.com/KB/clipboard/
- 73. http://www.codeproject.com/KB/combobox/
- 74. http://www.codeproject.com/KB/dialog/
- 75. http://www.codeproject.com/KB/gadgets/
- 76. http://www.codeproject.com/KB/docview/
- 77. http://www.codeproject.com/KB/edit/
- 78. http://www.codeproject.com/KB/files/
- 79. http://www.codeproject.com/KB/grid/
- 80. http://www.codeproject.com/KB/list/
- 81. http://www.codeproject.com/KB/menus/
- 82. http://www.codeproject.com/KB/miscctrl/
- 83. http://www.codeproject.com/KB/printing/
- 84. http://www.codeproject.com/KB/progress/
- 85. http://www.codeproject.com/KB/selection/
- 86. http://www.codeproject.com/KB/shell/
- 87. http://www.codeproject.com/KB/smart/
- 88. http://www.codeproject.com/KB/splitter/
- 89. http://www.codeproject.com/KB/static/
- 90. http://www.codeproject.com/KB/statusbar/
- 91. http://www.codeproject.com/KB/tabs/
- 92. http://www.codeproject.com/KB/toolbars/
- 93. http://www.codeproject.com/KB/tree/
- 94. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=2
- 95. http://www.codeproject.com/KB/ajax/
- 96. http://www.codeproject.com/KB/applications/
- 97. http://www.codeproject.com/KB/asp/
- 98. http://www.codeproject.com/KB/aspnet/
- 99. http://www.codeproject.com/KB/webforms/
- 100. http://www.codeproject.com/KB/ATL-Server/
- 101. http://www.codeproject.com/KB/web-cache/
- 102. http://www.codeproject.com/KB/web-image/
- 103. http://www.codeproject.com/KB/scripting/
- 104. http://www.codeproject.com/KB/custom-controls/
- 105. http://www.codeproject.com/KB/HTML/
- 106. http://www.codeproject.com/KB/ISAPI/
- 107. http://www.codeproject.com/KB/server-management/
- 108. http://www.codeproject.com/KB/session/
- 109. http://www.codeproject.com/KB/silverlight/
- 110. http://www.codeproject.com/KB/trace/
- 111. http://www.codeproject.com/KB/user-controls/
- 112. http://www.codeproject.com/KB/validation/
- 113. http://www.codeproject.com/KB/viewstate/
- 114. http://www.codeproject.com/KB/WAP/
- 115. http://www.codeproject.com/KB/web-security/
- 116. http://www.codeproject.com/KB/webservices/
- 117. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=9
- 118. http://www.codeproject.com/KB/MCMS/
- 119. http://www.codeproject.com/KB/biztalk/
- 120. http://www.codeproject.com/KB/exchange/
- 121. http://www.codeproject.com/KB/office/
- 122. http://www.codeproject.com/KB/sharepoint/
- 123. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=3
- 124. http://www.codeproject.com/KB/audio-video/
- 125. http://www.codeproject.com/KB/directx/
- 126. http://www.codeproject.com/KB/GDI/
- 127. http://www.codeproject.com/KB/GDI-plus/
- 128. http://www.codeproject.com/KB/graphics/
- 129. http://www.codeproject.com/KB/openGL/
- 130. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=4
- 131. http://www.codeproject.com/KB/database/
- 132. http://www.codeproject.com/KB/reporting-services/
- 133. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=8
- 134. http://www.codeproject.com/KB/atl/
- 135. http://www.codeproject.com/KB/MFC/
- 136. http://www.codeproject.com/KB/stl/
- 137. http://www.codeproject.com/KB/wtl/
- 138. http://www.codeproject.com/KB/COM/
- 139. http://www.codeproject.com/KB/dotnet/
- 140. http://www.codeproject.com/KB/winsdk/
- 141. http://www.codeproject.com/KB/vista/
- 142. http://www.codeproject.com/KB/vista-security/
- 143. http://www.codeproject.com/KB/cross-platform/
- 144. http://www.codeproject.com/KB/game/
- 145. http://www.codeproject.com/KB/mobile/
- 146. http://www.codeproject.com/KB/WC/
- 147. http://www.codeproject.com/KB/WCF/
- 148. http://www.codeproject.com/KB/WPF/
- 149. http://www.codeproject.com/KB/WF/
- 150. http://www.codeproject.com/KB/library/
- 151. http://www.codeproject.com/KB/powershell/
- 152. http://www.codeproject.com/KB/linq/
- 153. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=5
- 154. http://www.codeproject.com/KB/cpp/
- 155. http://www.codeproject.com/KB/mcpp/
- 156. http://www.codeproject.com/KB/cs/
- 157. http://www.codeproject.com/KB/msil/
- 158. http://www.codeproject.com/KB/vbscript/
- 159. http://www.codeproject.com/KB/vb/
- 160. http://www.codeproject.com/KB/vb-interop/
- 161. http://www.codeproject.com/KB/net-languages/
- 162. http://www.codeproject.com/KB/XML/
- 163. http://www.codeproject.com/KB/java/
- 164. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=6
- 165. http://www.codeproject.com/KB/recipes/
- 166. http://www.codeproject.com/KB/bugs/
- 167. http://www.codeproject.com/KB/collections/
- 168. http://www.codeproject.com/KB/security/
- 169. http://www.codeproject.com/KB/datetime/
- 170. http://www.codeproject.com/KB/DLL/
- 171. http://www.codeproject.com/KB/exception/
- 172. http://www.codeproject.com/KB/locale/
- 173. http://www.codeproject.com/KB/macros/
- 174. http://www.codeproject.com/KB/tips/
- 175. http://www.codeproject.com/KB/string/
- 176. http://www.codeproject.com/KB/IP/
- 177. http://www.codeproject.com/KB/threads/
- 178. http://www.codeproject.com/KB/winhelp/
- 179. http://www.codeproject.com/KB/FAQ/
- 180. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=10
- 181. http://www.codeproject.com/KB/expression/
- 182. http://www.codeproject.com/KB/usability/
- 183. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=11
- 184. http://www.codeproject.com/KB/debug/
- 185. http://www.codeproject.com/KB/architecture/
- 186. http://www.codeproject.com/KB/install/
- 187. http://www.codeproject.com/KB/work/
- 188. http://www.codeproject.com/KB/testing/
- 189. http://www.codeproject.com/KB/codegen/
- 190. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=7
- 191. http://www.codeproject.com/KB/books/
- 192. http://www.codeproject.com/KB/book-reviews/
- 193. http://www.codeproject.com/KB/hardware-review/
- 194. http://www.codeproject.com/KB/interviews/
- 195. http://www.codeproject.com/KB/scrapbook/
- 196. http://www.codeproject.com/KB/system/
- 197. http://www.codeproject.com/KB/Blogs/
- 198. http://www.codeproject.com/KB/mentor/
- 199. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=12
- 200. http://www.codeproject.com/KB/showcase/
- 201. http://www.codeproject.com/KB/solution-center/
- 202. http://www.codeproject.com/script/Content/Chapter.aspx?chptId=13
- 203. http://www.codeproject.com/script/Catalog/List.aspx
- 204. http://www.codeproject.com/services/certificates/index.aspx
- 205. http://www.codeproject.com/script/Jobs/List.aspx
- 206. http://www.codeproject.com/Services/Addins/
- 207. http://www.codeproject.com/kb/Showcase/
- 208. http://www.codeproject.com/info/search.aspx
- 209. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?display=Print
- 210. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 211. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#_comments
- 212. http://www.codeproject.com/script/Articles/Report.aspx?aid=28969
- 213. http://www.codeproject.com/script/Articles/TopArticles.aspx?ta_so=1
- 214. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes/XyzSample_src.zip
- 215. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#Introduction
- 216. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#CLanguageApproach
- 217. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#CppNaiveApproach
- 218. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#CppMatureApproach
- 219. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#WhatAboutSTL
- 220. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#Summary
- 221. http://www.dependencywalker.com/
- 222. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes/Xyz.png
- 223. http://en.wikipedia.org/wiki/RAII
- 224. http://www.codeproject.com/info/cpol10.aspx
- 225. http://www.codeproject.com/Members/Alex-Blekhman
- 226. http://www.codeproject.com/KB/cpp/FastDelegate.aspx
- 227. http://www.codeproject.com/KB/cpp/exceptionhandler.aspx
- 228. http://www.codeproject.com/KB/cpp/pointers.aspx
- 229. http://www.codeproject.com/KB/cpp/markupclass.aspx
- 230. http://www.codeproject.com/KB/cpp/pugxml.aspx
- 231. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#_top
- 232. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx#SignUp
- 233. http://www.codeproject.com/script/Adm/ServeLinks.aspx?C=False&ids=10693,5226,8560
- 234. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx%3ffid%3d1525934%26df%3d90%26mpp%3d25%26noise%3d3%26sort%3dPosition%26view%3dQuick
- 235. http://www.codeproject.com/script/Forums/FAQ.aspx
- 236. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&noise=3&sort=Position&view=Quick
- 237. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx
- 238. http://www.codeproject.com/Messages/3047719/source-file-path-in-cplusplus.aspx
- 239. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 240. http://www.codeproject.com/script/Membership/View.aspx?mid=112271
- 241. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 242. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=3047719
- 243. http://www.codeproject.com/Messages/3047719/source-file-path-in-cplusplus.aspx
- 244. http://www.codeproject.com/Messages/3047926/Re-source-file-path-in-cplusplus.aspx
- 245. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 246. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 247. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 248. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=3047719
- 249. http://www.codeproject.com/Messages/3047926/Re-source-file-path-in-cplusplus.aspx
- 250. http://www.codeproject.com/Messages/2974529/Static-library.aspx
- 251. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 252. http://www.codeproject.com/script/Membership/View.aspx?mid=67130
- 253. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 254. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2974529
- 255. http://www.codeproject.com/Messages/2974529/Static-library.aspx
- 256. http://www.codeproject.com/Messages/2974746/Re-Static-library.aspx
- 257. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 258. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 259. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 260. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2974529
- 261. http://www.codeproject.com/Messages/2974746/Re-Static-library.aspx
- 262. http://www.codeproject.com/Messages/2929651/calling-convention-for-each-method-in-abstract-cla.aspx
- 263. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 264. http://www.codeproject.com/script/Membership/View.aspx?mid=3796799
- 265. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 266. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2929651
- 267. http://www.codeproject.com/Messages/2929651/calling-convention-for-each-method-in-abstract-cla.aspx
- 268. http://www.codeproject.com/Messages/2929769/Re-calling-convention-for-each-method-in-abstract-.aspx
- 269. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 270. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 271. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 272. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2929651
- 273. http://www.codeproject.com/Messages/2929769/Re-calling-convention-for-each-method-in-abstract-.aspx
- 274. http://www.codeproject.com/Messages/2914580/deriving-the-interface-in-EXE-module.aspx
- 275. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 276. http://www.codeproject.com/script/Membership/View.aspx?mid=481877
- 277. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 278. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2914580
- 279. http://www.codeproject.com/Messages/2914580/deriving-the-interface-in-EXE-module.aspx
- 280. http://www.codeproject.com/Messages/2914888/Re-deriving-the-interface-in-EXE-module.aspx
- 281. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 282. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 283. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 284. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2914580
- 285. http://www.codeproject.com/Messages/2914888/Re-deriving-the-interface-in-EXE-module.aspx
- 286. http://www.codeproject.com/Messages/2916069/Re-deriving-the-interface-in-EXE-module.aspx
- 287. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 288. http://www.codeproject.com/script/Membership/View.aspx?mid=481877
- 289. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 290. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2914580
- 291. http://www.codeproject.com/Messages/2916069/Re-deriving-the-interface-in-EXE-module.aspx
- 292. http://www.codeproject.com/Messages/2811832/Abstract-interface-question-about-disadvantages.aspx
- 293. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 294. http://www.codeproject.com/script/Membership/View.aspx?mid=1524771
- 295. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 296. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2811832
- 297. http://www.codeproject.com/Messages/2811832/Abstract-interface-question-about-disadvantages.aspx
- 298. http://www.codeproject.com/Messages/2811922/Re-Abstract-interface-question-about-disadvantages.aspx
- 299. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 300. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 301. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 302. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2811832
- 303. http://www.codeproject.com/Messages/2811922/Re-Abstract-interface-question-about-disadvantages.aspx
- 304. http://www.codeproject.com/Messages/2800995/Importing-to-Csharp.aspx
- 305. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 306. http://www.codeproject.com/script/Membership/View.aspx?mid=5681852
- 307. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 308. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2800995
- 309. http://www.codeproject.com/Messages/2800995/Importing-to-Csharp.aspx
- 310. http://www.codeproject.com/Messages/2801060/Re-Importing-to-Csharp.aspx
- 311. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 312. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 313. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 314. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2800995
- 315. http://www.codeproject.com/Messages/2801060/Re-Importing-to-Csharp.aspx
- 316. http://www.codeproject.com/Messages/2801252/Re-Importing-to-Csharp.aspx
- 317. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 318. http://www.codeproject.com/script/Membership/View.aspx?mid=5681852
- 319. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 320. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2800995
- 321. http://www.codeproject.com/Messages/2801252/Re-Importing-to-Csharp.aspx
- 322. http://www.codeproject.com/Messages/2801428/Re-Importing-to-Csharp.aspx
- 323. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 324. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 325. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 326. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2800995
- 327. http://www.codeproject.com/Messages/2801428/Re-Importing-to-Csharp.aspx
- 328. http://www.codeproject.com/Messages/2778527/unit-testing.aspx
- 329. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 330. http://www.codeproject.com/script/Membership/View.aspx?mid=4264334
- 331. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 332. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2778527
- 333. http://www.codeproject.com/Messages/2778527/unit-testing.aspx
- 334. http://www.codeproject.com/Messages/2790557/Re-unit-testing.aspx
- 335. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 336. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 337. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 338. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2778527
- 339. http://www.codeproject.com/Messages/2790557/Re-unit-testing.aspx
- 340. http://www.codeproject.com/Messages/2794531/Re-unit-testing.aspx
- 341. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 342. http://www.codeproject.com/script/Membership/View.aspx?mid=4264334
- 343. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 344. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2778527
- 345. http://www.codeproject.com/Messages/2794531/Re-unit-testing.aspx
- 346. http://www.codeproject.com/Messages/2794568/Re-unit-testing.aspx
- 347. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 348. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 349. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 350. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2778527
- 351. http://www.codeproject.com/Messages/2794568/Re-unit-testing.aspx
- 352. http://www.codeproject.com/Messages/2940572/Re-unit-testing.aspx
- 353. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 354. http://www.codeproject.com/script/Membership/View.aspx?mid=4264334
- 355. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 356. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2778527
- 357. http://www.codeproject.com/Messages/2940572/Re-unit-testing.aspx
- 358. http://www.codeproject.com/Messages/2940688/Re-unit-testing.aspx
- 359. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 360. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 361. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 362. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2778527
- 363. http://www.codeproject.com/Messages/2940688/Re-unit-testing.aspx
- 364. http://www.codeproject.com/Messages/2741752/Auto-releasing-with-boost-shared_ptr.aspx
- 365. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 366. http://www.codeproject.com/script/Membership/View.aspx?mid=811855
- 367. http://www.boost.org/doc/libs/release/libs/smart_ptr/sp_techniques.html
- 368. http://www.boost.org/doc/libs/release/libs/smart_ptr/sp_techniques.html
- 369. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 370. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2741752
- 371. http://www.codeproject.com/Messages/2741752/Auto-releasing-with-boost-shared_ptr.aspx
- 372. http://www.codeproject.com/Messages/2734948/DLLs-and-exception.aspx
- 373. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 374. http://www.codeproject.com/script/Membership/View.aspx?mid=3843328
- 375. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 376. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2734948
- 377. http://www.codeproject.com/Messages/2734948/DLLs-and-exception.aspx
- 378. http://www.codeproject.com/Messages/2734964/Re-DLLs-and-exception.aspx
- 379. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 380. http://www.codeproject.com/script/Membership/View.aspx?mid=224996
- 381. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 382. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2734948
- 383. http://www.codeproject.com/Messages/2734964/Re-DLLs-and-exception.aspx
- 384. http://www.codeproject.com/Messages/2706638/Inheritance.aspx
- 385. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
- 386. http://www.codeproject.com/script/Membership/View.aspx?mid=3932000
- 387. http://www.codeproject.com/script/Membership/LogOn.aspx?rp=%2fKB%2fcpp%2fhowto_export_cpp_classes.aspx
- 388. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&sort=Position&tid=2706638
- 389. http://www.codeproject.com/Messages/2706638/Inheritance.aspx
- 390. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx
- 391. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx?fid=1525934&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx
- 392. http://www.codeproject.com/script/Articles/Article.aspx?aid=28969
- 393. http://www.codeproject.com/info/privacy.aspx
- 394. http://www.codeproject.com/info/TermsOfUse.aspx
- 395. http://www.codeproject.com/script/Membership/View.aspx?mid=28970
- 396. mailto:webmaster@codeproject.com
- 397. http://www.codeproject.com/info/MediaKit.aspx