CDK: Writing VBXs in C++ or Large Memory Model

Last reviewed: July 20, 1995
Article ID: Q119672
The information in this article applies to:
  • Standard and Professional Editions of Microsoft Visual Basic for Windows version 3.0

SUMMARY

The Visual Basic custom control (VBX) architecture assumes that a controls model structure and related data structures will be in the default data segment for the VBX. This means that controls developed with the control development kit (CDK) for Visual Basic should be compiled either through the medium-memory model or with an explicit NEAR declaration on the appropriate data structures. Failure to declare variables with an explicit NEAR declaration will result in the following error:

   Cannot Load VBX

MORE INFORMATION

Visual Basic expects that the model structure will reside in the default data segment for the VBX and that all pointers in the model structure will be near pointers. When you use the medium-memory model to compile, pointers are near by default. If you need to compile using another memory model that does not assume near pointers, then you need to force the compiler to generate near addresses for your property list, event list, and model structure. You can do this by putting the NEAR keyword in the corresponding declarations. Below is a code fragment taken from the Circ1 sample:

   PPROPINFO Circle_Properties[] =
       {
       PPROPINFO_STD_CTLNAME,
       ...

   PEVENTINFO Circle_Events[] =
       {
       PEVENTINFO_STD_CLICK,
       ...

   MODEL modelCircle =
       {
       VB_VERSION,         // VB version being used
       ...

Because there are no specific NEAR/FAR declarations in the above examples, the compiler will use the default for the given memory model. You can, however, force these pointers to be NEAR by specifying NEAR in the declaration:

   PPROPINFO NEAR Circle_Properties[] =
       {
       PPROPINFO_STD_CTLNAME,
       ...

   PEVENTINFO NEAR Circle_Events[] =
       {
       PEVENTINFO_STD_CLICK,
       ...

   char NEAR szCircle[] = "Circle";   // Must be NEAR
   char NEAR szCirc1[] = "CIRC1";     // Must be NEAR

   MODEL NEAR modelCircle =           // Must be NEAR
       {
       VB_VERSION,                    // VB version being used
       0,                             // MODEL flags
       (PCTLPROC)CircleCtlProc,       // Control procedure
       CS_VREDRAW | CS_HREDRAW,       // Class style
       WS_BORDER,                     // Default Windows style
       0,                             // Size of CIRCLE structure
       IDBMP_CIRCLE,                  // Palette bitmap ID
       szCircle,                      // Default control name
       szCirc1,                       // Visual Basic class name
       NULL,                          // Parent class name
       Circle_Properties,             // Property information table
       Circle_Events,                 // Event information table
       IPROP_CIRCLE_HEIGHT,           // Default property
       IEVENT_CIRCLE_CLICK,           // Default event
       -1                             // Property representing value of ctl
       };

Now, even if you compile with another memory model that does not default to near pointers, near pointers will be generated for these constructs.

Additionally, if you have custom properties or custom events, you will need to declare them as "near" also. Below is an example custom property taken from Circ3:

   PROPINFO Property_CircleShape =
       {
       "CircleShape",
       ...

However, it too must be modified as follows:

   char NEAR szCircleProperty[] = "CircleShape";

   PROPINFO NEAR Property_CircleShape =
       {
       szCircleProperty,
       ...


Additional reference words: 3.00
KBCategory: kbtool kbprg kbcode
KBSubcategory: TlsCdk


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 20, 1995
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.