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