INF: Building an ODS Application with MFC

Last reviewed: April 9, 1997
Article ID: Q157919
The information in this article applies to:
  • Microsoft SQL Server, versions 4.21a, 6.0, and 6.5

SUMMARY

This article describes the steps necessary to build an ODS application using MFC. The major issue is that without the _cdecl specifications, the C++ compiler cannot locate the standard C API calls.

  1. Wrap the following code around the include of the Srv.h header file:

             #ifdef __cplusplus
                extern "C" {
             #endif
    
          #include <srv.h>
    
             #ifdef __cplusplus
                }
             #endif
    
    

  2. If you are developing a non-console application, you should start a separate thread to call srv_start. This frees the main thread to handle Windows message processing activity. The following lines provide a small example:

          DWORD dwThread =  0;
    

          hThread = CreateThread(NULL, 0 ,
    
    (LPTHREAD_START_ROUTINE)iServerRunThread, NULL, 0, &dwThread);

          if(!hThread)
    
             ... Error processing ...
    
          int iServerRunThread(void)
          {
             srv_run(pDlg->pserver);
             return 1;
          }
    
    

  3. Cast your calls to install event handlers as shown by the following:

          srv_handle(pserver, SRV_START, (int (__cdecl *)(void *))
    
             iODSEventHandler);
    
    
    
The following lines are examples of code:

BOOL CODSSampleDlg::OnInitDialog() {

   CDialog::OnInitDialog();

   pDlg = this;

   // Add "About..." menu item to system menu.

   // IDM_ABOUTBOX must be in the system command range.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);

   CMenu* pSysMenu = GetSystemMenu(FALSE);
   CString strAboutMenu;
   strAboutMenu.LoadString(IDS_ABOUTBOX);
   if (!strAboutMenu.IsEmpty())
   {
      pSysMenu->AppendMenu(MF_SEPARATOR);
      pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
   }

   // Set the icon for this dialog.  The framework does this automatically
   //  when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);       // Set big icon
   SetIcon(m_hIcon, FALSE);      // Set small icon


   // ************************************************
   //    BEGIN:   ODS Code Initialization
   // ************************************************
   if(pconfig = srv_config_alloc())
   {
      if(srv_config(pconfig, SRV_ANSI_CODEPAGE, "TRUE", SRV_NULLTERM) ==
SUCCEED)
      {
         if(srv_config(pconfig, SRV_MINWORKINGTHREADS, "10", SRV_NULLTERM)
== SUCCEED)
         {
            if(srv_config(pconfig, SRV_MAXWORKINGTHREADS, "25",
SRV_NULLTERM) == SUCCEED)
            {
               if(srv_config(pconfig, SRV_THREADTIMEOUT, "1", SRV_NULLTERM)
== SUCCEED)
               {
                  srv_errhandle(iODSErrorHandler);

                  if(pserver = (PSRV_SERVER) srv_init(pconfig, "ODS",
SRV_NULLTERM))
                  {
                     vAddLine(">>> ODS Sample Starting.");

                     srv_handle(pserver, SRV_START, (int (__cdecl *)(void
*))iODSEventHandler);

                     //
                     // Lets get things started
                     //
                     DWORD dwThread =  0;

                     hThread = CreateThread(NULL, 0 ,
(LPTHREAD_START_ROUTINE)iServerRunThread, NULL, 0, &dwThread);
                     if(!hThread)
                        vAddLine("*** attempt to start ODS server thread
failed.");

                  }
                  else
                     vAddLine("*** attempt to initialize server failed.");
               }
               else
                  vAddLine("*** attempt to set thread timeout failed.");
            }
            else
               vAddLine("*** attempt to set max worker threads failed.");
         }
         else
            vAddLine("*** attempt to set min worker threads failed.");
      }
      else
         vAddLine("*** attempt to set ANSI codepage failed.");
   }
   else
      vAddLine("*** srv_config_alloc() failed.");


   // ************************************************
   //    END:  ODS Code Initialization
   // ************************************************


   return TRUE;  // return TRUE  unless you set the focus to a control
}

#ifdef __cplusplus

   extern "C" {
#endif

//
//    ODS Handlers
//
int iODSErrorHandler(PSRV_SERVER pserver, PSRV_PROC psrvproc, int iErrorNo,
BYTE bSeverity,
                BYTE bState, int iOSErrorNo, DBCHAR * strError, int
iErrorLen, DBCHAR *strOSError, int iOSErrorLen) {
   CString     cstrError;
   int   iRc = SRV_CONTINUE;

    pDlg->vAddLine("");

   cstrError.Format("*** OS Error %d: %s.", iOSErrorNo, strOSError);
   pDlg->vAddLine((LPCTSTR)cstrError);

   cstrError.Format("*** Error: (%d) Sev: (%d) State: (%d) %s.", iErrorNo,
bSeverity, bState, strError);
   pDlg->vAddLine((LPCTSTR)cstrError);

   pDlg->vAddLine("");

    return iRc;
}

int iODSEventHandler(PSRV_SERVER pserver)
{

   pDlg->vAddLine(">>> SRV_START called.");

   //
   //    Setup ODS handlers
   //
   srv_handle(pserver, SRV_CONNECT, (int (__cdecl *)(void *))
iConnectionHandler);
   //   srv_handle(pserver, SRV_LANGUAGE, iLangExecHandler);
   //   srv_handle(pserver, SRV_DISCONNECT, iExitConnectHandler);
   //   srv_handle(pserver, SRV_ATTENTION, iAttentionHandler);


    return(SRV_CONTINUE);
}

int iServerRunThread(void)
{
   srv_run(pDlg->pserver);

   return 1;
}

int iConnectionHandler(PSRV_PROC psrvproc)
{
   CString     cstrData;

    EnterCriticalSection(&pDlg->csSync);


   cstrData.Format(">>> User name ............ \"%s\"",
srv_pfield(psrvproc, SRV_USER, NULL));
   pDlg->vAddLine((LPCTSTR)cstrData);

   cstrData.Format(">>> Password ............. \"%s\"",
srv_pfield(psrvproc, SRV_PWD, NULL));
   pDlg->vAddLine((LPCTSTR)cstrData);

   LeaveCriticalSection(&pDlg->csSync);

    return SRV_DISCONNECT;
}

#ifdef __cplusplus

   }
#endif


Additional query words:
Keywords : kbprg kbusage SSrvODS SSrvProg
Version : 4.21 6.0 6.5
Platform : WINDOWS
Issue type : kbhowto


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: April 9, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.