c++ - Compiling a DLL using DMC for use with MSVC program
- Dan (38/38) Nov 08 2010 Hi all,
- Bertel Brander (19/57) Nov 09 2010 If you add this at the top of dll-testing.cpp:
- Dan (10/10) Nov 09 2010 Wow, thank you!! That did indeed do the trick. I have to say, I don't un...
- Bertel Brander (7/13) Nov 10 2010 Like any program needs a main (or WinMain) will any dll need a DllMain.
- Dan (14/14) Nov 10 2010 Thanks for the extra info. I fear these next problems may not be so
- Bertel Brander (2/16) Nov 11 2010 I have absolutely no idea.
Hi all, I have a simple function I'd like to compile as a DLL: *********************** extern "C" { __declspec(dllexport) int Add( int a, int b ) { return( a + b ); } } *********************** Usually, I would compile that with Visual Studio C++, and then run this short program which calls the dll (also compiled with VS): *********************************** #include <iostream> #include <windows.h> typedef int (*AddFunc)(int,int); int main() { HINSTANCE h = LoadLibrary("dll-testing.dll"); AddFunc af = (AddFunc)GetProcAddress(h, "Add"); printf("%i\n", af(23, 43)); system("PAUSE"); } *********************************** It works. However, I need the user to be able to compile it, so I would need to distribute the compiler with my software. There seem to many unknowns about the Microsoft C++ compiler (including where it's even located or what it's called, the terms and conditions, plus maybe it's very bloated?). So my idea was to use DMC or something like it. DMC seems very portable (though obviously I'd ask for permission first or pay if need be). However, unfortunately, I can't get it to compile the DLL properly. I try this: dmc dll-testing.cpp -WD It creates the DLL (about 2k instead of 26k like the MVSC++ version). So far so good, but then when I try to run the program which calls the DLL, I get an error: "dll-testing.dll is either not designed to run on Windows or it contains an error. Try installing the program again using...... blah blah...." Is what I want to do even possible? I'd hate to resort to a scripting language to achieve what I want because obviously, C/C++ is so fast (I need the speed). It seems like this issue the only thing stopping me now :)
Nov 08 2010
If you add this at the top of dll-testing.cpp: #include <windows.h> __declspec(dllexport) BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } And compile: dmc -mn -WD dll-testing.cpp kernel32.lib It should work. Den 09-11-2010 07:21, Dan skrev:Hi all, I have a simple function I'd like to compile as a DLL: *********************** extern "C" { __declspec(dllexport) int Add( int a, int b ) { return( a + b ); } } *********************** Usually, I would compile that with Visual Studio C++, and then run this short program which calls the dll (also compiled with VS): *********************************** #include<iostream> #include<windows.h> typedef int (*AddFunc)(int,int); int main() { HINSTANCE h = LoadLibrary("dll-testing.dll"); AddFunc af = (AddFunc)GetProcAddress(h, "Add"); printf("%i\n", af(23, 43)); system("PAUSE"); } *********************************** It works. However, I need the user to be able to compile it, so I would need to distribute the compiler with my software. There seem to many unknowns about the Microsoft C++ compiler (including where it's even located or what it's called, the terms and conditions, plus maybe it's very bloated?). So my idea was to use DMC or something like it. DMC seems very portable (though obviously I'd ask for permission first or pay if need be). However, unfortunately, I can't get it to compile the DLL properly. I try this: dmc dll-testing.cpp -WD It creates the DLL (about 2k instead of 26k like the MVSC++ version). So far so good, but then when I try to run the program which calls the DLL, I get an error: "dll-testing.dll is either not designed to run on Windows or it contains an error. Try installing the program again using...... blah blah...." Is what I want to do even possible? I'd hate to resort to a scripting language to achieve what I want because obviously, C/C++ is so fast (I need the speed). It seems like this issue the only thing stopping me now :)
Nov 09 2010
Wow, thank you!! That did indeed do the trick. I have to say, I don't understand any of it, but hopefully I can take a fire and forget approach towards this extra code, without worrying too much how it affects the rest...? I also was able to simplify it a little bit by removing the -mn bit; not sure if that will affect performance however (I use Windows 7 btw, but others may not of course). Just for the record, I was also able to compile both parts almost without modification using the Tiny C compiler (TCC). Down to 2k too. I just needed to remove the 'extern "C"' part for TCC to work, though maybe D's apparent 'cruft' in this case is better in terms of safety or flexibility...
Nov 09 2010
Den 10-11-2010 01:49, Dan skrev:Wow, thank you!! That did indeed do the trick. I have to say, I don't understand any of it, but hopefully I can take a fire and forget approach towards this extra code, without worrying too much how it affects the rest...?Like any program needs a main (or WinMain) will any dll need a DllMain. I don't know why VisualC++ allows you to create a DLL without. The function is called when the DLL is loaded and so on: http://msdn.microsoft.com/en-us/library/ms682583%28VS.85%29.aspx You might not need to do anything with it.I also was able to simplify it a little bit by removing the -mn bit; not sure if that will affect performance however (I use Windows 7 btw, but others may not of course).-mn might be default for DLLs
Nov 10 2010
Thanks for the extra info. I fear these next problems may not be so surmountable however. The Microsoft compiler has special math optimizations known as SSE2 (Streaming SIMD Extensions 2), and a 'Fast' floating point model. From what I've been researching, SSE2 may be available in the DMC compiler (a quick mention in the changelog at digitalmars.com), but there's no compiler flag. I checked the site's optimization page too, and tried -o+all as well as -o-all to no avail. Also I've heard that the DMC compiler uses a particularly accurate floating point model. However, for my purposes, it's more important I get a fast one, like the one MVSC++ provides. Without those two optimizations, the Microsoft compiler ran as slowly, but with them, I obtained a speed increase of about 3x over DMC - not insignificant. Any ideas?
Nov 10 2010
Den 11-11-2010 02:46, Dan skrev:Thanks for the extra info. I fear these next problems may not be so surmountable however. The Microsoft compiler has special math optimizations known as SSE2 (Streaming SIMD Extensions 2), and a 'Fast' floating point model. From what I've been researching, SSE2 may be available in the DMC compiler (a quick mention in the changelog at digitalmars.com), but there's no compiler flag. I checked the site's optimization page too, and tried -o+all as well as -o-all to no avail. Also I've heard that the DMC compiler uses a particularly accurate floating point model. However, for my purposes, it's more important I get a fast one, like the one MVSC++ provides. Without those two optimizations, the Microsoft compiler ran as slowly, but with them, I obtained a speed increase of about 3x over DMC - not insignificant. Any ideas?I have absolutely no idea.
Nov 11 2010