Crear una dll básica C++ Visual Studio 2013

Iniciado por SubAtomicParticula, 23 Octubre 2016, 18:13 PM

0 Miembros y 1 Visitante están viendo este tema.

SubAtomicParticula

Saludos, estoy intentando crear una dll básica en Visual Studio 2013 concretamente en Visual C++ usando un proyecto Win32 dll, pero el proyecto resultante me genera un archivo que luego no puedo llamar desde VBA (Access). Intento registar la dll con regsvr32.exe pero me dice:
Se cargó el módulo "..\BibliotecaDLL.dll pero no se encontró el punto de entrada DllRegisterServer. Asegúrese de que "..\BibliotecaDLL.dll" es un archivo DLL u OCX válido e inténtelo de nuevo.
El proyecto define el BOOL APIENTRY DllMain(..) y una función que he incluido int __declspec(dllexport) Funcion1(). Si alguien puede ayudarme con este problema. Muchas gracias.

MCKSys Argentina

Hola!

Si quieres usar la DLL desde el código VBA, la misma tiene que estar de 1 de 2 formas:

1) Compilada como objeto ActiveX: En ese caso puedes usar DllRegisterServer para registrar la DLL en el registro de Windows, lo que te permitirá crear los objetos COM que la misma tenga. En ese caso usarías CreateObject o algo parecido. Aquí tienes una guía: https://msdn.microsoft.com/en-us/library/aa229332(v=vs.60).aspx (Aunque es para VS 6.0, debería servirte igual)

2) Compilada como DLL común, con stdcall como calling convention: En este caso creas la dll y la llamas desde el código con LoadLibrary para cargarla y luego a las funciones exportadas de la misma. Más info: https://msdn.microsoft.com/en-us/library/office/bb687850.aspx

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


SubAtomicParticula

#2
Yo uso la opción 2:

Esta es la declaración del punto de entrada de la dll.
BOOL __stdcall DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)

Y esta es la declaración de la función a exportar.
__declspec(dllexport) int __stdcall Funcion1()

La llamada desde Access VBA la realizo con la declaración:
Public Declare Function Funcion1 Lib "BibliotecaDLL.dll" () As Long
Tal y como declaro cualquier función de la API de Win32 Kernel32, user32, etc.
En Access me lanza el error 48 no se encontró el archivo y registrando la dll en Windows me sigue diciendo que no encuentra el punto de entrada de la dll. Si uso LoadLibrary me devuelve 0, creo que no carga la dll y no se porqué. Muchas gracias.