Hello,
I am new user to Code:Blocks and I woud like to know how it is possible to compile a dll in Code:Blocks so it can be imported in Excel (2003) via VB 6.0 ? I would like to avoid in future to use Visual Studio C++...
Thank you in advance !
Cheers,
Patrick
I tried this but Excel doesn't seem to find it.
#include <windows.h>
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
// a sample exported function
int DLL_EXPORT SomeFunction(const double somedouble)
{
return 1;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
Hello,
You have then to declare the exported functions within VBA (using the Declare statement). See the VB help to have the right syntax.
EDIT:Declare Function SomeFunction lib "MyDLL.dll" Alias "SomeFunction" (ByVal SomeDouble As Double) As Integer
Hello again,
Thank you for the answer :D but still I get the sad "#VALUE" from excel :(.
I did the following wrapping of the Dll call in vba:
Declare Function SomeFunction Lib "Sample.dll" (ByVal SomeDouble As Double) As Integer
Function testsample()
Dim ld_int As Integer
Dim ld_double As Double
ld_double = 0
ld_int = SomeFunction(ld_double)
testsample = ld_int
End Function
I believe I miss something when I compile the dll ???
Thanks again,
Patrick
Hello,
maybe this could help you:
http://www.mingw.org/MinGWiki/index.php/VB-MinGW-DLL (http://www.mingw.org/MinGWiki/index.php/VB-MinGW-DLL)
VB and VBA have some restrictions usung standard dlls.
Thanks for the comment :D.
I still have the same "#VALUE!" in Excel.
Did I miss the linker flags ? I put "--add-stdcall-alias" in the "other linker options" field of "Code::Blocks" ? Is that correct ? Is there a way to check at least that the dll is loaded ?
I modified the sample code according to the previous reply to:
#include <windows.h>
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
// a sample exported function
DLL_EXPORT int __stdcall SomeFunction(const double somedouble)
{
//MessageBoxA(0, somedouble, "DLL Message", MB_OK | MB_ICONINFORMATION);
return 1;
}
DLL_EXPORT BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
You could try to add "-Wl,--add-stdcall-alias" to your linker flags.
Furthermore you could check the exported functions of the DLL with Dependency Walker.
I changed the linker options but still... :(
I didn't find the dependency walker (my first day in Code::Blocks, sorry) but i asked Code::Blocks to create the .def file and I looked at it and saw that the "SomeFunction" is referenced inside.
http://www.dependencywalker.com/
Tim S
With Dependency Walker, you can do Profile->Start Profiling on Excel.exe to see what problems Excel encounters when it loads your dll, or when it calls functions from your dll.
Hello,
Sorry to be late to be back to this post; I had to switch on another task. I came back to my question only today. I tried dependencywalker and saw Excel failed to load other DLLs, I suppressed these links and then Excel could load my dll and the above code worked. :D :D
I am not expert on MS products and it is the only explanation that I can find now. Anyway thanks to those who answered me.
Now I have a much more basic question about code::blocks. When I choose to build a project that is a DLL, code::blocks only offers to compile in C; what should I do to make it compile in C++ ( I used before other C++ IDE on different platforms and here I made the standard installation of Code::Blocks).
It sounds good, I might be able to use something else than MS products...
Thanks again :D
Patrick