Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Zé Roberto

[Resolvido] ShellExecuteEx e WaitForSingleObject

Recommended Posts

Estou tentando executar um outro programa de console e esperar a resposta.

 

Com o código que fiz abaixo ele executa mas o WaitForSingleObject não espera, dá erro 6 identificador inválido.

 

Eu tenho certeza que o erro vem do WaitForSingleObject porque eu coloquei um breakpoint em todos os retornos de execute()...

 

O que estou fazendo de errado?

int execute( LPCWSTR file, LPCWSTR params, LPCWSTR dir )
{
SHELLEXECUTEINFO sInfo;
sInfo.fMask = SEE_MASK_DEFAULT  ;
sInfo.hwnd = NULL;
sInfo.cbSize = sizeof(sInfo);
sInfo.lpVerb = L"open";
sInfo.lpFile = file;
sInfo.lpParameters = params;
sInfo.lpDirectory = dir;
sInfo.nShow = SW_SHOW;
sInfo.hProcess = NULL;


if(FALSE == ShellExecuteEx(&sInfo))
	return 333;

int ret;

if( (ret = WaitForSingleObject( sInfo.hProcess, INFINITE )) != WAIT_OBJECT_0 )
	return 333;

DWORD code;
if(FALSE == GetExitCodeProcess( sInfo.hProcess, &code ) )
	return 333;

return code;
}
void ErrorExit(LPTSTR lpszFunction) 
{ 
   // Retrieve the system error message for the last-error code

   LPVOID lpMsgBuf;
   LPVOID lpDisplayBuf;
   DWORD dw = GetLastError(); 

   FormatMessage(
       FORMAT_MESSAGE_ALLOCATE_BUFFER | 
       FORMAT_MESSAGE_FROM_SYSTEM |
       FORMAT_MESSAGE_IGNORE_INSERTS,
       NULL,
       dw,
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
       (LPTSTR) &lpMsgBuf,
       0, NULL );

   // Display the error message and exit the process

   lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
       (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); 
   StringCchPrintf((LPTSTR)lpDisplayBuf, 
       LocalSize(lpDisplayBuf) / sizeof(TCHAR),
       TEXT("%s failed with error %d: %s"), 
       lpszFunction, dw, lpMsgBuf); 
   MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 

   LocalFree(lpMsgBuf);
   LocalFree(lpDisplayBuf);
   ExitProcess(dw); 
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{
int result = execute(L"analisador32.exe", NULL, NULL);
ErrorExit(L"a");
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ninguém respondeu mas eu encontrei o problema...

 

Era simplesmente a fMask, por padrão ele fecha o hProcess, então eu troquei a fMask para SEE_MASK_NOCLOSEPROCESS e agora utilizo CloseHandle(sInfo.hProcess) antes de cada retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.