Linking to proprietary C++ library in old ABI format using gc c-3. 2
Eljay Love-Jensen
eljay@adobe.com
Thu Dec 11 13:27:00 GMT 2003
Hi Nic,
>How would this thunk layer work ?
The C-ABI thunk layer acts as a bridge from the disparate C++-ABI's of 2.95 and 3.2.
The effect:
[1] <--> [2] <--> [3] <--> [4]
1) C++ 2.95 library
2) C thunk library
3) C++ 3.2 facade library
4) your application
>The first thing our product architect asked me is what would happen if their were any static initializers in the library being thunked ?
The static initializers should still get called when the library is loaded. Like normal.
>How does one even get at a C++ object from C ?
namespace Database
{
class Foo
{
int m;
public:
Foo() : m(0) { }
void reset(int i) { m = i; }
... };
}
- - - - - - - - - - - - - - - -
// C-ABI thunk layer knows about the Database namespace, but does not expose the Database namespace.
extern "C" void* NewFoo();
extern "C" void FooReset(void* p, int i);
extern "C" int GetError();
- - - - - - - - - - - - - - - -
static int gError = 0;
// Foo factory.
void* NewFoo()
{
try
{
Foo* foo = new Foo;
}
catch(...)
{
// You'd want something a little more robust than this.
gError = 1;
}
}
// Thunk for Foo's reset method.
void FooReset(void* p, int i)
{
Foo* foo = (Foo*)p;
foo->reset(i);
}
// Exception helper.
int GetError()
{
return gError;
}
- - - - - - - - - - - - - - - -
namespace Facade
{
struct ThunkError { };
class Foo
{
void* foo;
public:
Foo();
void reset(int i);
};
Foo::Foo()
: foo(NewFoo())
{
if(GetError()) throw ThunkError;
}
void Foo::reset(int i)
{
FooReset(foo, i);
if(GetError()) throw ThunkError;
}
}
- - - - - - - - - - - - - - - -
Each database class would need it's own Facade (or proxy) counterpart.
Each method and constructor (that you utilize) would need a C-ABI thunk routine.
It's not actually very hard to do; but it is a lot of rote work.
The jagged edge is making sure you handle exceptions correctly (usefully). And remember: exceptions CANNOT pass through a C-ABI barrier!
HTH,
--Eljay
More information about the Gcc-help
mailing list