Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problemas con kernel32.dll

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problemas con kernel32.dll Responder citando

Tengo esta función para llamar al teclado de windows, pero cuando ejecuto el programa en SISTEMA OPERATIVO WINDOWS XP me da el error de ejecución tipico de kernel32.dll

Código:

void __fastcall TecladoVirtual(bool Estado)
{
   //'Teclado en pantalla' es el Caption de la Ventana TECLADO VIRTUAL
    HWND w;
    w=FindWindow(0, L"Teclado en pantalla");
   if(Estado)
    {
        if(!IsWindow(w))//Si NO está ejecutandose, Abrelo o Ejecutalo
        {
            if(fV->SV->WinSO_bits == 32)
               ShellExecute(0, TEXT("open"), String(fV->SV->DatSetPCRutaSystem32_Ncr + "osk.exe").t_str(), 0, 0, SW_SHOW);
            else
               {
                    #ifdef _WIN32_WINNT
                    #undef _WIN32_WINNT
                    #endif
                    #define _WIN32_WINNT 0x0501
                    PVOID oldValue;
                    Wow64DisableWow64FsRedirection(&oldValue);
                    ShellExecute(0, TEXT("open"), String(fV->SV->DatSetPCRutaSystem32_Ncr + "osk.exe").t_str(), 0, 0, SW_SHOW);
                    Wow64RevertWow64FsRedirection(oldValue);
                }
        }
    }
    else
       {
            if(IsWindow(w))//Si está ejecutandose, cierralo
                fV->CierraAplicacion(L"osk.exe");
        }
}


Ya sé que es porque la función Wow64DisableWow64FsRedirection
no encuentra dentro del Kernel32.dll

pero quisiera saber como puedo utilizar esta función para que mi programa se pueda ejectuar tanto en XP como en 7

he visto esto en la web, pero no sé como aplicarlo:


Cita:

Y de la misma no se preocupe por el valor de bits del sistema. Si la función está presente, lo llaman.

typedef BOOL WINAPI fntype_Wow64DisableWow64FsRedirection(PVOID *OldValue);
auto pfnWow64DisableWow64FsRedirection = (fntype_Wow64DisableWow64FsRedirection*)GetProcAddress(GetModuleHandleA("kernel32.dll"), "Wow64DisableWow64FsRedirection");

if (pfnWow64DisableWow64FsRedirection) {
// function found, call it via pointer
PVOID arg;
(*pfnWow64DisableWow64FsRedirection)(&arg);
}
else {
// function was missing
}

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Puedes mirar si se ejecuta en WinXP y evitar el uso de la función, o imporlar la API Wow64DisableWow64FsRedirection de forma dinámica, si no puedes, es que la versión de S.O. no la soporta.

El uso debe ser como sigue:
Código:

typedef BOOL (__stdcall *PWow64DisableWow64FsRedirection)(PVOID *OldValue);

void __fastcall TecladoVirtual(bool Estado)
{
  // Si no encontramos la función Wow64DisableWow64FsRedirection el S.O. no lo soporta
  PWow64DisableWow64FsRedirection _Wow64DisableWow64FsRedirection = (PWow64DisableWow64FsRedirection)GetProcAddress(GetModuleHandleA("kernel32.dll"),  "Wow64DisableWow64FsRedirection");

  int n=0;

   //'Teclado en pantalla' es el Caption de la Ventana TECLADO VIRTUAL
    HWND w;
    w=FindWindowW(0, L"Teclado en pantalla");
   if(Estado)
    {
        if(!IsWindow(w))//Si NO está ejecutandose, Abrelo o Ejecutalo
        {
            if(fV->SV->WinSO_bits == 32 || !_Wow64DisableWow64FsRedirection)
               ShellExecute(0, TEXT("open"), String(fV->SV->DatSetPCRutaSystem32_Ncr + "osk.exe").t_str(), 0, 0, SW_SHOW);
            else
               {
                    #ifdef _WIN32_WINNT
                    #undef _WIN32_WINNT
                    #endif
                    #define _WIN32_WINNT 0x0501
                    PVOID oldValue;
                    Wow64DisableWow64FsRedirection(&oldValue);
                    ShellExecute(0, TEXT("open"), String(fV->SV->DatSetPCRutaSystem32_Ncr + "osk.exe").t_str(), 0, 0, SW_SHOW);
                    Wow64RevertWow64FsRedirection(oldValue);
                }
        }
    }
    else
       {
            if(IsWindow(w))//Si está ejecutandose, cierralo
                fV->CierraAplicacion(L"osk.exe");
        }

}


No lo puedo probar ahora, pero creo que en XP basta con hacer:
Código:
ShellExecute(0, TEXT("open"), "osk.exe", 0, 0, SW_SHOW);



Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

