Supongo que trabajas con Visual C. Una DLL es como cualquier otro programa desde el punto de vista del desarrollador. Tienes una función DllMain para que inicialices la librería (si es necesario).
Esencialmente, sólo tienes que declarar la clase, estructura, función, enumeración, etc, que quieras exportar, prefijandola con __declspec(dllexport):
class __declspec(dllexport) MiClase
{
};
Con esto, el compilador se encargará de exportar dicha clase. Para importarla, sólo tienes que agregar la siguiente declaración:
extern class __declspec(dllimport) CMiClase;
y referenciarla en las propiedades del proyecto para que el compilador enlace tu otro programa con la DLL.
Importar una función desde VB es sencllo. Supongamos la siguiente función:
int __declspec(dllexport) HacerAlgo(int i);
Para importarla desde VB pones una sentencia "Declare":
Declare Function HacerAlgo Lib "TuLib.dll" _
Alias "HacerAlgo" (ByVal i As Integer) As Integer
Ahora bien, aguas con el tipo de dato. En VB los tipos de datos pueden diferir, como el caso de String. En VB un String es equivalente a un BSTR de C++ y Windows, no a un char*. Puedes pasar estructuras siempre y cuando las extrapoles a VB con un Type ... End Type.
Pero no puedes pasar clases directamente. Esto es porque las "clases" de VB son objetos COM. Entonces, tendrías que hacer un objeto COM y hacer un archivo IDL (el cuál VB entenderá) correspondiente.
Saludos.