[C con Clase] Problema al cargar un recurso en una dll

Steven Davidson steven en conclase.net
Jue Jun 28 00:39:00 CEST 2007


Hola Man,

El pasado 2007-06-27 21:41:30, Man Alvarez escribió:

MA> Steven modifiqué tu código para cargar la librería con LoadLibrary() y luego
MA> buscar el procedimiento con GetProcAddress() lo extraño es que ahora ya no
MA> me funciona tu código, estoy empezando a creer que ahí puede estar el error.

[CORTE]

MA> PD: Mandé mi código en un adjunto de un correo anterior. llego a la lista
MA> esta vez?

Sí, pero en el ZIP no incluiste el fichero fuente de la aplicación donde usas la DLL. De todas maneras, has incluido el código que interesa en este mensaje.

Veamos. Haciendo pruebas, arreglé el "problema". Haz lo siguiente:

HMODULE hDLL;
...
hDLL = LoadLibrary( "dll_dialogo.dll" );
...
case WM_COMMAND:
  if( HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK )
  {
    if( !Dialog( hDLL  ) )
      MessageBox( hwnd, "Dialog() == FALSE", "ERROR", MB_OK );
  }
break;

Como puedes ver, paso el manipulador del módulo de la DLL a la función para que el cuadro de diálogo se base en ello. También puedes invocar 'GetModuleHandle()' si lo prefieres:

Dialog( GetModuleHandle("dll_dialogo.dll") );


Por cierto, no aconsejo cargar y liberar la DLL tantas veces. Sugiero hacer esto al comienzo y al final, respectivamente. Por ejemplo, carga la DLL nada más entrar en 'WinMain()' y liberarla justo antes de retornar de ella. El esquema sería,

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hNoUsado,
                    LPSTR lpszArg, int nModo )
{
  hDLL = LoadLibrary( "dll_dialogo.dll" );
  ...
  FreeLibrary( hDLL );
  return msg.wParam;
}

Tampoco incluí mi fichero de cabecera "dll_dialogo.h", ya que ahora estamos manipulando la DLL explícitamente.


Espero que ahora te funcione.

Steven


Más información sobre la lista de distribución Cconclase