Microsoft KB Archive/157919

= Building an ODS application with MFC =

Article ID: 157919

Article Last Modified on 5/9/2006

-

APPLIES TO


 * Microsoft SQL Server 4.21a Standard Edition
 * Microsoft SQL Server 6.0 Standard Edition
 * Microsoft SQL Server 6.5 Standard Edition

-



This article was previously published under Q157919



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.

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

#ifdef __cplusplus extern "C" { #endif

#include 

#ifdef __cplusplus }        #endif

  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; }

  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 }  extern "C" {
 * 1) ifdef __cplusplus
 * 1) 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; }  }
 * 1) ifdef __cplusplus
 * 1) endif

Keywords: kbhowto kbprogramming kbusage KB157919

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.