PDA

Ver la Versión Completa : ShellExecute y "c:\WINDOWS\system32\telephon.cpl"


Durbed
20-12-2005, 15:45:29
Hola, quiero abrir las opciones de marcado de windows, lo estoy intentando mediante un shellexecute, lo raro es que si lo pongo en el ejecutar de windows (inicio->ejecutar->C:\Windows\System32\telephone.cpl), lo abre sin problemas. El shellexecute que utilizo es este:
ShellExecute(Handle, 'open', 'C:\Windows\System32\telephone.cpl', nil, nil, SW_SHOW);

Un saludo y gracias.

delphi.com.ar
20-12-2005, 15:51:28
Probá algo como:

WinExec('rundll32.exe shell32.dll,Control_RunDLL "C:\Windows\System32\telephone.cpl"', SW_SHOW);

Saludos!

OSKR
20-12-2005, 16:11:53
:confused: Chiezen!!!!, disculpa q me entrometa en este hilo sin aportar Federico, puedes decirme algo respecto al .cpl y porq se ha de correr como parámetro del kernel (o mejor dicho.....parte del kernel)?

Durbed
20-12-2005, 16:39:48
No me ha funcionado, pero tampoco me ha dado error, simplemente no ha pasado nada.

Gracias.

dec
20-12-2005, 17:02:04
Hola,



No me ha funcionado, pero tampoco me ha dado error, simplemente no ha pasado nada.
Lo que pasa es que no estás usando la ruta correcta: no es "telephone.cpl", sino "telephon.cpl". Si lo miras verás que el archivo "telephone.cpl" no existe en el directorio "System32" y sí existe "telephon.cpl".

Durbed
20-12-2005, 17:22:11
Muchas gracias a los dos, ya funciona perfectamente, esa es la tipica chorrada que te tiene liado media tarde XD

Un saludo y gracias de nuevo

delphi.com.ar
20-12-2005, 21:18:08
:confused: Chiezen!!!!, disculpa q me entrometa en este hilo sin aportar Federico, puedes decirme algo respecto al .cpl y porq se ha de correr como parámetro del kernel (o mejor dicho.....parte del kernel)?
¿Cómo parámetro del Kernel?.... Todos los procesos son objetos del Kernel!
RunDll o RunDll32 simplemente sirven para llamar a funciones exportadas por DLL´s:
RUNDLL.EXE Archivo.dll,Función Parámetro1, Parámetro2, Parámetro3
Y en este caso estamos llamando a Control_RunDLL de la librería Shell32.dll, cosa que podríamos escribir 100% en Delphi:

{ Declaración }
procedure Control_RunDLL(hWnd: HWND; hInst: HINST; cmd: LPCSTR; nCmdShow: DWORD); stdcall; external 'Shell32.dll';
...
{ Implementación }
begin
Control_RunDLL(Handle, hInstance, 'telephon.cpl', SW_SHOW);
end;


Saludos!

delphi.com.ar
20-12-2005, 21:33:04
La escribí y no la voy a dejar de subir :D

type
TControl_RunDLL = procedure(hWnd: HWND; hInst: HINST; cmd: LPCSTR; nCmdShow: DWORD); stdcall;
var
hMod: HMODULE;
Control_RunDLL: TControl_RunDll;
begin
hMod := LoadLibrary('Shell32.dll');
if hMod > 0 then
try
@Control_RunDLL := GetProcAddress(hMod, 'Control_RunDLL');
if @Control_RunDLL <> nil then
Control_RunDLL(Handle, hInstance, 'telephon.cpl', SW_SHOW);
finally
FreeLibrary(hMod);
end
else
RaiseLastOsError;
end;


Saludos!