INFO: Exporting PASCAL-Like Symbols in 32-bit DLLsLast reviewed: December 17, 1997Article ID: Q140485 |
The information in this article applies to:
SUMMARYThere is no _pascal keyword in the 32-bit editions of Visual C++. Instead the Windef.h header file has PASCAL defined as __stdcall. This creates the correct style calling convention for the function (the called function cleans up the stack) but decorates the function name differently. So, when __declspec(dllexport) is used (in a .dll file, for example), the decorated name is exported instead of the desired PASCAL style name, which is undecorated and all uppercase.
MORE INFORMATIONPASCAL name decoration is simply the undecorated symbol name in uppercase letters. __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@12The C calling convention (__cdecl) decorates the name as _func. Whereas the desired PASCAL style name is FUNC. To get the decorated name set the Generate Mapfile option in the Linker General category setting. Use of __declspec(dllexport) does the following:
Because there is no way to override who does the stack clean up, 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@0For .dll files to be called by programs written in the 32-bit versions of Visual Basic (versions 4.0 and above), 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 IntegerThe complete syntax for the Visual Basic Declare statement follows:
[Public | Private ] Declare Function name Lib "libname" [Alias "aliasname" ] [([arglist])][As type] ReferencesFor more information, query the MSDN compact disc using these keywords:
VB alias DLLNOTE: A very good discussion (with example code) of calling a C .dll file from Visual Basic can be found in the file Vb4dll.txt in the Visual Basic directory. If you can not locate the Vb4dll.txt file, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q150705 TITLE : SAMPLE: Using VB4DLL.txt File to Develop .dlls for Visual Basic |
Additional query words: 9.00 9.10 PASCAL declspec VB DLL _stdcall
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |