despues de 2 semanas luchando con hb_LibLoad("libvlc.dll") en 64 bits y que sus funciones den error , intentar con crear librerias estaticas "libvlc.a" teniendo el mismo resultado...no funciona.
usando ChatGPT pedi que me ayudara a usar libvlc con hb_libload sin ningun resulto con todos los ejemplos simples compilando Harbour 64 + Mingw 64 que se encuentra en la instalacion HMG 64.. todo sin resultado alguno..
procedí pedirle que que me hiciera un simple con de hb_loadlib() y entrego como resultado vlc_loadlib() que me devuelve correctamente todos los punteros de las funciones exportadas de libvlc.dll
al hacer vemos las funciones
Code: Select all
dumpbin /exports libvlc.dll | find "vlc_"Code: Select all
#pragma BEGINDUMP
#include "hbapi.h"
#include <windows.h>
#include <stdint.h> // para tipos enteros fijos
// --- Tipos básicos equivalentes ---
typedef int64_t libvlc_time_t;
// --- Funciones de libVLC ---
typedef void * (__cdecl *PFN_LIBVLC_NEW)(int, const char *const *);
typedef void (__cdecl *PFN_LIBVLC_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_PATH)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_RELEASE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PLAY)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_STOP)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SETHWND)(void *, void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_TIME)(void *);
static HMODULE hVlc = NULL;
static PFN_LIBVLC_NEW pLibVLC_New = NULL;
static PFN_LIBVLC_RELEASE pLibVLC_Release = NULL;
static PFN_LIBVLC_MEDIA_NEW_PATH pLibVLC_Media_New_Path = NULL;
static PFN_LIBVLC_MEDIA_RELEASE pLibVLC_Media_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW pLibVLC_MediaPlayer_New = NULL;
static PFN_LIBVLC_MEDIAPLAYER_RELEASE pLibVLC_MediaPlayer_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA pLibVLC_MediaPlayer_Set_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PLAY pLibVLC_MediaPlayer_Play = NULL;
static PFN_LIBVLC_MEDIAPLAYER_STOP pLibVLC_MediaPlayer_Stop = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_TIME pLibVLC_MediaPlayer_GetTime = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SETHWND pLibVLC_MediaPlayer_SetHwnd = NULL;
// --- Carga la DLL y obtiene punteros ---
HB_FUNC( VLC_LOADLIB )
{
const char * path = hb_parc( 1 );
hVlc = LoadLibraryA( path ? path : "libvlc.dll" );
if( !hVlc )
{
hb_retl( HB_FALSE );
return;
}
pLibVLC_New = (PFN_LIBVLC_NEW) GetProcAddress( hVlc, "libvlc_new" );
pLibVLC_Release = (PFN_LIBVLC_RELEASE) GetProcAddress( hVlc, "libvlc_release" );
pLibVLC_Media_New_Path = (PFN_LIBVLC_MEDIA_NEW_PATH) GetProcAddress( hVlc, "libvlc_media_new_path" );
pLibVLC_Media_Release = (PFN_LIBVLC_MEDIA_RELEASE) GetProcAddress( hVlc, "libvlc_media_release" );
pLibVLC_MediaPlayer_New = (PFN_LIBVLC_MEDIAPLAYER_NEW) GetProcAddress( hVlc, "libvlc_media_player_new" );
pLibVLC_MediaPlayer_Release = (PFN_LIBVLC_MEDIAPLAYER_RELEASE) GetProcAddress( hVlc, "libvlc_media_player_release" );
pLibVLC_MediaPlayer_Set_Media = (PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_set_media" );
pLibVLC_MediaPlayer_Play = (PFN_LIBVLC_MEDIAPLAYER_PLAY) GetProcAddress( hVlc, "libvlc_media_player_play" );
pLibVLC_MediaPlayer_Stop = (PFN_LIBVLC_MEDIAPLAYER_STOP) GetProcAddress( hVlc, "libvlc_media_player_stop" );
pLibVLC_MediaPlayer_GetTime = (PFN_LIBVLC_MEDIAPLAYER_GET_TIME) GetProcAddress( hVlc, "libvlc_media_player_get_time" );
hb_retl( pLibVLC_New != NULL );
}
// --- Libera la DLL ---
HB_FUNC( VLC_UNLOADLIB )
{
if( hVlc )
{
FreeLibrary( hVlc );
hVlc = NULL;
}
}
// --- Obtiene dirección de símbolo ---
HB_FUNC( VLC_GETSYMBOLADDRESS )
{
const char * name = hb_parc(1);
FARPROC addr = NULL;
if( hVlc && name )
addr = GetProcAddress( hVlc, name );
hb_retnll( (HB_LONGLONG)(LONG_PTR) addr );
}
// --- Crea una instancia de VLC ---
HB_FUNC( VLC_NEW )
{
void *inst = NULL;
if( pLibVLC_New )
inst = pLibVLC_New( 0, NULL );
hb_retnll( (HB_LONGLONG)(LONG_PTR) inst );
}
// --- Libera instancia ---
HB_FUNC( VLC_RELEASE )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_Release && inst )
pLibVLC_Release( inst );
}
// --- Reproduce un archivo ---
HB_FUNC( VLC_PLAYPATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
void *media = NULL;
void *mp = NULL;
if( !inst || !path || !pLibVLC_Media_New_Path )
{
hb_retnll(0);
return;
}
media = pLibVLC_Media_New_Path( inst, path );
mp = pLibVLC_MediaPlayer_New( inst );
if( media && mp )
{
pLibVLC_MediaPlayer_Set_Media( mp, media );
pLibVLC_Media_Release( media );
pLibVLC_MediaPlayer_Play( mp );
}
hb_retnll( (HB_LONGLONG)(LONG_PTR) mp );
}
// --- Devuelve tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERGETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_GetTime && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_GetTime( mp ) : 0 );
}
// --- Detiene reproducción ---
HB_FUNC( VLC_MEDIAPLAYERSTOP )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Stop && mp )
pLibVLC_MediaPlayer_Stop( mp );
}
// --- Libera reproductor ---
HB_FUNC( VLC_MEDIAPLAYERRELEASE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Release && mp )
pLibVLC_MediaPlayer_Release( mp );
}
// --- Asocia la ventana de reproducción (HWND) ---
// Permite reproducir el video dentro de un control HMG (ej. FrameVideo)
HB_FUNC( VLC_MEDIAPLAYERSETHWND )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1); // MediaPlayer
HWND hWnd = (HWND)(LONG_PTR) hb_parnll(2); // Handle de control HMG
if( pLibVLC_MediaPlayer_SetHwnd == NULL && hVlc )
{
// obtener dirección si no se cargó aún
pLibVLC_MediaPlayer_SetHwnd = (PFN_LIBVLC_MEDIAPLAYER_SETHWND)
GetProcAddress( hVlc, "libvlc_media_player_set_hwnd" );
}
if( pLibVLC_MediaPlayer_SetHwnd && mp && hWnd )
{
pLibVLC_MediaPlayer_SetHwnd( mp, (void *)hWnd );
}
}
/* ============================================================
Enlaces Harbour ↔ libVLC para controlar MediaPlayer
============================================================ */
HB_FUNC( VLC_MEDIAPLAYERSETMEDIA )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
void *pMedia = ( void * ) ( HB_PTRUINT ) hb_parnll( 2 );
if( pLibVLC_MediaPlayer_Set_Media != NULL && pMediaPlayer && pMedia )
pLibVLC_MediaPlayer_Set_Media( pMediaPlayer, pMedia );
}
HB_FUNC( VLC_MEDIAPLAYERPLAY )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
if( pLibVLC_MediaPlayer_Play != NULL && pMediaPlayer )
hb_retni( pLibVLC_MediaPlayer_Play( pMediaPlayer ) );
else
hb_retni( -1 );
}
// --- Pausa la reproducción ---
HB_FUNC( VLC_MEDIAPLAYERPAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pPause = GetProcAddress(hVlc, "libvlc_media_player_pause");
if( pPause && mp )
((void (__cdecl *)(void *))pPause)(mp);
}
// --- Verifica si está reproduciendo ---
HB_FUNC( VLC_MEDIAPLAYERISPLAYING )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pIsPlaying = GetProcAddress(hVlc, "libvlc_media_player_is_playing");
hb_retni( (pIsPlaying && mp) ? ((int (__cdecl *)(void *))pIsPlaying)(mp) : 0 );
}
// --- Ajusta el volumen ---
HB_FUNC( VLC_AUDIOSETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int vol = hb_parni(2);
FARPROC pSetVol = GetProcAddress(hVlc, "libvlc_audio_set_volume");
if( pSetVol && mp )
((void (__cdecl *)(void *, int))pSetVol)(mp, vol);
}
// --- Obtiene el volumen actual ---
HB_FUNC( VLC_AUDIOGETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetVol = GetProcAddress(hVlc, "libvlc_audio_get_volume");
hb_retni( (pGetVol && mp) ? ((int (__cdecl *)(void *))pGetVol)(mp) : -1 );
}
// --- Devuelve la duración total ---
HB_FUNC( VLC_MEDIAPLAYERGETLENGTH )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pLen = GetProcAddress(hVlc, "libvlc_media_player_get_length");
hb_retnll( (pLen && mp) ? ((libvlc_time_t (__cdecl *)(void *))pLen)(mp) : 0 );
}
// --- Cambia el tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERSETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
libvlc_time_t t = (libvlc_time_t)hb_parnll(2);
FARPROC pSetTime = GetProcAddress(hVlc, "libvlc_media_player_set_time");
if( pSetTime && mp )
((void (__cdecl *)(void *, libvlc_time_t))pSetTime)(mp, t);
}
// --- Cambia posición relativa (0.0–1.0) ---
HB_FUNC( VLC_MEDIAPLAYERSETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
float pos = (float)hb_parnd(2);
FARPROC pSetPos = GetProcAddress(hVlc, "libvlc_media_player_set_position");
if( pSetPos && mp )
((void (__cdecl *)(void *, float))pSetPos)(mp, pos);
}
// --- Obtiene posición relativa actual ---
HB_FUNC( VLC_MEDIAPLAYERGETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetPos = GetProcAddress(hVlc, "libvlc_media_player_get_position");
hb_retnd( (pGetPos && mp) ? ((float (__cdecl *)(void *))pGetPos)(mp) : 0.0 );
}
// --- Devuelve estado del reproductor ---
HB_FUNC( VLC_MEDIAPLAYERGETSTATE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetState = GetProcAddress(hVlc, "libvlc_media_player_get_state");
hb_retni( (pGetState && mp) ? ((int (__cdecl *)(void *))pGetState)(mp) : -1 );
}
#pragma ENDDUMP