Re: Exported function mangaled name



Thank you Joseph, I know all these (a to c) but I used the example just to
focus on the issue that I am facing. I am working on a huge product
(hundreds of files) with many DLLs and supporting this for Windows 32 bit
and 64 bit. I know the work around i.e. using def file etc. but my question
is pretty much simple:

Why there is a difference in exported names for same source code compiled
for Win32 and Win64, while theoretically there should be no. Is it a VS2005
bug or some undocumented change ?

Regards,
Manish K. Agarwal


"Joseph M. Newcomer" <newcomer@xxxxxxxxxxxx> wrote in message
news:2h4po49rck4ebim51dbbsigkosko04ke79@xxxxxxxxxx
See below...
On Fri, 6 Feb 2009 17:07:40 +0530, "Manish Agarwal"
<manishkrishan@xxxxxxxxxxx> wrote:

Hi,

I am exporting following function:

TestFunc.h

extern "C" {
__declspec(dllexport) int __stdcall TestFunc(void);
}


TestFunc.cpp

****
Put
extern "C"
before this declaration. You have otherwise defined a function unrelated
to the header
specification.

extern "C" __declspec(dllexport) int __stdcall TestFunc(void);

Note several things:
(a) you cannot declare it as __declspec(dllexport) in the header file if
the clients use
that header file; it must be declared as __declspec(dllimport)
(b) You don't need to specify (void), because () works just as well and
means the same
thing
(c) You have to declare the function the same way in your .cpp file as in
your .h file

That is, the usual technique is to do, for your .h file

#pragma once
#ifdef _SOME_GUID_BASED_SYMBOL
#define LIBSPEC __declspec(dllexport)
#else
#define LIBSPEC __declspec(dllimport)
#endif
extern "C" {
LIBSPEC int __stdcall TestFuc();
}
#undef LIBSPEC

and in building your DLL, you write in the .cpp file:

#include "stdafx.h"
#define _SOME_GUID_BASED_SYMBOL
#include "TestFunc.h"

extern "C" __declspec(dllexport) int __stdcall TestFunc()
{
... function body
}

See my essay on The Ultimate DLL Header File on my MVP Tips site.
****
__declspec(dllexport) int __stdcall TestFunc(void)
{
return 42;
}

When I compile the above with VS2005 for Windows 32 bit, the decorated
function name is "_TestFunc@0"

and when I compile it with VS2005 for Windows 64 bit, the decorated
function
name is "TestFunc"

Why there is a difference, what I am missing here. Is it documented some
where ? Even I created a simple DLL using VS wizard and copied all project
setting for Win64 from Win32 settings. Nothing I changed manually in
project
setting.

Regards,
Manish K. Agarwal

PS: Sorry I have to post it again because on other group, I was uanble to
get the exact answer.

Joseph M. Newcomer [MVP]
email: newcomer@xxxxxxxxxxxx
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm


.



Relevant Pages

  • Re: Calling C++ DLL from VB
    ... > I am trying to call functions in a DLL that is supplied by a hardware ... > there is a problem - the program cannot find the entry point in the DLL. ... > declare the function as usual: ... Post the declaration in the header file you use to compile your C++ ...
    (microsoft.public.vb.com)
  • Re: Calling C++ DLL from VB
    ... > I am trying to call functions in a DLL that is supplied by a hardware ... > there is a problem - the program cannot find the entry point in the DLL. ... > declare the function as usual: ... Post the declaration in the header file you use to compile your C++ ...
    (microsoft.public.vb.general.discussion)
  • Re: Delaring a DLL in VB 6.0
    ... Jeff A wrote: ... the header file shows the calls to DLL. ...
    (microsoft.public.vb.general.discussion)
  • RE: Delaring a DLL in VB 6.0
    ... I'm not up on C++ at all but I'm wondering if ur looking for the declare ... statement to reference an external dll in vb, if so check out below, ... the header file shows the calls to DLL. ...
    (microsoft.public.vb.general.discussion)
  • Re: Unsigned 32 bit
    ... This helper dll has the base adress 0x02400000. ... Its equivalent VB declare is ... Dim MyVar As Long, AdressOfMyVar1 As Long, AdressOfMyVar2 As Long ... Both project internal adresses are inside the jump table VB has build. ...
    (microsoft.public.vb.general.discussion)