Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SubAtomicParticula en 23 Octubre 2016, 18:13 pm



Título: Crear una dll básica C++ Visual Studio 2013
Publicado por: SubAtomicParticula en 23 Octubre 2016, 18:13 pm
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.


Título: Re: Crear una dll básica C++ Visual Studio 2013
Publicado por: MCKSys Argentina en 23 Octubre 2016, 18:37 pm
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 (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 (https://msdn.microsoft.com/en-us/library/office/bb687850.aspx)

Saludos!


Título: Re: Crear una dll básica C++ Visual Studio 2013
Publicado por: SubAtomicParticula en 23 Octubre 2016, 19:47 pm
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.