Problem about IFeatureReader & IFeatureReaderImp in Managed FDO

Xuewei Ren xren at hannastrategies.com
Wed Sep 6 03:58:12 EDT 2006


In function XmlSerialize, can you pass reader argument that is the
instance of IFeatureReaderImpl? You mentioned that you implemented
IFeatureReader called MyFeatureReader. You must have passed the instance
of your own class as the reader argument in this function. I believe
that causes the problem. From the code, we can find out that this
function assumes that IFeatureReaderImpl is the only implementation for
IFeatureReader. Because of this assumption, the original code did the
static_cast from IFeatureReader to IFeatureReaderImpl. This is actually
not correct. Hope this can be corrected soon.

 

The workaround might be to pass an instance of IFeatureReaderImpl for
the reader argument.

 

Cheers,

 

Xuewei

 

 

________________________________

From: song yafeng-Heman [mailto:yfsong at hslcn.com] 
Sent: Tuesday, September 05, 2006 9:38 PM
To: dev at fdo.osgeo.org
Cc: Xuewei Ren; xue kai-Constantine
Subject: Problem about IFeatureReader & IFeatureReaderImp in Managed FDO

 

Hi everyone.

 

I met a problem about IFeatureReader when I was writing C# code.

I rewrite the class MyFeatureReader derived from IFeatureReader in C#
which is the same as the class in GmlWriteTest.cpp in unit test of FDO
with the same name.

Then I use XmlFeatureSerializer.XmlSerialize(featureReader,
featureWriter, flags), but always meet errors.

I debug in the mgFdo, find error occurs here (in the red).

 

[code]

System::Void
NAMESPACE_FDO_XML::XmlFeatureSerializer::XmlSerialize(NAMESPACE_FDO_COMM
ANDS_FEATURE::IFeatureReader* reader,
NAMESPACE_FDO_XML::XmlFeatureWriter* writer,
NAMESPACE_FDO_XML::XmlFeatureFlags* flags)

{

//The original code.

 
//EXCEPTION_HANDLER(FdoXmlFeatureSerializer::XmlSerialize(static_cast<NA
MESPACE_FDO_COMMANDS_FEATURE::IFeatureReaderImp*>(reader)->GetImpObj(),
writer->GetImpObj(), flags->GetImpObj()))               

 

//The full code same as the original code

         NAMESPACE_FDO_COMMANDS_FEATURE::IFeatureReaderImp* readerImp =
static_cast<NAMESPACE_FDO_COMMANDS_FEATURE::IFeatureReaderImp*>(reader);

         GisPtr<FdoIFeatureReader> uReader = readerImp->GetImpObj();

         GisPtr<FdoXmlFeatureWriter> uWriter = writer->GetImpObj();

         GisPtr<FdoXmlFeatureFlags> uFlags = flags->GetImpObj();

         try 

         { 

                   FdoXmlFeatureSerializer::XmlSerialize(uReader,
uWriter, uFlags); 

         } 

         catch(GisException* e) 

         { 

                   NAMESPACE_COMMON::Exception* mgE =
NAMESPACE_COMMON::Exception::Create(e); 

                   e->Release(); 

                   throw mgE; 

         }

}

[/code]

 

Because the reader is derived from IFearureReader, cast it to a
IFeatureReaderImp is not a right operation. Then use GetImpObj() will
get wrong pointer. This wrong point cause the error later.  

 

Is this a bug or I make some mistakes in my code?

 

A bit of help would be greatly appreciated.

Thanks

 

Kino

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/fdo_dev/attachments/20060906/8ad5e950/attachment.html


More information about the Fdo_dev mailing list