News:

Accounts with zero posts and zero activity during the last months will be deleted periodically to fight SPAM!

Main Menu

Excel and dll compiled in Code:blocks

Started by Koryf21, October 04, 2007, 03:14:01 PM

Previous topic - Next topic

Koryf21

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

alchemist

#1
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
Kind Regards,
Xavier Miller.
[url="http://xaviermiller.be"]http://xaviermiller.be[/url]

Koryf21

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

Mahobi

Hello,

maybe this could help you:
http://www.mingw.org/MinGWiki/index.php/VB-MinGW-DLL

VB and VBA have some restrictions usung standard dlls.

Koryf21

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
}

Mahobi

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.

Koryf21

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.

stahta01

C Programmer working to learn more about C++.
On Windows 10 64 bit and Windows 11 64 bit.
--
When in doubt, read the CB WiKi FAQ. [url="http://wiki.codeblocks.org"]http://wiki.codeblocks.org[/url]

rjmyst3

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.
[url="http://wxformbuilder.org"]http://wxformbuilder.org[/url]

Koryf21

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