I am using root 3.03/9a (and have tried root 3.04/2 for this purpose - same
problem)
on Win2k. I have an object that derives from TObject that I write to a root
file
using a stand-alone application build with VC++ 6.0. When I open and read
the root
file from the root program itself and try
root [] .L mystuff.dll
root [] obj->Inspect()
where mystuff.dll is the same dll I used to generate the object - built
using
rootcint+linkdef file. A window breifly appears, than disappears and I get
an error:
Error: C++ exception caught FILE:C:\DOCUME~1\eoltman\LOCALS~1\Temp\67 LINE:1
*** Interpreter error recovered ***
However, if I perform
root [] obj->Dump()
the object data displays properly. Any ideas what might be going on would
be
be greatly appreciated. Thanks
Ed Oltman
Some details:
mystuff.dll was made as a Win32 DLL: it consists of 2 classes: A and B. B
derive
from TObject and the "obj" that appears above is an instance of B. Class A
has
a member variable of type B*. A is exported/imported using the normal
windows scheme:
class __declspec(dllexport) A
{
.
. B *fObj
.
};
When I build the Win32 DLL project, I include dict.cpp, dict.h that are made
with
rootcint -f dict.cpp -c B.h linkdef.h
where linkdef.h looks like:
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class B-;
#endif
and I supplied my own streamer:
void B::Streamer(TBuffer &R__b)
{
// Stream an object of class B.
UInt_t R__s, R__c;
if (R__b.IsReading()) {
Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
TObject::Streamer(R__b);
.
.
R__b.CheckByteCount(R__s, R__c, B::IsA());
} else {
R__c = R__b.WriteVersion(CRunHeader::IsA(), kTRUE);
TObject::Streamer(R__b);
.
.
R__b.SetByteCount(R__c, kTRUE);
}
}
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:08 MET