Here is a long quote from an MSDN article titled
"Calling DLL Functions from Visual Basic Applications"
 
In order for Visual Basic applications ... to call functions in a C/C++ DLL,
the functions must be exported ... as __stdcall. This creates the correct
calling convention for the function (the called function cleans up the stack
and parameters are passed from right to left) but decorates the function
name differently. So, when __declspec(dllexport) is used on an exported
function in a DLL, the decorated name is exported instead of the desired ...
name ... . The __stdcall name decoration prefixes the symbol name with an
underscore (_) and appends the symbol with an at sign (@) character followed
by the number of bytes in the argument list (the required stack space). So,
the function when declared as:
 
  int  __stdcall func (int a, double b)
 
is decorated as:
 
  _func@12
 
Because there is no way to override where the stack clean up occurs, you
must use __stdcall. To undecorate names with __stdcall, you must specify
them by using aliases in the EXPORTS section of the .DEF file. This is shown
below for the following function declaration:
 
  int  __stdcall MyFunc (int a, double b);
  void __stdcall InitCode (void);
 
In the .DEF file:
 
  EXPORTS
      MYFUNC=_MyFunc@12
      INITCODE=_InitCode@0
 
For DLLs to be called by programs written in the 32-bit version of Visual
Basic version 4.0, the alias technique shown in this article is needed in
the .DEF file. If alias is done in the Visual Basic program, use of aliasing
in the .DEF file is not necessary. It can be done on the Visual Basic
program by adding an alias clause to the declare statement as shown here:
 
Declare Function MyFunc Lib "dlllibname" Alias "_MyFunc@12"  (...)
As Integer
 
The complete syntax for the Visual Basic declare statement follows:
 
[Public | Private ] Declare Function name Lib
    "libname" [Alias "aliasname" ] [([arglist])][As type]
 
