Since methods in a C component must be implemented as C functions, you must code C wrappers for C++ classes.
EAServer provides direct support for running C++ classes as components, as described in Chapter 14, “Creating CORBA C++ Components.” Sybase supports the technique described here, but recommends that you create a C++ component to run your C++ classes directly.
The procedure for creating a wrapper for a C++ class is as follows:
Code a C create function that instantiates the C++ object and stores the object reference as instance-specific data. For example, if the C++ object is StockTrade, create could be implemented as follows:
CS_RETCODE CS_PUBLIC create() {
StockTrade *st_ref;
/* ** Create an instance of the C++ ** StockTrade object. */ st_ref = new StockTrade();
/* ** Associate it with the EAServer component ** instance. */ if (JagSetInstanceData((CS_VOID *)st_ref) != CS_SUCCEED) { return CS_FAIL; }
return CS_SUCCEED;
}
For each C++ method, code a C wrapper function that retrieves the C++ object reference and uses it to call the C++ method. For example, the following shows a C wrapper to call a StockTrade::buyStock C++ method:
CS_RETCODE CS_PUBLIC buyStock ( CS_CHAR *ticker, CS_INT n_desired, CS_INT n_bought) { StockTrade *st_ref; if (JagGetInstanceData((CS_VOID *)&st_ref) != CS_SUCCEED) { return CS_FAIL; } st_ref::buyStock(ticker, n_desired, n_bought); return; }
Code a destroy function that retrieves the C++ object reference and destroys it. For example:
CS_RETCODE CS_PUBLIC destroy() { StockTrade *st_ref; if (JagGetInstanceData((CS_VOID *)&st_ref) != CS_SUCCEED) { return CS_FAIL; }
delete st_ref; return CS_SUCCEED;
}
Define the EAServer C component to include the C wrapper functions as its methods.
Copyright © 2005. Sybase Inc. All rights reserved. |