From: Paul G. <pga...@qw...> - 2001-02-14 01:57:21
|
On 13 Feb 2001, at 9:42, the Illustrious Earnie Boyd wrote: > Mattia Barbon wrote: > > > > Hello, is there any #define I could use > > to determine w32api version? > > > > Not yet. I've thought about doing such. What is it you're > trying to do with such a variable? Indeed, we need more information...there are different release versions (NT4 is version 4.00, Win95B is version 1.00 ) of the win32api, however, those are mostly handled by checking your system to determine which OS is being used. Mingw already knows whether you are using WinNT or some other Windows OS. Here are a few things about how to determine which MS version of the Win32api you are currently using: In a makefile, check what your OS system directory is (eg, if C:\winnt is system directory then this is a WinNT platform, if c:\windows is system directory, then this is a Win9x/WinME/XP? - - not sure about Win2k) or what OS you are using (Environment variable "OS"=Windows for Win9x, Windows_NT for WinNT4/5 and possibly Win2k). Using quickview, the Operating System Version reference (WinNT/Win98/Win95B is 4.00) is always included as part of the .dll being loaded which allows you to determine how you might handle a version specific Win32api call. The Image Versions are different. Win98/Win95B image version=1.09, WinNT4 image version=4.00. Win95 has an Operating System Version number of 1.00 (api reference or "Win32api v. 1.00"). All of that information is part of what is stored in kernel32.dll (win95B/win98/nt4). I am not sure but I think that NT5 is OS Version 5.00 (Win32api reference), and I am not at all sure what the OS Version is for Win2k (though I am inclined to believe it is also 5.00). Most often, however, if you know your OS, you don't need to be concerned with the api version being used. Peace, Paul G. Nothing real can be threatened. Nothing unreal exists. |
From: Mattia B. <mb...@ds...> - 2001-02-14 21:14:36
|
> Not yet. I've thought about doing such. What is it you're trying to > do with such a variable? In the libjpeg sources included in wxWindows there is a conflicting typedef for INT32 ( older w32api typedef is different from 0.4 typedef ); another problem is: there is a class encapsulating aDialup Manager, under WIndows it uses ras, but ras headers are obly in w32api 0.4. Regards Mattia |
From: Earnie B. <ear...@ya...> - 2001-02-15 14:12:40
|
Mattia Barbon wrote: > > > Not yet. I've thought about doing such. What is it you're trying to > > do with such a variable? > In the libjpeg sources included in wxWindows there is a conflicting > typedef for INT32 ( older w32api typedef is different from 0.4 > typedef ); another problem is: there is a class encapsulating > aDialup Manager, under WIndows it uses ras, but ras headers are obly > in w32api 0.4. > Ah ha, here's that post I didn't see. Ok, so what's the best way to handle this? Hmm... how about a w32api.h file that contains a _W32API_VERSION constant? --8<---8<--- w32api.h --->8--->8-- #ifndef _W32API_H_ #define _W32API_H_ #define _W32API_VERSION 0.4 #endif /* ndef _W32API_H_ */ --8<---8<--- w32api.h --->8--->8-- So, what do others think? Note, that I use a separate file because the macro is package specific and the MSDN knows nothing about it so I'll refuse to put it in a MS specific named header. Earnie. _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com |
From: Earnie B. <ear...@ya...> - 2001-02-15 17:47:15
|
Earnie Boyd wrote: > > --8<---8<--- w32api.h --->8--->8-- > #ifndef _W32API_H_ > #define _W32API_H_ > > #define _W32API_VERSION 0.4 > > #endif /* ndef _W32API_H_ */ > --8<---8<--- w32api.h --->8--->8-- > I've committed this file to CVS. It'll be in the next release. Earnie. _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com |
From: Mumit K. <khan@NanoTech.Wisc.EDU> - 2001-02-16 15:55:23
|
On Thu, 15 Feb 2001, Earnie Boyd wrote: > Earnie Boyd wrote: > > > > --8<---8<--- w32api.h --->8--->8-- > > #ifndef _W32API_H_ > > #define _W32API_H_ > > > > #define _W32API_VERSION 0.4 > > > > #endif /* ndef _W32API_H_ */ > > --8<---8<--- w32api.h --->8--->8-- > > > > I've committed this file to CVS. It'll be in the next release. Note that this is only part of the solution, since you can't check for the version using C preprocessor. When adding these version macros, it's customary to add at least two more: #define _W32API_MAJOR_VERSION 0 #define _W32API_MINOR_VERSION 4 These enable you check for versions correctly. An example of the checks can be seen in gthr-win32.h in gcc sources (the mingw version macros are defined in _mingw.h file). I would also use *two* leading underscores. Regards, Mumit |
From: Earnie B. <ear...@ya...> - 2001-02-16 16:18:14
|
Mumit Khan wrote: > > On Thu, 15 Feb 2001, Earnie Boyd wrote: > > > Earnie Boyd wrote: > > > > > > --8<---8<--- w32api.h --->8--->8-- > > > #ifndef _W32API_H_ > > > #define _W32API_H_ > > > > > > #define _W32API_VERSION 0.4 > > > > > > #endif /* ndef _W32API_H_ */ > > > --8<---8<--- w32api.h --->8--->8-- > > > > > > > I've committed this file to CVS. It'll be in the next release. > > Note that this is only part of the solution, since you can't check > for the version using C preprocessor. When adding these version > macros, it's customary to add at least two more: > > #define _W32API_MAJOR_VERSION 0 > #define _W32API_MINOR_VERSION 4 > Good idea. > These enable you check for versions correctly. An example of the checks > can be seen in gthr-win32.h in gcc sources (the mingw version macros > are defined in _mingw.h file). > > I would also use *two* leading underscores. > Why two? What is the means by which to determine one vs two? I only ask because I started to use two and then switched to one. Earnie. _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com |
From: Mumit K. <khan@NanoTech.Wisc.EDU> - 2001-02-16 17:02:11
|
On Fri, 16 Feb 2001, Earnie Boyd wrote: > > Why two? What is the means by which to determine one vs two? Loosely speaking, identifiers starting with a single underscore, and followed by an upper case letter is reserved by the implementation C++ adds more restriction to that, and it's just easier to avoid it. I never remember the exact rules, and don't have the ISO C9x and C++ standards handy at the moment. We could of course since w32api is part of the implementation in a way, but it'll good to be consistent with mingw versioning scheme. Macros defined in the Windows API of course screws up the namespace in a royal way, but there's not much we can do about it. Regards, Mumit |
From: Lloyd D. <ll...@ga...> - 2001-02-17 14:37:53
|
i try to build .dll from .a (expanding .o in .a, generating new .def, .a, .dll from .o) and i don't know why there is a lot of generated name (in my .a & .dll) which begin with __imp ? what is this ? |
From: Jeff S. <jef...@ap...> - 2001-02-18 15:36:24
|
Lloyd Dupont wrote: > i try to build .dll from .a (expanding .o in .a, generating new .def, .a, > .dll from .o) > and i don't know why there is a lot of generated name (in my .a & .dll) > which begin with __imp ? what is this ? They are part of an import library. Every DLL stub archive contains an import library. Windows binds import symbols to the address of an exported symbol at load time (i.e. at program startup or when LoadLibrary is invoked). Jeff |
From: Lloyd D. <ll...@ga...> - 2001-02-19 22:14:49
|
ok, i understand some interesting thing with your explanation. but the trouble is that it don't resolve my problems. for example when i try "nm *.a | grep printf" in gcc's lib dir i found. 00000000 ? ___imp_printf 00000000 ? __imp__printf 00000000 T _printf but when i build my .dll and .a file and want to link against i have an error message: LLToto.o(.text+0x70):LLToto.m: undefined reference to `__objc_class_name_Object' and when i run "nm libobjc.a | grep objc_class_name_Object" (libobjc.a is my new lib) i get: 00000000 ? ___imp___objc_class_name_Object 00000000 ? __imp____objc_class_name_Object so it appear to me that my lib lack something like: (but my dll contain it) 00000000 T __objc_class_name_Object what can i do to have a correct .a file ? (one who contain a ref to __objc_class_name_Object) |
From: Lloyd D. <ll...@ga...> - 2001-02-19 22:46:42
|
(read "_imp... continued" first. i write it at end of file in case) some test later it appear to me that dlltool when generating .def file put line of style __objc_class_name_DLLToto @ 1 DATA ; which cause dllwrap to produce output lib with __imp__XXX but that's all. i remove DATA tag. built again, test. all work fine. even dependencies over multiple DLL (at least in my little 2 dll test) what is the meaning of such DATA tag ? i think to write a script to remove them but... why generating them in this case ? ----- _imp... continued ---- > > ok, i understand some interesting thing with your explanation. > but the trouble is that it don't resolve my problems. > > for example when i try "nm *.a | grep printf" in > gcc's lib dir i found. > 00000000 ? ___imp_printf > 00000000 ? __imp__printf > 00000000 T _printf > > but when i build my .dll and .a file and want to link against i have an > error message: > LLToto.o(.text+0x70):LLToto.m: undefined reference to > `__objc_class_name_Object' > > and when i run "nm libobjc.a | grep objc_class_name_Object" > (libobjc.a is my new lib) i get: > 00000000 ? ___imp___objc_class_name_Object > 00000000 ? __imp____objc_class_name_Object > > so it appear to me that my lib lack something like: > (but my dll contain it) > 00000000 T __objc_class_name_Object > > what can i do to have a correct .a file ? > (one who contain a ref to __objc_class_name_Object) |
From: <dan...@ya...> - 2001-02-19 23:50:36
|
--- Lloyd Dupont <ll...@ga...> wrote: > (read "_imp... continued" first. i write it at end of file in case) > some test later it appear to me that dlltool when generating > .def file put line of style > __objc_class_name_DLLToto @ 1 DATA ; > > which cause dllwrap to produce output lib with __imp__XXX > but that's all. > > i remove DATA tag. built again, test. all work fine. > even dependencies over multiple DLL (at least in my little 2 dll > test) > > what is the meaning of such DATA tag ? > i think to write a script to remove them but... > why generating them in this case ? > > > ----- _imp... continued ---- > > > > ok, i understand some interesting thing with your explanation. > > but the trouble is that it don't resolve my problems. > > > > for example when i try "nm *.a | grep printf" in > > gcc's lib dir i found. > > 00000000 ? ___imp_printf > > 00000000 ? __imp__printf > > 00000000 T _printf > > > > but when i build my .dll and .a file and want to link against i > have an > > error message: > > LLToto.o(.text+0x70):LLToto.m: undefined reference to > > `__objc_class_name_Object' > > > > and when i run "nm libobjc.a | grep objc_class_name_Object" > > (libobjc.a is my new lib) i get: > > 00000000 ? ___imp___objc_class_name_Object > > 00000000 ? __imp____objc_class_name_Object > > > > so it appear to me that my lib lack something like: > > (but my dll contain it) > > 00000000 T __objc_class_name_Object > > > > what can i do to have a correct .a file ? > > (one who contain a ref to __objc_class_name_Object) > Hello Lloyd Have a look at following link for the meaning of the DATA tags and the need to declare objects as declspec(__dllimport) in code that imports extern data (of simple type like int as well user-defined objects like your objc_class_name_Object) from dll. http://msdn.microsoft.com/library/techart/msdn_dllart.htmdata Danny _____________________________________________________________________________ http://invites.yahoo.com.au - Yahoo! Invites - Organise your Mardi Gras party online! |
From: Mattia B. <mb...@ds...> - 2001-02-16 21:22:55
|
> I've committed this file to CVS. It'll be in the next release. ======foo.c=============== #define FOO_VERSION 0.4 #if FOO_VERSION >= 0.4 // good #else #error #endif int main() { return 1; } ========================== gcc complains: foo.c:3: Floating point numbers not allowed in #if expressions so it is probably better: #define _W32API_VERSION_MAJOR 0 #define _W32API_VERSION_MINOR 4 or something similar Also: will be the w32api.h #included automatically by windows.h or any other standard Win32 header? Regards Mattia |
From: berk <be...@nm...> - 2001-02-17 06:52:04
|
Use The Source, Mattia! Replying to your mail dated Saturday, February 17, 2001, 2:23:59 AM, about "[Mingw-users] Checking w32api version": #if FOO_VERSION >>= 0.4 MB> gcc complains: MB> foo.c:3: Floating point numbers not allowed in #if expressions found that in mingw ansidecl.h: /* Using MACRO(x,y) in cpp #if conditionals does not work with some older preprocessors. Thus we can't define something like this: #define HAVE_GCC_VERSION(MAJOR, MINOR) \ (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR))) and then test "#if HAVE_GCC_VERSION(2,7)". So instead we use the macro below and test it against specific values. */ /* This macro simplifies testing whether we are using gcc, and if it is of a particular minimum version. (Both major & minor numbers are significant.) This macro will evaluate to 0 if we are not using gcc at all. */ #ifndef GCC_VERSION #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) #endif /* GCC_VERSION */ so, obviously, you don't have to deal with float numbers but to a several orders of magnitude larger integer numbers. #ifndef FOO_VERSION #define FOO_VERSION (__FOO_MAJOR * 1000 + __FOO_MINOR) #endif keep in touch. berk. * mailto:be...@nm... * http://ber.k45.ru * ICQ UIN: 49516372 * * The Go! operating system development: http://attend.to/go * |