Page 1 of 1

Modules for win32?

Posted: Sun Mar 07, 2004 4:24 am
by lord2800
Unfortunately, due to circumstances slightly beyond my control(lack of a second box and lack of a nic that's supported in linux), I can't use the linux build of Unreal. Are there any modules developed for the Win32 build of Unreal, and if so, where can I find some? I've tried googling and came up with nothing.

Posted: Sun Mar 07, 2004 4:46 am
by codemastr
Well, you can thank Microsoft for that! Microsoft's C compiler lacks the necessary features to allow the Win32 build to support modules.

You can compile a win32 version of Unreal with certain modules compiled in, but you can't simply loadmodule like you can in Linux.

Posted: Sun Mar 07, 2004 8:05 am
by lord2800
Bah.
/me kicks his windows box.
Anyone up for donating me a new nic? :)

Posted: Tue Mar 09, 2004 11:09 pm
by aquanight
Why can't you use DLLs? LoadLibraryA(), GetProcAddressA()?

Posted: Wed Mar 10, 2004 12:06 am
by codemastr
That works great for having the exe call functions in the dll, but not for the other way around. Under *nix, we specify --export-dynamic and it exports all the ircd's symbols so that the .so can read them. MSVC has no such equivilent. Therefore, it means we have to go through and _manually_ set _every_ variable and function in Unreal to __declspec(dllexport) and then build an import library for the .dll to link with. It can be done, yes, but it is a major pain to do.

Posted: Wed Mar 10, 2004 12:10 am
by aquanight
don't you use the extern identifier on the vars and functions that you would export?

if so:

Code: Select all

#define extern __declspec(dllexport) extern
Or just make a .DEF file to export them.

Posted: Wed Mar 10, 2004 12:13 am
by codemastr
It still has to be added to each and every file along with an accompanying #undef extern at the end of the file to prevent it from spilling into any system headers. Not to mention, not all of them are extern. Again a difference, in *nix they don't have to be.

And making a .def doesn't help at all, in fact it is at least 5x harder! Now I have to go through each file and make a list of every function and variable Unreal uses. Not only that, each time we add a new function we have to be sure to add an entry to the .def file.

Posted: Wed Mar 10, 2004 6:32 pm
by aquanight
Can you put __declspec(dllexport) on a namespace?

Something like this?

Code: Select all

#ifdef __cplusplus
__declspec(dllexport) namespace UnrealIRCd {
#endif
// Contents
#ifdef __cplusplus
};
#endif
If that works, all that will happen is the generation of some not-so-nice C++ export names (unless you can extern "C" on or inside a namespace).

Posted: Wed Mar 10, 2004 6:48 pm
by codemastr
Heh, first off, as you said, thats C++, not C.

Second, if we start doing that, then we have symbol mangling. And, I doubt you can export a namespace like that because a namespace itself is not a symbol.

Posted: Wed Mar 10, 2004 11:46 pm
by aquanight
Yeah, I kinda realized that after I had already posted it. Becuase you can have two namespaces of the same name, and they'll just get merged (which is why the C++ includes (the ones that use namespace std) work).

And doesn't extern "C" stop symbol mangling?

Posted: Sat Mar 27, 2004 2:20 am
by aquanight
Have you ever checked the wIRCd with Dependency Walker? I did, because I have Visual Studio, and I noticed the ircd did have some exports:

Here's a clip from a savefile that had the import/export lists:

Code: Select all

[   ] WIRCD.EXE

     Import  Ordinal       Hint          Function             Entry Point
     ------  ------------  ------------  -------------------  -----------

     Export  Ordinal       Hint          Function             Entry Point
     ------  ------------  ------------  -------------------  -----------
     [C  ]     1 (0x0001)    0 (0x0000)  htm_config_run       0x000019D8
     [C  ]     2 (0x0002)    1 (0x0001)  htm_config_test      0x00001230
     [C  ]     3 (0x0003)    2 (0x0002)  htm_stats            0x00001839
     [C  ]     4 (0x0004)    3 (0x0003)  m_adminchat_Init     0x00001131
     [C  ]     5 (0x0005)    4 (0x0004)  m_adminchat_Load     0x0000108C
     [C  ]     6 (0x0006)    5 (0x0005)  m_adminchat_Unload   0x00001DA7
     [C  ]     7 (0x0007)    6 (0x0006)  m_admins             0x00001276
Of course, this looks like the stuff that would have come from the commands module... but still, there are some exports. Would this mean that a DLL module could invoke commands directly, for example?