SCAFANDRA, se sigue cargando siempre y cuando ejecuto el programa en Windows XP, me da el error:
No se encuentra el punto de entrada del procedimiento Wow64DisableWow64FsRedirection en la biblioteca de vinculos dinamicos KERNEL32.DLL

Es decir se carga la función con el ejecutable.
¿Como la cargo dinámicamente sin que esté contenida en el ejecutable?

es decir como?..
imporlar la API Wow64DisableWow64FsRedirection de forma dinámica

Si no puedo solucionar este problema, tendré que compilar 2 EJECUTABLES, 1 para WINDOWS XP y otro para el RESTO.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Código:

typedef BOOL (__stdcall *PWow64DisableWow64FsRedirection)(PVOID *OldValue);
typedef BOOL (__stdcall *PWow64RevertWow64FsRedirection)(PVOID OldValue);
void __fastcall TecladoVirtual()
{
  PWow64DisableWow64FsRedirection _Wow64DisableWow64FsRedirection = (PWow64DisableWow64FsRedirection)GetProcAddress(GetModuleHandleA("kernel32.dll"),  "Wow64DisableWow64FsRedirection");
  PWow64RevertWow64FsRedirection _Wow64RevertWow64FsRedirection   = (PWow64RevertWow64FsRedirection)GetProcAddress(GetModuleHandleA("kernel32.dll"),  "Wow64RevertWow64FsRedirection");

  if(_Wow64DisableWow64FsRedirection && _Wow64RevertWow64FsRedirection){
    PVOID oldValue;
    _Wow64DisableWow64FsRedirection(&oldValue);
    ShellExecute(0, TEXT("open"), "osk.exe", 0, 0, SW_SHOW);
    _Wow64RevertWow64FsRedirection(oldValue);
  }
  else
    WinExec("osk.exe",SW_SHOWNORMAL);
}


En este ejemplo, que funciona en WinXP y Win10, importo dinámicamente Wow64DisableWow64FsRedirection y Wow64RevertWow64FsRedirection. Observa como coloco un guión bajo delante de los nombres de función para que no se pisen con los nombres de las APIs. Si los punteros son nulos, el S.O. (Kernel32.dll) no las soporta, en caso contrario, valen lo mismo que los punteros a las APIs con "nombre normal".

Deberías importar así todas las APIs que no soporta WinXP para conseguir compatibilidad. En caso contrario, el programa fallará nada más tratar de ejecutarlo pues el Loader de windows no podrá importar las funciones.


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

GRACIAS ESCAFANDRA...

Lo he probado en WINDOWS XP y ya no me da el error del KERNEL32.DLL

El código queda así, es correcto?
Código:

//Función para mostrar el Teclado Virtual en Pantalla, Por defecto Abre el Teclado
//Tengo en cuenta si es WINDOWS XP o el RESTO
typedef BOOL (__stdcall *PWow64DisableWow64FsRedirection)(PVOID *OldValue);
typedef BOOL (__stdcall *PWow64RevertWow64FsRedirection)(PVOID OldValue);
void __fastcall TecladoVirtual(bool Estado)
{
   // Si no encontramos la función Wow64DisableWow64FsRedirection el S.O. no lo soporta
   PWow64DisableWow64FsRedirection _Wow64DisableWow64FsRedirection =
    (PWow64DisableWow64FsRedirection)GetProcAddress(GetModuleHandleA("kernel32.dll"),  "Wow64DisableWow64FsRedirection");
     PWow64RevertWow64FsRedirection _Wow64RevertWow64FsRedirection   =
    (PWow64RevertWow64FsRedirection)GetProcAddress(GetModuleHandleA("kernel32.dll"),  "Wow64RevertWow64FsRedirection");

   //'Teclado en pantalla' es el Caption de la Ventana TECLADO VIRTUAL
    HWND w;
    w=FindWindow(0, L"Teclado en pantalla");
   if(Estado)
    {
        if(!IsWindow(w))//Si NO está ejecutandose, Abrelo o Ejecutalo
        {
            if(fV->SV->WinSO_bits == 32 || !_Wow64DisableWow64FsRedirection || _Wow64RevertWow64FsRedirection)
               ShellExecute(0, TEXT("open"), L"osk.exe", 0, 0, SW_SHOW);
            else
               {
                    #ifdef _WIN32_WINNT
                    #undef _WIN32_WINNT
                    #endif
                    #define _WIN32_WINNT 0x0501
                    PVOID oldValue;
                    _Wow64DisableWow64FsRedirection(&oldValue);
                    ShellExecute(0, TEXT("open"), L"osk.exe", 0, 0, SW_SHOW);
                    _Wow64RevertWow64FsRedirection(oldValue);
                }
        }
    }
    else
       {
            if(IsWindow(w))//Si está ejecutandose, cierralo
                fV->CierraAplicacion(L"osk.exe");
        }
}
//------------------------------------------------------------------------------

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Pues ahora resulta que en Windows 10 64bits no me abre el teclado
Que estoy haciendo MAL?
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

