Re: MS Fortran 4.0 and VS2005 MFC project
Look under Project properties,
- C/C++
- Preprocessor
- defines...
add your definition there...
I assume it is appropriate. Only
you, should know.
But, with this defines, sure it will
call the other function...
jmarc..
"jmarc" <jmarc@incursion-voyages.com> wrote in message
news:9cUSh.62766$__3.39605@edtnps90...
_SYSCRT is compiler switch. Define it
and _initterm() will be compiled and called
instead of _initterm_e() !
jmarc..
"Matt" <matthewgates@hotmail.com> wrote in message
news:1176232482.105024.247680@o5g2000hsb.googlegroups.com...
My company still uses MS Fortran 4.0 to compile our fortran into a lib
which is then linked into our MFC project. We currently use VS2003
and every gets along fine.
While converting to VS2005, I found that the MS fortran dll
(MSFORT40.dll) is causing the program to fail at startup. The
following message is displayed:
"The program '[2368] Test.exe: Native' has exited with code 255
(0xff)."
Further investigation revals that the failure occurs within initterm_e
(crtexe.c):
#ifndef _SYSCRT
if (_initterm_e( __xi_a, __xi_z ) != 0)
{
return 255; // HERE IS WHERE WE GET KICKED OUT!
}
#else /* _SYSCRT */
_initterm((_PVFV *)(void *)__xi_a, (_PVFV *)(void
*)__xi_z);
#endif /* _SYSCRT */
...
If I force the debugger to skip the "return 255" and continue on, the
program will start but this is really bogus as initterm_e ended early
and not every thing may have been initialized.
In VS2003, a different inittem (crtexe.c) is called that does not
return anything:
/*
* Do runtime startup initializers.
*
* Note: the only possible entry we'll be executing here
is for
* __lconv_init, pulled in from charmax.obj only if the
EXE was
* compiled with -J. All other .CRT$XI* initializers are
only
* run as part of the CRT itself, and so for the CRT DLL
model
* are not found in the EXE. For that reason, we call
_initterm,
* not _initterm_e, because __lconv_init will never return
failure,
* and _initterm_e is not exported from the CRT DLL.
*
* Note further that, when using the CRT DLL, executing
the
* .CRT$XI* initializers is only done for an EXE, not for
a DLL
* using the CRT DLL. That is to make sure the -J setting
for
* the EXE is not overriden by that of any DLL.
*/
_initterm( __xi_a, __xi_z );
...
What is _SYSCRT? It is the "#ifndef _SYSCRT" that causes the
"initterm_e" function and not the "initterm" version to be called. I
think that if the "initterm" is called that does not return anything,
all will be good. Anyone have a similar experience or any suggestions
on how to get this to work? Thanks in advance.