My present code seems to work and looks like:

extern "C" void __stdcall stdway(char * string, char *str)

and I use a DEF file (the C++ one, not the MB one), such as:

LIBRARY waysyn1
EXPORTS
               stdway @1

This seems to work in C/C++ (V6), VBA and MB; with the DEF function, the exported name 
ends up to be stdway and not _stdway@8.

In MB, the declaration is:

Declare Sub stdway Lib "waysyn1.dll" (ByVal str1 As String, str2 As String)

Thanks for your help

Pierre Henrotay
Siemens Information and Communications
mailto:[EMAIL PROTECTED]
http://www.siemens.be/ic



> -----Original Message-----
> From: [EMAIL PROTECTED] [SMTP:[EMAIL PROTECTED]]
> Sent: Wednesday, December 04, 2002 1:47 PM
> To:   HENROTAY PIERRE
> Cc:   [EMAIL PROTECTED]
> Subject:      SV: MI-L DLLs and MapBasic: calling convention ? (2)
> 
> Pierre - 
> 
> You can use the functions from MapBasic with the "mangled" names:
> 
> When you compile the functions with __stdcall in vc 6.0 you'll get the
> following "name decoration" :
> 
> 1) the function name gets prefixed with "_"
> 2) the function name get postfixed with "@nn" where nn is the size in bytes
> of the all the function arguments. 
>    Strings is always transferred from MapBasic as char pointers, and
> pointers are 4 bytes
> 
> example (from MITAB opensource library to read and write binary tab-files) :
> 
> Declare Function mitab_c_get_text_vb Lib "mitab.dll" 
>   Alias "_mitab_c_get_text_vb@12" 
>   (ByVal feature As Integer, ByVal text As String, ByVal l As Integer) As
> Integer
> 
> mitab_c_get_text_vb becomes: _mitab_c_get_text_vb@12  
> size of argumentlist: 1 Mapbasic Integer, (4 bytes) + 1 textstring, pointer
> (4 bytes) + 1 MapBasic Integer( 4 bytes) = 12 Bytes
>  
> regards 
> Bo Thomsen
> GeoConsult
> 
> -----Oprindelig meddelelse-----
> Fra: HENROTAY PIERRE [mailto:[EMAIL PROTECTED]]
> Sendt: 4. december 2002 11:26
> Til: '[EMAIL PROTECTED]'
> Emne: MI-L DLLs and MapBasic: calling convention ? (2)
> 
> 
> 
> I was asking recently the following question (thanks to Warren Vick and Bo
> Thomsen for their input !)
> 
> "I am creating DLLs in VC++, to be called from MB.
> By default, the argument uses the __cdecl argument passing convention
> (caller pops the stack).
> Is this OK or should I use __stdcall (the Pascal convention, called function
> pops the stack)."
> 
> I need to add a few more info:
> 
> 1) The DLLs are supposed to be accessible from MB, VB(A), C/C++ etc...
> 
> 2) VBA cannot use DLLs with the __cdecl calling convention (Knowledge Base
> Article 213554): this leads to error 49, "Bad DLL calling convention";
> __stdcall is required (which is the case for most 32 bits DLL included with
> Windows).
> 
> 3) The MB user guide says (chapter 10) nothing about whether __stdcall or
> __cdecl should be used, only to not use __fastcall. It does not say that MB
> (caller) is able to pop the stack; if not properly done, this is likely lead
> to problems at some time.
> 
> So my present conclusion is that __stdcall is required. Problem is that this
> convention leads to name decoration (name is postfixed with @ and number of
> bytes for arg list). A VC++ DEF file is thus required to get the proper
> final name. Still investigating on this.
> 
> 
> Pierre Henrotay
> Siemens Information and Communications
> Siemens Business Services s.a./n.v.
> 
> 
> ---------------------------------------------------------------------
> List hosting provided by Directions Magazine | www.directionsmag.com |
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> Message number: 4412

---------------------------------------------------------------------
List hosting provided by Directions Magazine | www.directionsmag.com |
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Message number: 4416

Reply via email to