[Kde-windows] KDE/kdelibs/win
Ralf Habacker
ralf.habacker at freenet.de
Tue Oct 18 10:17:56 CEST 2005
Am Dienstag, 18. Oktober 2005 09:41 schrieb Jarosław Staniek:
> Ralf Habacker said the following, On 2005-10-18 08:32:
> > Am Montag, 17. Oktober 2005 23:38 schrieb Ralf Habacker:
> >>Am Montag, 17. Oktober 2005 20:12 schrieb Jarosław Staniek:
> >>>Ralf Habacker said the following, On 2005-10-17 19:41:
> >>>>Am Montag, 17. Oktober 2005 18:34 schrieb Jarosław Staniek:
> >>>>>Ralf Habacker said the following, On 2005-10-17 18:06:
> >>>>>>Am Montag, 17. Oktober 2005 16:59 schrieb Jarosław Staniek:
> >>>>>>>Ralf Habacker said the following, On 2005-10-17 16:47:
> >>>>>>>>SVN commit 471384 by habacker:
> >>>>>>>>
> >>>>>>>>don't need this stuff for qt4, dcopserver runs without it
> >>>>>>>>
> >>>>>>>>D bootstrap.cpp
> >>>>>>>
> >>>>>>>Hm?
> >>>>>>>bootstrap.cpp is not only for qeventloop. Look at the code and
> >>>>>>>docs... More code like this will go here too. Or have you moved this
> >>>>>>>somewhere?
> >>>>>>
> >>>>>>You mean this bootstrap stuff which is called before main and
> >>>>>>requires special hacking of the main function ?
> >>>>>>
> >>>>>>The eventloop startup is obsolate , but I have overseen that there
> >>>>>>will be directories created and the HOME var set in win95 case,
> >>>>>>sorry. I have readded this file without the qeventloop stuff.
> >>>>>>
> >>>>>>BTW: Should KDE really support win95 ?
> >>>>>
> >>>>>KDE? I never worked on KDE for windows but on kdelibs.
> >>>>>Read explanation here, again (hmm, offline currently):
> >>>>>http://wiki.kde.org/tiki-index.php?page=KDElibs+for+win32
> >
> > no problem here, I mean that the stuff we are talking about is for win 95
> > and the question was intended to ask general, if windows 95 should be
> > support or not (I prefer not, because of the huge gdi resource problems,
> > to which we will be faced)
> >
> >>>>>>And what about the network startup
> >>>>>>stuff ? KICE calls it too and QT as far as I can see too ?
> >>>>>
> >>>>>which one 'network startup'?
> >>>>
> >>>>KDEWIN32_EXPORT void kde_bootstrap()
> >>>>{
> >>>> ...
> >>>> WSADATA wsadata;
> >>>> WSAStartup(MAKEWORD(2,2),&wsadata);
> >>>>
> >>>>This function starts up networking.
> >>>
> >>>I guess this was for dcop. So now can be removed (better: commented
> >>> out).
> >>>
> >>>>See
> >>>>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsoc
> >>>>k/ winsock/wsastartup_2.asp
> >
> > After reading some more docs I recognized, that QT only calls WSAStartup
> > if an application uses network related classes like QTcpServer (call is
> > used only in QT/4.0.1/src/network) or if an application uses kICE. Any
> > other applications will not start network. This explains the problem I
> > had with winsock gethostbyname(), which does not return a valid hostname
> > for the first time before kICE was setup. Seems that there are some more
> > thoughts to deal with required.
> >
> >>>>>>BTW2: I think that there is a better way to create pre/after main
> >>>>>>functions. You can create a class and create a global instance of
> >>>>>>this. This instance will be created and the constructor be called
> >>>>>>before main.
> >>>>>>
> >>>>>>
> >>>>>>#include <stdio.h>
> >>>>>>
> >>>>>>class KDEbootstrap {
> >>>>>>public:
> >>>>>> KDEbootstrap();
> >>>>>> ~KDEbootstrap();
> >>>>>>};
> >>>>>>
> >>>>>>
> >>>>>>KDEbootstrap::KDEbootstrap()
> >>>>>>{
> >>>>>> printf("bootstrap created\n");
> >>>>>> // stuff called before main
> >>>>>>}
> >>>>>>
> >>>>>>KDEbootstrap::~KDEbootstrap()
> >>>>>>{
> >>>>>> printf("bootstrap delete\n");
> >>>>>> // stuff called after main
> >>>>>>}
> >>>>>>
> >>>>>>KDEbootstrap bootstrap;
> >>>>>
> >>>>>We dont want to require devs to put
> >>>>>
> >>>>>KDEbootstrap bootstrap;
> >>>>>
> >>>>>into application code (e.g. main.cpp).
> >>>>>
> >>>>>
> >>>>>So where do you want to put it? My candidate could be KInstance....
> >>>>
> >>>>See the updated bootsrap.cpp (kde_bootstrap() may be directly included
> >>>>into the constructor and kde_destroy() in the destructor)
> >>>
> >>>First, read dfaure answer - existing solution doesn't break anything:
> >>>developers cannot see a difference...
> >>>
> >>>Now note it's dangerous to rely on static members destruction: you never
> >>>know in which order destructors are called. With kdemain() it's always
> >>>deterministic. SO here I'd vote for not using KDEbootstrap object, unles
> >>>you know something annoing our devs..
> >>
> >>The testcase below illustrate the recent implementation, showing that
> >>kde_bootstrap will be called after all global object instantiation, which
> >>will be to late and kde_destroy() before all global object destruction.
> >>
> >> TestClass stands for any external class, whch has global objects. They
> >> are initialised before main(). kde_bootstrap() setup a env var like the
> >> recent implementation setting HOME. If you compile and run the testcase,
> >> the env var in
> >>TestClass::TestClass() isn't set.
> >>
> >>I have appended another testcase (c++constructor-order.zip), which shows
> >>the ordering of global constructor and destructor.
> >>on mingw constructors are called in reverse order and destructors in
> >> normal order based on the file sequence.
> >>
> >>C:\Daten\kde4\kdelibs\test\constructor>scons
> >>scons: Reading SConscript files ...
> >>win32
> >>win32
> >>scons: done reading SConscript files.
> >>scons: Building targets ...
> >>g++ -o first.o -c first.cpp
> >>g++ -o main.o -c main.cpp
> >>g++ -o second.o -c second.cpp
> >>g++ -o third.o -c third.cpp
> >>g++ -o test.exe first.o second.o third.o main.o
> >>scons: done building targets.
> >>
> >>C:\Daten\kde4\kdelibs\test\constructor>test
> >>ThirdClass created (null)
> >>SecondClass created (null)
> >>FirstClass created (null)
> >>main
> >>FirstClass deleted
> >>SecondClass deleted
> >>ThirdClass deleted
> >
> > This let me assume, that using a global object in kdewin32, which will be
> > the last library on the link line, would be run first
> >
> > Any infos about msvc order ?
>
> No idea *in general* and that's why the macro exists...
Have you compiled the constructor test application with msvc ? This will
report how msvc handles this stuff.
> > BTW: If the global object ordering will be a problem on other compilers,
> > a complete other approach for problems like the HOME env var on windows
> > 95 is to redefine the getenv() function and do the required
> > initialisation on the first call. This will be independent off any
> > global objects and it is guarantated that HOME will be set before.
>
> Could you help with this one?
of course. ;-)
Please add the HOME related code from bootstrap.cpp to kde_getenv
win/getenv.c. Additional redirect original getenv definition to kde_getenv()
in include/msvc/stdlib.h
Regards
Ralf
int kde_init_getenv()
{
if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
// stuff from bootstrap.cpp
}
return 1;
}
KDEWIN32_EXPORT char * kde_getenv(const char *name)
{
char dummy[1];
int len;
char *p;
//<---
static init = 0;
if (!init)
init = kde_init_getenv();
//--->
if (!name)
return 0;
len = GetEnvironmentVariableA(name, dummy, 0);
if (len == 0)
return 0;
len++;
// NOTE: This creates a memory whole, because it will never be free'd
// better use a static char vector
p = malloc(len);
if (GetEnvironmentVariableA(name, p, len))
return p;
free(p);
return 0;
}
More information about the Kde-buildsystem
mailing list