Hi Mikhail, Thanks for your reply and I hope you had a good vocation. :-)
I implemented XTempFile_createInstance and createServiceFactory_Static following your suggestion but encountered an error. Could you have a look at it and give me some advice? I keep running into type conversion problems these days. :-[ PS: Thank you Michel, I will check the hidden class dependency thing out in my spare time. :-) Best Regards, Felix. Mikhail Voitenko 写道: > Hi Felix, > > The creation of the context seems to cause the problem. I suppose, that > the assertion in this situation means that the storage could not be > created, and a temporary storage object can not be created without this > service. > > I would suggest to try the following to get rid of the assertion: > > 1) Please implement XTempFile_createInstance in following way: > > css::uno::Reference< css::uno::XInterface > SAL_CALL > XTempFile_createInstance( > css::uno::Reference< css::uno::XComponentContext > const & context) > SAL_THROW((css::uno::Exception)) > { > return static_cast< cppu::OWeakObject * >(new > OTempFileService(context)); > } > > 2) Please implement createServiceFactory_Static in the following way: > > ::css::uno::Reference < ::css::lang::XSingleServiceFactory > > OTempFileService::createServiceFactory_Static( ::css::uno::Reference < > ::css::lang::XMultiServiceFactory > const & rServiceFactory ) > { > return cppu::createSingleComponentFactory ( XTempFile_createInstance, > getImplementationName_Static(), getSupportedServiceNames_Static()); > } > > So the creation of the object looks to be close to the creation in the > "Full" class implementation in the tests for the OPropertySerMixin. > > The difference to the old-style creation is that now the > createSingleComponentFactory helper method is used, and this method let > the first provided function pointer be called with the correct context > while creating an object. We can discuss the details on the next meeting. > > Best Regards, > Mikhail. > > > > Zhang Xiaofei wrote: > >> Hello Mr. Loiseleur, >> >> Thank you very much for your suggestions, it seems that the second >> problem was caused by a parameter disorder, it is gone after I adjusted >> the statements >> -from- >> OTempFileService::getTypes( ) >> { >> ... >> static ::cppu::OTypeCollection aTypeCollection( >> OTempFileBase::getTypes(), >> ::getCppuType( ( const ::css::uno::Reference< ::css::beans::XPropertySet >> >>> *)NULL ) ); >>> >> ... >> } >> -to- >> OTempFileService::getTypes( ) >> { >> ... >> static ::cppu::OTypeCollection aTypeCollection( >> ::getCppuType( ( const ::css::uno::Reference< ::css::beans::XPropertySet >> >>> *)NULL ), >>> >> OTempFileBase::getTypes() ); >> ... >> } >> >> The first one is a bit more complex, I looked up the definition of class >> PropertySetMixin() and did the following changes: >> 1. In XTempFile.hxx, changed the declaration of ctor OTempFileService(); >> to OTempFileService(::css::uno::Reference<::css::io::XTempFile> context); >> 2. In XTempFile.hxx, added another ctor >> OTempFileService(OTempFileService &); >> 3. In XTempFile.cxx, changed the definition of OTempFileService() to: >> OTempFileService::OTempFileService(::css::uno::Reference< >> ::css::uno::XComponentContext > const & context) >> : mpStream( NULL ) >> , mbRemoveFile( sal_True ) >> , mbInClosed( sal_False ) >> , mbOutClosed( sal_False ) >> , mnCachedPos( 0 ) >> , mbHasCachedPos( sal_False ) >> ,::cppu::PropertySetMixin< ::css::io::XTempFile >( >> context >> , static_cast< Implements >( IMPLEMENTS_PROPERTY_SET | >> IMPLEMENTS_FAST_PROPERTY_SET | IMPLEMENTS_PROPERTY_ACCESS ) >> , NULL ) >> { >> mpTempFile = new ::utl::TempFile; >> mpTempFile->EnableKillingFile( sal_True ); >> } >> 4. In XTempFile.cxx, changed the definition of >> XTempFile_createInstance() to: >> ::css::uno::Reference < ::css::uno::XInterface >SAL_CALL >> XTempFile_createInstance( >> const ::css::uno::Reference< ::css::lang::XMultiServiceFactory > & >> /*xMgr*/ ) >> { >> return ::css::uno::Reference< ::css::uno::XInterface >( >> ::cppu::defaultBootstrap_InitialComponentContext() ); >> } >> >> After the steps the first error is gone and compiled the unotools module >> successfully. >> >> Nevertheless there's a new problem now: when I opened a new writer >> document in the hacked version, a "Assertion Failed!"messagebox shows >> this(for three times if "Ignore" is selected): >> "Error: File xxxxxxx\sfx2\source\doc\objstor.cxx, Line 3039: The >> document storage must be created! >> (Yes=Abort / No=Ignore / Cancel=Debugger)" >> >> I have not found out how to solve the problem yet. Could somebody give >> me some help? >> >> Best Regards, >> Felix. >> >> Michel Loiseleur 写道: >> >>> Zhang Xiaofei a écrit : >>> >>> >>>> Hi Mikhail, >>>> >>>> Thanks for your last reply. I fixed the problems in your advice, and >>>> some more during the compilation process, but there are still two >>>> errors(as in error.log in the attachment), both of which seems to me >>>> are originated from data type mismatches. Could you please tell me the >>>> causes of and solutions to the errors? >>>> >>>> >>> You have mainly 2 constructors problems. >>> >>> The first one is an inheritance problem. The class >>> ::cppu::PropertySetMixin<css::io::XTempFile> from which you herit do not >>> have any constructor without args. You need to find the appropriate >>> constructor and call it in the implementation of your own class ctor. >>> Something like this : >>> OTempFileService::OTempFileService() : >>> property1(init_args), >>> property2(), >>> ::cppu::PropertySetMixin<::com::sun::star::io::XTempFile>(init_args) >>> {} >>> >>> The second one is because you give him a set of css::Type instead of a >>> simple css::Type. That's what the compiler says : >>> >>> "cannot convert parameter 1 from 'com::sun::star::uno::Sequence<E>' to >>> 'const com::sun::star::uno::Type &' with[E=com::sun::star::uno::Type]" >>> >>> The first parameters of your ctor is OTempFileBase::getTypes() which >>> obviously returns a _sequence_ of css::Type. And you need a simple >>> css::Type in this ctor. >>> >>> Possible Solution : Look in the ::cppu::TypeCollection class on how to >>> add all thoses Types. But it seems you cannot add them during creation. >>> >>> >>> My 2 cents, hope this helps, I haven't touched any of uno class yet. >>> It's just advice from a C++ dev. >>> >>> Regards, >>> >>> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > >
build -- version: 1.151 ============= Building project unotools ============= /cygdrive/e/ooo_OOE680_m6_src/unotools/source/i18n dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/config dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/accessibility dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/misc dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/processfactory dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/property dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/streaming dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/ucbhelper dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------------------------ Making: ..\..\wntmsci10.pro\slo\xtempfile.obj c:\PROGRA~1\MICROS~1.NET\Vc7\bin\cl.exe -Zm500 -Zc:forScope -GR -c -nologo -Gs -Gy -Ob1 -Oxs -Oy- -Gd -I. -I..\..\wntmsci10.pro\inc\ucbhelp -I..\inc -I..\..\inc\inc -I..\..\inc\pch -I..\..\inc -I..\..\WIN\inc -I..\..\wntmsci10.pro\inc -I. -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\stl -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\external -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc -Ie:\ooo_ooe680_m6_src\solenv\wntmsci10\inc -Ie:\ooo_ooe680_m6_src\solenv\inc -Ie:\ooo_ooe680_m6_src\res -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\stl -Id:\OOEnv\J2SDK1~1.2_0\include\win32 -Id:\OOEnv\J2SDK1~1.2_0\include -Id:\OOEnv\PSDK\include -Ic:\progra~1\micros~1.net\vc7\include -Id:\OOEnv\DXSDK2~1\include -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\offuh -I. -I..\..\res -I. -GX -Wall -wd4061 -wd4063 -wd4127 -wd4191 -wd4217 -wd4250 -wd4251 -wd4275 -wd4290 -wd4292 -wd4294 -wd4344 -wd4347 -wd4355 -wd4503 -wd4511 -wd4512 -wd4514 -wd4611 -wd4619 -wd4625 -wd4626 -wd4640 -wd4675 -wd4686 -wd4710 -wd4711 -wd4786 -wd4800 -wd4820 -DWNT -DWNT -DNT351 -DMSC -DM1310 -DINTEL -D_X86_=1 -DFULL_DESK -DSTLPORT_VERSION=400 -DWINVER=0x400 -D_WIN32_IE=0x400 -D_MT -DCPPU_ENV=msci -DSUPD=680 -DPRODUCT -DNDEBUG -DPRODUCT_FULL -DOSL_DEBUG_LEVEL=0 -DOPTIMIZE -DEXCEPTIONS_ON -DCUI -DSOLAR_JAVA -DOOE680=OOE680 -DUNOTOOLS_DLLIMPLEMENTATION -DSHAREDLIB -D_DLL_ -DWIN32 -D_MT -D_DLL -DWIN32 -D_MT -D_DLL -DMULTITHREAD -Fo..\..\wntmsci10.pro\slo\xtempfile.obj e:\ooo_OOE680_m6_src\unotools\source\ucbhelper\xtempfile.cxx c:\PROGRA~1\MICROS~1.NET\Vc7\bin\cl.exe @C:\DOCUME~1\ZXF~1.CH2\LOCALS~1\Temp\mk1804_3771_7 xtempfile.cxx e:\ooo_OOE680_m6_src\unotools\source\ucbhelper\XTempFile.cxx(483) : error C2664: 'com::sun::star::uno::Reference<interface_type>::Reference(const com::sun::star::uno::Reference<interface_type> &) throw()' : cannot convert parameter 1 from 'com::sun::star::uno::Reference<interface_type>' to 'const com::sun::star::uno::Reference<interface_type> &' with [ interface_type=com::sun::star::lang::XSingleServiceFactory ] and [ interface_type=com::sun::star::lang::XSingleComponentFactory ] and [ interface_type=com::sun::star::lang::XSingleServiceFactory ] Reason: cannot convert from 'com::sun::star::uno::Reference<interface_type>' to 'const com::sun::star::uno::Reference<interface_type>' with [ interface_type=com::sun::star::lang::XSingleComponentFactory ] and [ interface_type=com::sun::star::lang::XSingleServiceFactory ] No constructor could take the source type, or constructor overload resolution was ambiguous '---* tg_merge.mk *---'
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]