Hola Alejandro,
una DLL no debería guardar el estado de nada, ya que debe comportarse como una biblioteca de funciones a la que invocar, y el diseño de las funciones implica una llamada, un proceso, una salida y la liberación de todos los recursos asignados.
Por más que la implementes en C++ y puedas técnicamente escribir la biblioteca al estilo POO, luego la interfaz de la DLL serán solo funciones.
Si además la vas a usar desde otros lenguajes, la salida de las funciones deberán ser solo tipos nativos, porque por ejemplo no ha correlación a nivel de código de máquina entre un struct de C y un record de Pascal, por más que técnicamente cumplan la misma función.
La propuesta de David es muy útil, porque te indica hacer ua función que devuelva un identificador de la conexión, para que sea tu programa el que maneja el hilo de ejecución y pueda llamar a otra función que use la conexión creada.
Salu2