INF: Building an ODS Application with MFC
ID: Q157919
|
The information in this article applies to:
-
Microsoft SQL Server versions 4.2x, 6.0, 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.
- Wrap the following code around the include of the Srv.h header file:
#ifdef __cplusplus
extern "C" {
#endif
#include <srv.h>
#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
}
#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
Keywords : kbprg kbusage SSrvODS SSrvProg
Version : 4.21 6.0 6.5
Platform : WINDOWS
Issue type : kbhowto
|