Eis uma função da API do Windows para a execução de comandos em linha usando CreateProcess:
/*
* Função: Executar processos sem usar .BAT, ShellExecute ou vbScripts
* por Jose Carlos da Rocha
* em 30/Julho/2018
*/
#include "fivewin.ch"
Function main()
//Desativa o serviço de audio do windows
? "MY_CreateProcess( 1, 'net stop Audiosrv')",;
MY_CreateProcess( 1, "net stop Audiosrv")
//Inicia o serviço de audio do windows
?"MY_CreateProcess( 1, 'net start Audiosrv')",;
MY_CreateProcess( 1, "net start Audiosrv")
return
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <stdio.h>
#include <tchar.h>
HB_FUNC( MY_CREATEPROCESS )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( !CreateProcess( NULL, // No module name (use command line)
hb_parc(2), // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
CREATE_NO_WINDOW, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "Criaçao de Processo falhou (%d).\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
#pragma ENDDUMP
No exemplo foi necessário executar em usuário com direitos elevados para que o comando de tratamento de serviços fosse efetivo.