 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 05 Sep, 2016 8:40 pm Asunto: Problemas con kernel32.dll |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 05 Sep, 2016 11:39 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mar 06 Sep, 2016 11:40 am Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 06 Sep, 2016 12:22 pm Asunto: |
|
|
| 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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mar 06 Sep, 2016 12:57 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mar 06 Sep, 2016 1:02 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mar 06 Sep, 2016 1:16 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mar 06 Sep, 2016 1:36 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mar 06 Sep, 2016 1:47 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 06 Sep, 2016 3:08 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 08 Sep, 2016 4:40 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 08 Sep, 2016 5:01 pm Asunto: |
|
|
Me pregunto porqué quieres usar un teclado virtual.
Saludos. |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|