Marco, Babu,
I have modified FWH samples\babudll.prg to include the DLL required C source code, so now there is no need to link maindll.obj

Please remember to remove maindll.obj from buildhd.bat and also remove the -aa flag for ilink32.
I have tested it with Harbour and it is working fine. Next I will test it with xHarbour, though it should work fine also.
babudll.prg
// To build BabuDLL.dll do: buildhd.bat babuDLL
// To run this DLL, do buidh.bat Babu.prg
function Test()
  MsgInfo( "Hello from inside the DLL!" )
 Â
return nil Â
function Test2( cMsg1, cMsg2 )
  MsgInfo( cMsg1, cMsg2 )
return nil
#pragma BEGINDUMP
#include <windows.h>
#include <hbvm.h>
#include <hbapiitm.h>
BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, DWORD fdwReason,
              LPVOID lpvReserved )
{
  HB_SYMBOL_UNUSED( hinstDLL );
  HB_SYMBOL_UNUSED( fdwReason );
  HB_SYMBOL_UNUSED( lpvReserved );
  switch( fdwReason )
  {
   case DLL_PROCESS_ATTACH:
      MessageBox( 0, "DLL properly loaded", "DLL entry", 0 );
      hb_vmInit( HB_FALSE );
      break;
   case DLL_PROCESS_DETACH:
      MessageBox( 0, "DLL unloaded", "DLL exit", 0 );
      break;
  }   Â
 Â
  return TRUE;
}
void pascal __export HBDLLENTRY( char * cProcName )
{
  hb_itemDoC( cProcName, 0 );
} Â
void pascal __export HBDLLENTRY2( char * cProcName, PHB_ITEM pParam1, PHB_ITEM pParam2 )
{
  hb_itemDoC( cProcName, 2, pParam1, pParam2 );
} Â
#pragma ENDDUMP
babu.prg:
// Using Harbour DLLs
// To build BabuDLL.dll do: buildhd.bat babuDLL
#include "FiveWin.ch"
static hDLL
function Main()
  local hItem1 := ItemNew( "Hello world!" )
  local hItem2 := ItemNew( "From a Harbour DLL" )
  hDLL = LoadLibrary( "babudll.dll" )
  HbDllEntry( "TEST" )
  HbDLLEntry2( "TEST2", hItem1, hItem2 )
 Â
  ItemRelease( hItem1 )
  ItemRelease( hItem2 )
 Â
  MsgInfo( "back from EXE" )
 Â
  FreeLibrary( hDLL )
return nil
DLL FUNCTION HBDLLENTRY( cProc AS LPSTR ) AS LONG PASCAL LIB hDLL
DLL FUNCTION HBDLLENTRY2( cProc AS LPSTR, pItem1 AS LONG, pItem2 AS LONG ) AS LONG PASCAL LIB hDLL
#pragma BEGINDUMP
#include <hbapi.h>
#include <hbapiitm.h>
HB_FUNC( ITEMNEW )
{
  hb_retnl( ( unsigned long ) hb_itemNew( hb_param( 1, HB_IT_ANY ) ) );
}
HB_FUNC( ITEMRELEASE )
{
  hb_retl( hb_itemRelease( ( PHB_ITEM ) hb_parnl( 1 ) ) );
}
#pragma ENDDUMP
Please notice that in order to use "static hDLL" from babu.prg these changes are required in FWH dll.ch.
dll.ch:
// Copyright FiveTech 1993-2011
#ifndef _DLL_CH
#define _DLL_CH
#ifndef _C_TYPES
  #define _C_TYPES
  #define VOID   0
  #define BYTE   1
  #define CHAR   2
  #define WORD   3
#ifdef __CLIPPER__
  #define _INT   4     // conflicts with Clipper Int()
#else
  #define _INT   7
#endif
  #define BOOL   5
  #define HDC    6
  #define LONG   7
  #define STRING  8
  #define LPSTR   9
  #define PTR   10
  #define _DOUBLE 11     // conflicts with BORDER DOUBLE
  #define DWORD  12
#endif
#translate NOREF([@]<x>) => <x>
#ifndef __HARBOUR__
 #ifndef __XPP__
   #ifndef __CLIPPER__
    #ifndef __C3__
      #define __CLIPPER__
    #endif
   #endif
 #endif
#endif
#ifndef __CLIPPER__
  #translate DLL32 => DLL
#endif
//----------------------------------------------------------------------------//
#xcommand DLL [<static:STATIC>] FUNCTION <FuncName>( [ <uParam1> AS <type1> ] ;
                           [, <uParamN> AS <typeN> ] ) ;
       AS <return> [<pascal:PASCAL>] [ FROM <SymName> ] LIB <*DllName*> ;
    => ;
     [<static>] function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
       local _hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLibrary( <(DllName)> ) ) ;;
       local uResult ;;
       local cFarProc ;;
       if Abs( _hDLL ) > 32 ;;
        cFarProc = GetProcAdd( _hDLL,;
        If( [ Empty( <SymName> ) == ] .t., <(FuncName)>, <SymName> ),;
        [<.pascal.>], <return> [,<type1>] [,<typeN>] ) ;;
        uResult = FWCallDLL( cFarProc [,<uParam1>] [,<uParamN>] ) ;;
        If( ValType( <DllName> ) == "N",, FreeLibrary( _hDLL ) ) ;;
       else ;;
        MsgAlert( "Error code: " + LTrim( Str( _hDLL ) ) + " loading " + ;
        If( ValType( <DllName> ) == "C", <DllName>, Str( <DllName> ) ) ) ;;
       end ;;
     return uResult
//----------------------------------------------------------------------------//
#xcommand DLL32 [<static:STATIC>] FUNCTION <FuncName>( [ <uParam1> AS <type1> ] ;
                           [, <uParamN> AS <typeN> ] ) ;
       AS <return> [<pascal:PASCAL>] [ FROM <SymName> ] LIB <*DllName*> ;
    => ;
     [<static>] function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
       local _hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLib32( <(DllName)> ) ) ;;
       local uResult ;;
       local cFarProc ;;
       if Abs( _hDLL ) <= 32 ;;
        MsgAlert( "Error code: " + LTrim( Str( _hDLL ) ) + " loading " + <DllName> ) ;;
       else ;;
        cFarProc = GetProc32( _hDLL,;
        If( [ Empty( <SymName> ) == ] .t., <(FuncName)>, <SymName> ),;
        [<.pascal.>], <return> [,<type1>] [,<typeN>] ) ;;
        uResult = FWCallDLL32( cFarProc [,<uParam1>] [,<uParamN>] ) ;;
        If( ValType( <DllName> ) == "N",, FreeLib32( _hDLL ) ) ;;
       end ;;
     return uResult
#endif
//----------------------------------------------------------------------------//
You can download the source code, EXE and DLL from here:
http://code.google.com/p/fivewin-contributions/downloads/detail?name=babudll.zop&can=2&q=