diff --git a/src/encode/lzh.h b/src/encode/lzh.h
index 4dcd751b595ee73393daf970b17ba25578c2b837..f34ef7ad0224cfc6768eb3986778aa185074ca82 100644
--- a/src/encode/lzh.h
+++ b/src/encode/lzh.h
@@ -39,8 +39,8 @@
 	#ifndef __FLAT__
 		#define __FLAT__
 	#endif
-	#ifdef LZH_VB_COMPATIBLE
-		#define LZHCALL __stdcall	/* VB Compatible */
+	#ifdef __BORLANDC__
+		#define LZHCALL __stdcall
 	#else
 		#define LZHCALL
 	#endif
diff --git a/src/sbbs3/bbs_thrd.h b/src/sbbs3/bbs_thrd.h
index d83e37e89e304b8efb0e04016ba0a1c6d5d2e511..8af8421fbbfa537e722c350443151c7c9057d34c 100644
--- a/src/sbbs3/bbs_thrd.h
+++ b/src/sbbs3/bbs_thrd.h
@@ -42,20 +42,33 @@
 extern "C" {
 #endif
 
+#ifdef DLLEXPORT
+#undef DLLEXPORT
+#endif
+#ifdef DLLCALL
+#undef DLLCALL
+#endif
+
 #ifdef _WIN32
-	#ifdef SBBS
-		#define BBS_CALL __declspec( dllexport )
+	#ifdef SBBS_EXPORTS
+		#define DLLEXPORT __declspec(dllexport)
+	#else
+		#define DLLEXPORT __declspec(dllimport)
+	#endif
+	#ifdef __BORLANDC__
+		#define DLLCALL __stdcall
 	#else
-		#define BBS_CALL __declspec( dllimport )
+		#define DLLCALL
 	#endif
-#else	/* !_WIN32 */
-	#define BBS_CALL
+#else
+	#define DLLEXPORT
+	#define DLLCALL
 #endif
 
 /* arg is pointer to static bbs_startup_t* */
-BBS_CALL void	bbs_thread(void* arg);
-BBS_CALL void	bbs_terminate(void);
-BBS_CALL char*	bbs_ver(void);
+DLLEXPORT void	DLLCALL bbs_thread(void* arg);
+DLLEXPORT void	DLLCALL bbs_terminate(void);
+DLLEXPORT char*	DLLCALL bbs_ver(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c
index cb762b47f95b122ead8138825cc588bf537330eb..72a204762ac2e21ddc7c44436c55c99f90cc458f 100644
--- a/src/sbbs3/filedat.c
+++ b/src/sbbs3/filedat.c
@@ -42,7 +42,7 @@
 /* Need fields .name ,.dir and .offset to get other info    				*/
 /* Does not fill .dateuled or .datedled fields.                             */
 /****************************************************************************/
-BOOL getfiledat(scfg_t* cfg, file_t* f)
+BOOL DLLCALL getfiledat(scfg_t* cfg, file_t* f)
 {
 	char buf[F_LEN+1],str[256],tmp[128];
 	int file;
@@ -114,7 +114,7 @@ BOOL getfiledat(scfg_t* cfg, file_t* f)
 /* Puts filedata into DIR_code.DAT file                                     */
 /* Called from removefiles                                                  */
 /****************************************************************************/
-BOOL putfiledat(scfg_t* cfg, file_t* f)
+BOOL DLLCALL putfiledat(scfg_t* cfg, file_t* f)
 {
     char buf[F_LEN+1],str[256],tmp[128];
     int file;
@@ -168,7 +168,7 @@ BOOL putfiledat(scfg_t* cfg, file_t* f)
 /* changes the .datoffset field only                                        */
 /* returns 1 if added successfully, 0 if not.								*/
 /****************************************************************************/
-BOOL addfiledat(scfg_t* cfg, file_t* f)
+BOOL DLLCALL addfiledat(scfg_t* cfg, file_t* f)
 {
 	char	str[256],fname[13],c,fdat[F_LEN+1];
 	char	tmp[128];
@@ -358,7 +358,7 @@ BOOL addfiledat(scfg_t* cfg, file_t* f)
 /* Need fields .name and .dir filled.                                       */
 /* only fills .offset, .dateuled, and .datedled                             */
 /****************************************************************************/
-BOOL getfileixb(scfg_t* cfg, file_t* f)
+BOOL DLLCALL getfileixb(scfg_t* cfg, file_t* f)
 {
 	char			str[256],fname[13];
 	uchar HUGE16 *	ixbbuf;
@@ -414,7 +414,7 @@ BOOL getfileixb(scfg_t* cfg, file_t* f)
 /****************************************************************************/
 /* Removes DAT and IXB entries for the file in the struct 'f'               */
 /****************************************************************************/
-BOOL removefiledat(scfg_t* cfg, file_t* f)
+BOOL DLLCALL removefiledat(scfg_t* cfg, file_t* f)
 {
 	char	c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13];
     int		file;
@@ -486,7 +486,7 @@ BOOL removefiledat(scfg_t* cfg, file_t* f)
 /* it returns the 1, else returns 0.                                        */
 /* Called from upload and bulkupload                                        */
 /****************************************************************************/
-BOOL findfile(scfg_t* cfg, uint dirnum, char *filename)
+BOOL DLLCALL findfile(scfg_t* cfg, uint dirnum, char *filename)
 {
 	char str[256],c,fname[13],HUGE16 *ixbbuf;
     int file;
@@ -525,7 +525,7 @@ BOOL findfile(scfg_t* cfg, uint dirnum, char *filename)
 /****************************************************************************/
 /* Turns FILE.EXT into FILE    .EXT                                         */
 /****************************************************************************/
-char * padfname(char *filename, char *str)
+char* DLLCALL padfname(char *filename, char *str)
 {
     char c,d;
 
@@ -549,7 +549,7 @@ char * padfname(char *filename, char *str)
 /****************************************************************************/
 /* Turns FILE    .EXT into FILE.EXT                                         */
 /****************************************************************************/
-char * unpadfname(char *filename, char *str)
+char* DLLCALL unpadfname(char *filename, char *str)
 {
     char c,d;
 
@@ -563,7 +563,7 @@ char * unpadfname(char *filename, char *str)
 /* Removes any files in the user transfer index (XFER.IXT) that match the   */
 /* specifications of dest, or source user, or filename or any combination.  */
 /****************************************************************************/
-BOOL rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname)
+BOOL DLLCALL rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname)
 {
     char str[256],*ixtbuf;
     int file;
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index f3272a50b7147e8faa96940374f33bb030358cf7..40e038a232cec82b32f8aff41c8c9cd7adc100f0 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -56,11 +56,8 @@
 #include <sys/stat.h>		/* S_IWRITE */
 
 /* Synchronet-specific headers */
-#include "sbbsinet.h"
-#include "sbbswrap.h"
-#include "scfgdefs.h"
+#include "sbbs.h"
 #include "ftpsrvr.h"
-#include "userdat.h"
 #include "telnet.h"
 
 /* Constants */
@@ -86,27 +83,6 @@
 static const char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
             ,"Jul","Aug","Sep","Oct","Nov","Dec"};
 
-#ifdef _WIN32
-	#define IMPORT	__declspec(dllimport)
-#else
-	#define IMPORT
-#endif
-
-IMPORT BOOL	load_cfg(scfg_t* cfg, char* text[]);
-
-IMPORT BOOL	getfileixb(scfg_t* cfg, file_t* f);
-IMPORT BOOL	getfiledat(scfg_t* cfg, file_t* f);
-
-IMPORT BOOL	putfiledat(scfg_t* cfg, file_t* f);
-IMPORT BOOL	removefiledat(scfg_t* cfg, file_t* f);
-IMPORT BOOL addfiledat(scfg_t* cfg, file_t* f);
-IMPORT BOOL	findfile(scfg_t* cfg, uint dirnum, char *filename);
-
-IMPORT char*	padfname(char *filename, char *str);
-IMPORT char*	unpadfname(char *filename, char *str);
-
-IMPORT BOOL	trashcan(scfg_t* cfg, char *insearch, char *name);
-
 BOOL direxist(char *dir)
 {
 	if(access(dir,0)==0)
@@ -466,7 +442,7 @@ int sockreadline(SOCKET socket, char* buf, int len, time_t* lastactive)
 	return(rd);
 }
 
-void ftp_terminate(void)
+void DLLCALL ftp_terminate(void)
 {
 	if(server_socket!=INVALID_SOCKET) {
     	lprintf("FTP Terminate: closing socket %d",server_socket);
@@ -2925,7 +2901,7 @@ static void cleanup(int code)
 	thread_down();
 }
 
-char* ftp_ver(void)
+char* DLLCALL ftp_ver(void)
 {
 	static char ver[256];
 	char compiler[32];
@@ -2945,7 +2921,7 @@ char* ftp_ver(void)
 	return(ver);
 }
 
-void ftp_server(void* arg)
+void DLLCALL ftp_server(void* arg)
 {
 	char			compiler[32];
 	SOCKADDR_IN		server_addr;
diff --git a/src/sbbs3/ftpsrvr.h b/src/sbbs3/ftpsrvr.h
index 93f33c3ce44efbd9b9d6dd165266acdd8a3b2d92..c625e18634d48653064e8ebbe395488688856e36 100644
--- a/src/sbbs3/ftpsrvr.h
+++ b/src/sbbs3/ftpsrvr.h
@@ -95,23 +95,36 @@ typedef struct {
 #define FTP_OPT_NO_HOST_LOOKUP	(1<<11)
 #define FTP_OPT_MUTE			(1<<31)
 
+#ifdef DLLEXPORT
+#undef DLLEXPORT
+#endif
+#ifdef DLLCALL
+#undef DLLCALL
+#endif
+
 #ifdef _WIN32
 	#ifdef FTPSRVR_EXPORTS
-		#define FTP_CALL __declspec( dllexport )
+		#define DLLEXPORT __declspec(dllexport)
+	#else
+		#define DLLEXPORT __declspec(dllimport)
+	#endif
+	#ifdef __BORLANDC__
+		#define DLLCALL __stdcall
 	#else
-		#define FTP_CALL __declspec( dllimport )
+		#define DLLCALL
 	#endif
-#else	/* !_WIN32 */
-	#define FTP_CALL
+#else
+	#define DLLEXPORT
+	#define DLLCALL
 #endif
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 /* arg is pointer to static ftp_startup_t */
-FTP_CALL void	ftp_server(void* arg);
-FTP_CALL void	ftp_terminate(void);
-FTP_CALL char*	ftp_ver(void);
+DLLEXPORT void	DLLCALL ftp_server(void* arg);
+DLLEXPORT void	DLLCALL ftp_terminate(void);
+DLLEXPORT char*	DLLCALL ftp_ver(void);
 #ifdef __cplusplus
 }
 #endif
\ No newline at end of file
diff --git a/src/sbbs3/load_cfg.c b/src/sbbs3/load_cfg.c
index 357144be8e44da8924daba84074851572416efac..cf0565cfdfc5fc44b7bdc21682cf3a93d16ce9ca 100644
--- a/src/sbbs3/load_cfg.c
+++ b/src/sbbs3/load_cfg.c
@@ -40,7 +40,7 @@
 /****************************************************************************/
 /* Initializes system and node configuration information and data variables */
 /****************************************************************************/
-BOOL load_cfg(scfg_t* cfg, char* text[])
+BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[])
 {
 	char	str[256],fname[13];
 	int		i;
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 9e1575189af754b6cc0895056d792fbc3e24cfc1..0bfba52895200c99b3e2378a619be0669251ad64 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -54,32 +54,13 @@
 #include <errno.h>			/* errno */
 
 /* Synchronet-specific headers */
-#include "scfgdefs.h"
+#include "sbbs.h"
 #include "mailsrvr.h"
-#include "userdat.h"
-#include "smblib.h"
 #include "crc32.h"
-#include "sbbsinet.h"
-#include "sbbswrap.h"
 
 /* Constants */
 #define MAIL_VERSION "1.10"
 
-#ifdef _WIN32
-#define IMPORT	__declspec(dllimport)
-#else
-#define IMPORT
-#endif
-
-IMPORT BOOL		load_cfg(scfg_t* cfg, char* text[]);
-IMPORT ushort	crc16(char *str);
-IMPORT char *	zonestr(short zone);
-IMPORT int		putsmsg(scfg_t* cfg, int usernumber, char *strin);
-IMPORT mail_t*	loadmail(smb_t* smb, ulong* msgs, uint usernumber
-									,int which, long mode);
-IMPORT void		freemail(mail_t* mail);
-IMPORT BOOL		trashcan(scfg_t* cfg, char *insearch, char *name);
-
 int dns_getmx(char* name, char* mx, char* mx2, DWORD intf, DWORD ip_addr, BOOL use_tcp);
 
 #define SMTP_OK		"250 OK"
@@ -2210,7 +2191,7 @@ static void sendmail_thread(void* arg)
 	thread_down();
 }
 
-void mail_terminate(void)
+void DLLCALL mail_terminate(void)
 {
 	if(server_socket!=INVALID_SOCKET) {
     	lprintf("MAIL Terminate: closing socket %d",server_socket);
@@ -2245,7 +2226,7 @@ static void cleanup(int code)
 	thread_down();
 }
 
-char* mail_ver(void)
+char* DLLCALL mail_ver(void)
 {
 	static char ver[256];
 	char compiler[32];
@@ -2267,7 +2248,7 @@ char* mail_ver(void)
 	return(ver);
 }
 
-void mail_server(void* arg)
+void DLLCALL mail_server(void* arg)
 {
 	char			compiler[32];
 	SOCKADDR_IN		server_addr;
diff --git a/src/sbbs3/mailsrvr.h b/src/sbbs3/mailsrvr.h
index 7fd0384439cd7b48101c877ce540b35c311a3b0d..979686999a08cef1eb58c8269ec8c6f919b1547f 100644
--- a/src/sbbs3/mailsrvr.h
+++ b/src/sbbs3/mailsrvr.h
@@ -102,23 +102,36 @@ typedef struct {
 #define MAIL_OPT_USE_TCP_DNS		(1<<12)
 #define MAIL_OPT_MUTE				(1<<31)
 
+#ifdef DLLEXPORT
+#undef DLLEXPORT
+#endif
+#ifdef DLLCALL
+#undef DLLCALL
+#endif
+
 #ifdef _WIN32
 	#ifdef MAILSRVR_EXPORTS
-		#define MAIL_CALL __declspec( dllexport )
+		#define DLLEXPORT __declspec(dllexport)
+	#else
+		#define DLLEXPORT __declspec(dllimport)
+	#endif
+	#ifdef __BORLANDC__
+		#define DLLCALL __stdcall
 	#else
-		#define MAIL_CALL __declspec( dllimport )
+		#define DLLCALL
 	#endif
-#else /* !_WIN32 */
-	#define MAIL_CALL
+#else
+	#define DLLEXPORT
+	#define DLLCALL
 #endif
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 /* arg is pointer to static mail_startup_t* */
-MAIL_CALL void	mail_server(void* arg);
-MAIL_CALL void	mail_terminate(void);
-MAIL_CALL char*	mail_ver(void);
+DLLEXPORT void	DLLCALL mail_server(void* arg);
+DLLEXPORT void	DLLCALL mail_terminate(void);
+DLLEXPORT char*	DLLCALL mail_ver(void);
 #ifdef __cplusplus
 }
 #endif
\ No newline at end of file
diff --git a/src/sbbs3/misc.c b/src/sbbs3/misc.c
index 66592739d284001648d79a7f5d3ef5542ee1f4e2..30ab0658180d06a1cf08b85f1bd22e05c146dfd6 100644
--- a/src/sbbs3/misc.c
+++ b/src/sbbs3/misc.c
@@ -189,7 +189,7 @@ void ucrc16(uchar ch, ushort *rcrc)
 /****************************************************************************/
 /* Returns CRC-16 of string (not including terminating NULL)				*/
 /****************************************************************************/
-ushort crc16(char *str)
+ushort DLLCALL crc16(char *str)
 {
 	int 	i=0;
 	ushort	crc=0;
@@ -239,7 +239,7 @@ int strsame(char *str1, char *str2)
 /****************************************************************************/
 /* Converts when_t.zone into ASCII format                                   */
 /****************************************************************************/
-char *zonestr(short zone)
+char* DLLCALL zonestr(short zone)
 {
     static char str[32];
 
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 4055cbf3625f6802f0638bdce6d6cc3de9628e43..0d90bb2d5e7f471b2596ce08b5b23730a740ce06 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -669,14 +669,23 @@ public:
 #ifdef DLLEXPORT
 #undef DLLEXPORT
 #endif
+#ifdef DLLCALL
+#undef DLLCALL
+#endif
 #ifdef _WIN32
 	#ifdef SBBS_EXPORTS
 		#define DLLEXPORT	__declspec(dllexport)
 	#else
-		#define DLLEXPORT	
+		#define DLLEXPORT	__declspec(dllimport)
+	#endif
+	#ifdef __BORLANDC__
+		#define DLLCALL __stdcall
+	#else
+		#define DLLCALL
 	#endif
 #else	/* !_WIN32 */
 	#define DLLEXPORT
+	#define DLLCALL
 #endif
 
 #ifdef __cplusplus
@@ -684,27 +693,27 @@ extern "C" {
 #endif
 
 	/* main.cpp */
-	DLLEXPORT 	BOOL	getstats(scfg_t* cfg, char node, stats_t* stats);
+	DLLEXPORT 	BOOL	DLLCALL getstats(scfg_t* cfg, char node, stats_t* stats);
 
 	/* mail.cpp */
-	DLLEXPORT	int		getmail(scfg_t* cfg, int usernumber, BOOL sent);
-	DLLEXPORT	mail_t*	loadmail(smb_t* smb, long* msgs, uint usernumber
+	DLLEXPORT	int		DLLCALL getmail(scfg_t* cfg, int usernumber, BOOL sent);
+	DLLEXPORT	mail_t*	DLLCALL loadmail(smb_t* smb, ulong* msgs, uint usernumber
 										,int which, long mode);
-	DLLEXPORT	void	freemail(mail_t* mail);
+	DLLEXPORT	void	DLLCALL freemail(mail_t* mail);
 
 	/* filedat.c */
-	DLLEXPORT 	BOOL	getfileixb(scfg_t* cfg, file_t* f);
-	DLLEXPORT 	BOOL	getfiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT 	BOOL	putfiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT 	BOOL	removefiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT 	BOOL	addfiledat(scfg_t* cfg, file_t* f);
-	DLLEXPORT 	BOOL	findfile(scfg_t* cfg, uint dirnum, char *filename);
-	DLLEXPORT	char *	padfname(char *filename, char *str);
-	DLLEXPORT	char *	unpadfname(char *filename, char *str);
-	DLLEXPORT	BOOL	rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname);
+	DLLEXPORT 	BOOL	DLLCALL getfileixb(scfg_t* cfg, file_t* f);
+	DLLEXPORT 	BOOL	DLLCALL getfiledat(scfg_t* cfg, file_t* f);
+	DLLEXPORT 	BOOL	DLLCALL putfiledat(scfg_t* cfg, file_t* f);
+	DLLEXPORT 	BOOL	DLLCALL removefiledat(scfg_t* cfg, file_t* f);
+	DLLEXPORT 	BOOL	DLLCALL addfiledat(scfg_t* cfg, file_t* f);
+	DLLEXPORT 	BOOL	DLLCALL findfile(scfg_t* cfg, uint dirnum, char *filename);
+	DLLEXPORT	char *	DLLCALL padfname(char *filename, char *str);
+	DLLEXPORT	char *	DLLCALL unpadfname(char *filename, char *str);
+	DLLEXPORT	BOOL	DLLCALL rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname);
 
 	/* str.cpp */
-	DLLEXPORT	BOOL	trashcan(scfg_t* cfg, char *insearch, char *name);
+	DLLEXPORT	BOOL	DLLCALL trashcan(scfg_t* cfg, char *insearch, char *name);
 
 	/* misc.c */
 	int		nopen(char *str, int access);
@@ -724,13 +733,13 @@ extern "C" {
 	char *	hexplus(uint num, char *str); 	/* Hex plus for 3 digits up to 9000 */
 	uint	hptoi(char *str);
 
-	DLLEXPORT ushort	crc16(char *str);
-	DLLEXPORT char *	zonestr(short zone);
-	DLLEXPORT int		putsmsg(scfg_t* cfg, int usernumber, char *strin);
+	DLLEXPORT ushort	DLLCALL crc16(char *str);
+	DLLEXPORT char *	DLLCALL zonestr(short zone);
+	DLLEXPORT int		DLLCALL putsmsg(scfg_t* cfg, int usernumber, char *strin);
 
 	/* load_cfg.C */
 
-	DLLEXPORT BOOL		load_cfg(scfg_t* cfg, char* text[]);
+	DLLEXPORT BOOL		DLLCALL load_cfg(scfg_t* cfg, char* text[]);
 	char *				readtext(long *line, FILE *stream);
 	BOOL 				md(char *path);
 
diff --git a/src/sbbs3/sbbswrap.h b/src/sbbs3/sbbswrap.h
index c9698a7302e01d041bb9dda74107f9f8067be2c4..71c5ce529508132e4c0d8037b687431c9223f288 100644
--- a/src/sbbs3/sbbswrap.h
+++ b/src/sbbs3/sbbswrap.h
@@ -43,6 +43,9 @@
 #ifdef DLLEXPORT
 #undef DLLEXPORT
 #endif
+#ifdef DLLCALL
+#undef DLLCALL
+#endif
 
 #ifdef _WIN32
 	#ifdef WRAPPER_DLL
@@ -50,8 +53,14 @@
 	#else
 		#define DLLEXPORT	__declspec(dllimport)
 	#endif
+	#ifdef __BORLANDC__
+		#define DLLCALL __stdcall
+	#else
+		#define DLLCALL
+	#endif
 #else	/* !_WIN32 */
 	#define DLLEXPORT
+	#define DLLCALL
 #endif
 
 #ifdef __cplusplus
@@ -81,10 +90,10 @@ extern "C" {
 	#define _mkdir(dir)			mkdir(dir,0777)
 	#define _rmdir(dir)			rmdir(dir)
 
-	DLLEXPORT void	sbbs_beep(int freq, int dur);
-	DLLEXPORT long	filelength(int fd);
-	DLLEXPORT char*	strupr(char* str);
-	DLLEXPORT char*	strlwr(char* str);
+	DLLEXPORT void	DLLCALL sbbs_beep(int freq, int dur);
+	DLLEXPORT long	DLLCALL filelength(int fd);
+	DLLEXPORT char*	DLLCALL strupr(char* str);
+	DLLEXPORT char*	DLLCALL strlwr(char* str);
 
 #else	/* Unsupported OS */
 
@@ -146,7 +155,7 @@ extern "C" {
 #if defined(__BORLANDC__)
 	#define sbbs_random(x)		random(x)
 #else 
-	DLLEXPORT int	sbbs_random(int n);
+	DLLEXPORT int	DLLCALL sbbs_random(int n);
 #endif
 
 #if __BORLANDC__ > 0x0410
@@ -154,16 +163,16 @@ extern "C" {
 #endif
 
 #if !defined(_MSC_VER) && !defined(__BORLANDC__)
-	DLLEXPORT char* ultoa(ulong, char*, int radix);
+	DLLEXPORT char* DLLCALL ultoa(ulong, char*, int radix);
 #endif
 
 
 /* General file system wrappers for all platforms and compilers */
-DLLEXPORT BOOL		fexist(char *filespec);
-DLLEXPORT long		flength(char *filename);
-DLLEXPORT long		fdate(char *filename);
-DLLEXPORT int		getfattr(char* filename);
-DLLEXPORT ulong		getfreediskspace(char* path);
+DLLEXPORT BOOL		DLLCALL fexist(char *filespec);
+DLLEXPORT long		DLLCALL flength(char *filename);
+DLLEXPORT long		DLLCALL fdate(char *filename);
+DLLEXPORT int		DLLCALL getfattr(char* filename);
+DLLEXPORT ulong		DLLCALL getfreediskspace(char* path);
 
 #ifdef __cplusplus
 }
diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index 6e165e710aa9445df74d4eceecfe008fb9d16d49..a782066d4fce5fc3b7e0dfbc96a60f1b1f1e3365 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -715,7 +715,7 @@ void sbbs_t::dirinfo(uint dirnum)
 /* Searches the file <name>.CAN in the TEXT directory for matches			*/
 /* Returns 1 if found in list, 0 if not.									*/
 /****************************************************************************/
-extern "C" BOOL trashcan(scfg_t* cfg, char* insearch, char* name)
+extern "C" BOOL DLLCALL trashcan(scfg_t* cfg, char* insearch, char* name)
 {
 	char*	p;
 	char	str[128];
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 35d97150a0bd33ff82360e83be84b7f01c424b96..f5d457e279ca1d024999b847fa5da48834accdcb 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -47,7 +47,7 @@ char* nulstr="";
 /* Returns the number of the perfect matched username or 0 if no match		*/
 /* Called from functions waitforcall and newuser							*/
 /****************************************************************************/
-uint matchuser(scfg_t* cfg, char *name)
+uint DLLCALL matchuser(scfg_t* cfg, char *name)
 {
 	int file;
 	char str[256],c;
@@ -78,7 +78,7 @@ uint matchuser(scfg_t* cfg, char *name)
 /* Returns the number of the last user in USER.DAT (deleted ones too)		*/
 /* Called from function useredit											*/
 /****************************************************************************/
-uint lastuser(scfg_t* cfg)
+uint DLLCALL lastuser(scfg_t* cfg)
 {
 	char str[256];
 	long length;
@@ -93,7 +93,7 @@ uint lastuser(scfg_t* cfg)
 /* Fills the structure 'user' with info for user.number	from USER.DAT		*/
 /* Called from functions useredit, waitforcall and main_sec					*/
 /****************************************************************************/
-int getuserdat(scfg_t* cfg, user_t *user)
+int DLLCALL getuserdat(scfg_t* cfg, user_t *user)
 {
 	char userdat[U_LEN+1],str[U_LEN+1],tmp[64];
 	int i,file;
@@ -266,7 +266,7 @@ int getuserdat(scfg_t* cfg, user_t *user)
 /* Writes into user.number's slot in USER.DAT data in structure 'user'      */
 /* Called from functions newuser, useredit and main                         */
 /****************************************************************************/
-int putuserdat(scfg_t* cfg, user_t* user)
+int DLLCALL putuserdat(scfg_t* cfg, user_t* user)
 {
     int i,file;
     char userdat[U_LEN+1],str[U_LEN+1];
@@ -418,7 +418,7 @@ int putuserdat(scfg_t* cfg, user_t* user)
 /* Returns the username in 'str' that corresponds to the 'usernumber'       */
 /* Called from functions everywhere                                         */
 /****************************************************************************/
-char *username(scfg_t* cfg, int usernumber,char *strin)
+char* DLLCALL username(scfg_t* cfg, int usernumber,char *strin)
 {
     char str[256];
     char c;
@@ -453,7 +453,7 @@ char *username(scfg_t* cfg, int usernumber,char *strin)
 /* Places into 'strout' CR or ETX terminated string starting at             */
 /* 'start' and ending at 'start'+'length' or terminator from 'strin'        */
 /****************************************************************************/
-void getrec(char *strin,int start,int length,char *strout)
+void DLLCALL getrec(char *strin,int start,int length,char *strout)
 {
     int i=0,stop;
 
@@ -470,7 +470,7 @@ void getrec(char *strin,int start,int length,char *strout)
 /* Places into 'strout', 'strin' starting at 'start' and ending at          */
 /* 'start'+'length'                                                         */
 /****************************************************************************/
-void putrec(char *strout,int start,int length,char *strin)
+void DLLCALL putrec(char *strout,int start,int length,char *strin)
 {
     int i=0,j;
 
@@ -487,7 +487,7 @@ void putrec(char *strout,int start,int length,char *strin)
 /* Called from functions statusline, main_sec, xfer_sec, useredit and 		*/
 /* text files																*/
 /****************************************************************************/
-char getage(scfg_t* cfg, char *birth)
+char DLLCALL getage(scfg_t* cfg, char *birth)
 {
 	char	age;
 	struct	tm * tm;
@@ -529,7 +529,7 @@ char getage(scfg_t* cfg, char *birth)
 /* from NODE.DAB															*/
 /* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */
 /****************************************************************************/
-int getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit)
+int DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit)
 {
 	char str[256];
 	int count=0;
@@ -570,7 +570,7 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit)
 /* getnodedat(num,&node,1); must have been called before calling this func  */
 /*          NOTE: ------^   the indicates the node record has been locked   */
 /****************************************************************************/
-int putnodedat(scfg_t* cfg, uint number, node_t* node)
+int DLLCALL putnodedat(scfg_t* cfg, uint number, node_t* node)
 {
 	char str[256];
 	int file;
@@ -599,7 +599,7 @@ int putnodedat(scfg_t* cfg, uint number, node_t* node)
 }
 
 /****************************************************************************/
-uint userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen, char *dat
+uint DLLCALL userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen, char *dat
     ,BOOL del)
 {
     char	str[256];
@@ -651,7 +651,7 @@ uint userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen, char *d
 /****************************************************************************/
 /* Creates a short message for 'usernumber' than contains 'strin'           */
 /****************************************************************************/
-int putsmsg(scfg_t* cfg, int usernumber, char *strin)
+int DLLCALL putsmsg(scfg_t* cfg, int usernumber, char *strin)
 {
     char str[256];
     int file,i;
@@ -992,7 +992,7 @@ static BOOL ar_exp(scfg_t* cfg, uchar **ptrptr, user_t* user)
 	return(result);
 }
 
-BOOL chk_ar(scfg_t* cfg, uchar *ar, user_t* user)
+BOOL DLLCALL chk_ar(scfg_t* cfg, uchar *ar, user_t* user)
 {
 	uchar *p;
 
@@ -1006,7 +1006,7 @@ BOOL chk_ar(scfg_t* cfg, uchar *ar, user_t* user)
 /* Fills 'str' with record for usernumber starting at start for length bytes*/
 /* Called from function ???													*/
 /****************************************************************************/
-int getuserrec(scfg_t* cfg, int usernumber,int start, int length, char *str)
+int DLLCALL getuserrec(scfg_t* cfg, int usernumber,int start, int length, char *str)
 {
 	char c,path[256];
 	int i,file;
@@ -1054,7 +1054,7 @@ int getuserrec(scfg_t* cfg, int usernumber,int start, int length, char *str)
 /* Places into USER.DAT at the offset for usernumber+start for length bytes */
 /* Called from various locations											*/
 /****************************************************************************/
-int putuserrec(scfg_t* cfg, int usernumber,int start, uint length, char *str)
+int DLLCALL putuserrec(scfg_t* cfg, int usernumber,int start, uint length, char *str)
 {
 	char	str2[256];
 	int		file;
@@ -1109,7 +1109,7 @@ int putuserrec(scfg_t* cfg, int usernumber,int start, uint length, char *str)
 /* Updates user 'usernumber's record (numeric string) by adding 'adj' to it */
 /* returns the new value.													*/
 /****************************************************************************/
-ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj)
+ulong DLLCALL adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj)
 {
 	char str[256],c,path[256];
 	char tmp[32];
@@ -1178,7 +1178,7 @@ ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj
 /* Subtract credits from the current user online, accounting for the new    */
 /* "free credits" field.                                                    */
 /****************************************************************************/
-void subtract_cdt(scfg_t* cfg, user_t* user, long amt)
+void DLLCALL subtract_cdt(scfg_t* cfg, user_t* user, long amt)
 {
 	char tmp[64];
     long mod;
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index 83162c83fa48cf24a652b9e646d13d3378c78b9d..f274d0d8761379bd500305e8019834dd6f08cc7b 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -38,18 +38,27 @@
 #ifndef _USERDAT_H
 #define _USERDAT_H
 
-#ifdef EXPORT32
-#undef EXPORT32
+#ifdef DLLEXPORT
+#undef DLLEXPORT
+#endif
+#ifdef DLLCALL
+#undef DLLCALL
 #endif
 
 #ifdef _WIN32
 	#ifdef SBBS_EXPORTS
-		#define EXPORT32 __declspec(dllexport)
+		#define DLLEXPORT __declspec(dllexport)
+	#else
+		#define DLLEXPORT __declspec(dllimport)
+	#endif
+	#ifdef __BORLANDC__
+		#define DLLCALL __stdcall
 	#else
-		#define EXPORT32 __declspec(dllimport)
+		#define DLLCALL
 	#endif
 #else
-	#define EXPORT32
+	#define DLLEXPORT
+	#define DLLCALL
 #endif
 
 #ifdef __cplusplus
@@ -59,25 +68,25 @@ extern "C" {
 extern char* crlf;
 extern char* nulstr;
 
-EXPORT32 int	getuserdat(scfg_t* cfg, user_t* user); 	/* Fill userdat struct with user data   */
-EXPORT32 int	putuserdat(scfg_t* cfg, user_t* user);	/* Put userdat struct into user file	*/
-EXPORT32 void	getrec(char *instr,int start,int length,char *outstr); /* Retrieve a record from a string */
-EXPORT32 void	putrec(char *outstr,int start,int length,char *instr); /* Place a record into a string */
-EXPORT32 uint	matchuser(scfg_t* cfg, char *str); /* Checks for a username match */
-EXPORT32 uint	lastuser(scfg_t* cfg);
-EXPORT32 char	getage(scfg_t* cfg, char *birthdate);
-EXPORT32 char *	username(scfg_t* cfg, int usernumber, char * str);
-EXPORT32 int	getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit);
-EXPORT32 int	putnodedat(scfg_t* cfg, uint number, node_t *node);
-EXPORT32 uint	userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen, char *dat
-					,BOOL del);
+DLLEXPORT int	DLLCALL getuserdat(scfg_t* cfg, user_t* user); 	/* Fill userdat struct with user data   */
+DLLEXPORT int	DLLCALL putuserdat(scfg_t* cfg, user_t* user);	/* Put userdat struct into user file	*/
+DLLEXPORT void	DLLCALL getrec(char *instr,int start,int length,char *outstr); /* Retrieve a record from a string */
+DLLEXPORT void	DLLCALL putrec(char *outstr,int start,int length,char *instr); /* Place a record into a string */
+DLLEXPORT uint	DLLCALL matchuser(scfg_t* cfg, char *str); /* Checks for a username match */
+DLLEXPORT uint	DLLCALL lastuser(scfg_t* cfg);
+DLLEXPORT char	DLLCALL getage(scfg_t* cfg, char *birthdate);
+DLLEXPORT char*	DLLCALL username(scfg_t* cfg, int usernumber, char * str);
+DLLEXPORT int	DLLCALL getnodedat(scfg_t* cfg, uint number, node_t *node, char lockit);
+DLLEXPORT int	DLLCALL putnodedat(scfg_t* cfg, uint number, node_t *node);
+DLLEXPORT uint	DLLCALL userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen, char *dat
+							,BOOL del);
 
-EXPORT32 BOOL	chk_ar(scfg_t* cfg, uchar* str, user_t* user); /* checks access requirements */
+DLLEXPORT BOOL	DLLCALL chk_ar(scfg_t* cfg, uchar* str, user_t* user); /* checks access requirements */
 
-EXPORT32 int	getuserrec(scfg_t*, int usernumber, int start, int length, char *str);
-EXPORT32 int	putuserrec(scfg_t*, int usernumber, int start, uint length, char *str);
-EXPORT32 ulong	adjustuserrec(scfg_t*, int usernumber, int start, int length, long adj);
-EXPORT32 void	subtract_cdt(scfg_t*, user_t*, long amt);
+DLLEXPORT int	DLLCALL getuserrec(scfg_t*, int usernumber, int start, int length, char *str);
+DLLEXPORT int	DLLCALL putuserrec(scfg_t*, int usernumber, int start, uint length, char *str);
+DLLEXPORT ulong	DLLCALL adjustuserrec(scfg_t*, int usernumber, int start, int length, long adj);
+DLLEXPORT void	DLLCALL subtract_cdt(scfg_t*, user_t*, long amt);
 
 #ifdef __cplusplus
 }
diff --git a/src/sbbs3/wrappers.c b/src/sbbs3/wrappers.c
index 9d72409c5f2e387c51864a2a4f7114ca04f3ff1d..32bcdf7cf155c40e27d8a880be44cbf849ebaf29 100644
--- a/src/sbbs3/wrappers.c
+++ b/src/sbbs3/wrappers.c
@@ -72,7 +72,7 @@
 /* Returns TRUE if it exists, FALSE if it doesn't.                          */
 /* 'filespec' may contain wildcards!										*/
 /****************************************************************************/
-BOOL fexist(char *filespec)
+BOOL DLLCALL fexist(char *filespec)
 {
 #ifdef _WIN32
 
@@ -109,7 +109,7 @@ BOOL fexist(char *filespec)
 /****************************************************************************/
 /* Returns the length of the file in 'filename'                             */
 /****************************************************************************/
-long flength(char *filename)
+long DLLCALL flength(char *filename)
 {
 	STAT st;
 
@@ -122,7 +122,7 @@ long flength(char *filename)
 /****************************************************************************/
 /* Returns the time/date of the file in 'filename' in time_t (unix) format  */
 /****************************************************************************/
-long fdate(char *filename)
+long DLLCALL fdate(char *filename)
 {
 	STAT st;
 
@@ -135,7 +135,7 @@ long fdate(char *filename)
 /****************************************************************************/
 /* Returns the attributes (mode) for specified 'filename'					*/
 /****************************************************************************/
-int getfattr(char* filename)
+int DLLCALL getfattr(char* filename)
 {
 #ifdef _WIN32
 	long handle;
@@ -163,7 +163,7 @@ int getfattr(char* filename)
 /* Returns the length of the file in 'fd'									*/
 /****************************************************************************/
 #ifdef __unix__
-long filelength(int fd)
+long DLLCALL filelength(int fd)
 {
 	STAT st;
 
@@ -179,7 +179,7 @@ long filelength(int fd)
 /* Thanks to Casey Martin for this code										*/
 /****************************************************************************/
 #ifdef __unix__
-void sbbs_beep(int freq, int dur)
+void DLLCALL sbbs_beep(int freq, int dur)
 {
 	static int console_fd=-1;
 
@@ -198,7 +198,7 @@ void sbbs_beep(int freq, int dur)
 /* Return random number between 0 and n-1									*/
 /****************************************************************************/
 #ifndef __BORLANDC__
-int sbbs_random(int n)
+int DLLCALL sbbs_random(int n)
 {
 	float f;
 
@@ -215,7 +215,7 @@ int sbbs_random(int n)
 /* There may be a native GNU C Library function to this...					*/
 /****************************************************************************/
 #if !defined _MSC_VER && !defined __BORLANDC__
-char* ultoa(ulong val, char* str, int radix)
+char* DLLCALL ultoa(ulong val, char* str, int radix)
 {
 	switch(radix) {
 		case 8:
@@ -272,7 +272,7 @@ char* strlwr(char *str)
 		(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); 
 #endif
 
-ulong getfreediskspace(char* path)
+ulong DLLCALL getfreediskspace(char* path)
 {
 #ifdef _WIN32
 	HINSTANCE		hK32;
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index c6e3a6a7101a5cb14b0c6dc092052a62962f6cff..9917136ef6043a1938aff56fa0a837cd3820153a 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -48,8 +48,8 @@
 	#ifndef __FLAT__
 		#define __FLAT__
 	#endif
-	#ifdef SMB_VB_COMPATIBLE
-		#define SMBCALL __stdcall	/* VB Compatible */
+	#ifdef __BORLANDC__
+		#define SMBCALL __stdcall
 	#else
 		#define SMBCALL
 	#endif