El problema es el Siguiente:
1. Mi aplicación necesita llamar al teclado de windows.
2. Mi aplicación se puede ejecutar en XP, Vista, W7(32/64), W8(32/64), W10(32/64)

El problema que tengo es que para llamar al teclado de un Sistema Operativo de 64bits tengo que utilizar la funciones:
Wow64DisableWow64FsRedirection
Wow64RevertWow64FsRedirection

Si la aplicación se ejecuta en cualquier Windows superior a XP todo va bien, pero si se ejecuta en Windows XP el programa da el ERROR del KERNEL32.DLL y se queda en ejecución en MEMORIA pero sin EJECUTARSE por dicho ERROR.

Entonces la pregunta es, tendré que hacer 3 VERSIONES de mi programa:
1 para XP y otra para el RESTO?

He probado lo que dices y se EJECUTA EN Windows XP pero ahora el problema es que en Windows de 64 bits no me aparece el TECLADO en PANTALLA.

Así que me quedo igual que antes.

QUE ESTOY HACIENDO MAL?
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Esto es un desastre:
Funciona en Windows XP
Funciona en Windwos 7 32bits
Funciona en Windwos 7 64bits
pero...
No funciona en Windows 10 64bits

Al final me veo haciendo 2 aplicaciones, una para XP y otra para el RESTO.

Tu lo has probado en Windows 10 64bits?
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Al final lo he conseguido, pero poniendo la ruta ABSOLUTA al teclado.
MUCHAS GRACIAS POR TU AYUDA....

El código queda así:
es decir sustituyendo:
ShellExecute(0, TEXT("open"), L"osk.exe", 0, 0, SW_SHOW);
POR ESTO:
ShellExecute(0, TEXT("open"), String(fV->SV->DatSetPCRutaSystem32_Ncr + "osk.exe").t_str(), 0, 0, SW_SHOW);



Código:

//Función para mostrar el Teclado Virtual en Pantalla, Por defecto Abre el Teclado
//Tengo en cuenta si es WINDOWS XP o el RESTO
typedef BOOL (__stdcall *PWow64DisableWow64FsRedirection)(PVOID *OldValue);
typedef BOOL (__stdcall *PWow64RevertWow64FsRedirection)(PVOID OldValue);
void __fastcall TecladoVirtual(bool Estado)
{
   // Si no encontramos la función Wow64DisableWow64FsRedirection el S.O. no lo soporta
   PWow64DisableWow64FsRedirection _Wow64DisableWow64FsRedirection =
    (PWow64DisableWow64FsRedirection)GetProcAddress(GetModuleHandleA("kernel32.dll"),  "Wow64DisableWow64FsRedirection");
     PWow64RevertWow64FsRedirection _Wow64RevertWow64FsRedirection   =
    (PWow64RevertWow64FsRedirection)GetProcAddress(GetModuleHandleA("kernel32.dll"),  "Wow64RevertWow64FsRedirection");

   //'Teclado en pantalla' es el Caption de la Ventana TECLADO VIRTUAL
    HWND w;
    w=FindWindow(0, L"Teclado en pantalla");
   if(Estado)
    {
        if(!IsWindow(w))//Si NO está ejecutandose, Abrelo o Ejecutalo
        {
            if(_Wow64DisableWow64FsRedirection && _Wow64RevertWow64FsRedirection)
            {
                #ifdef _WIN32_WINNT
                #undef _WIN32_WINNT
                #endif
                #define _WIN32_WINNT 0x0501
                PVOID oldValue;
                _Wow64DisableWow64FsRedirection(&oldValue);
                ShellExecute(0, TEXT("open"), String(fV->SV->DatSetPCRutaSystem32_Ncr + "osk.exe").t_str(), 0, 0, SW_SHOW);
                _Wow64RevertWow64FsRedirection(oldValue);
            }
            else
               ShellExecute(0, TEXT("open"), String(fV->SV->DatSetPCRutaSystem32_Ncr + "osk.exe").t_str(), 0, 0, SW_SHOW);

        }
    }
    else
       {
            if(IsWindow(w))//Si está ejecutandose, cierralo
                fV->CierraAplicacion(L"osk.exe");
        }
}
//------------------------------------------------------------------------------

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Hola. Veo que ya lo solucionaste. No he podido conectarme antes.

El código que te expuse lo probé en winXP y en Win10 64bits, sin poner ruta completa funcionando bien.

Veo que en tu PC win10 si te hace falta la ruta completa.


Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si así es, y tal como tu dices si en tu Windows 10 no hace falta, pues no voy a correr riesgos. Con la ruta ABSOLUTA está más seguro y de momento en cientos de usuarios que tengo, no ha fallado.
Otra vez, GRACIAS.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Me pregunto porqué quieres usar un teclado virtual.


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.