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 

Llamar aplicacion MSDos y esperar hasta q termine

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Llamar aplicacion MSDos y esperar hasta q termine Responder citando

Si tengo una aplicacion para windows pero necesito ejecutar una aplicacion msdos el cual me genera un archivo en el directorio c:\temp\partinfo.txt

Hago la llamada al programa msdos de esta forma

TdrawingForm *forma = static_cast<TdrawingForm *>(ActiveMDIChild);
AnsiString cmd = "\\\\famsa\\sys\\apps\\af\\partinfo\\onepart2.exe \x22" + forma->fCaption + "\x22";

WinExec(cmd.c_str() , SW_HIDE);

//aqui quiero que mi programa hecho en windows se detenga hasta que el programa msdos termine para poder abrir el archivo generado "partinfo"
en una ventana MDIChild de mi aplicacion

partInfo = new TpartInfo(this);
partInfo->Caption = "Report for Part # " + forma->Caption;
partInfo->Load();

Alguien podria ayudarme con mi problema por favor.
Volver arriba
Mensaje    Asunto: Responder citando

Mira dentro del foro existe una funcion que espera a que ejecutes algo, y hasta que no termine, no continua con tu apliacion, si te interesa, te la pongo, este es el codigo, es decir en lugar de WinExec, que utlizas prueba con esta...

Código:

int WinExecAndWait32(AnsiString FileName, int Visibility)
{
  char zAppName[512];
  char zCurDir[255];
  AnsiString WorkDir;
  TStartupInfo StartupInfo;
  TProcessInformation ProcessInfo;

  strcpy(zAppName, FileName.c_str());
  WorkDir = GetCurrentDir();
  strcpy(zCurDir, WorkDir.c_str());
  setmem(&StartupInfo, sizeof(StartupInfo), 0);

  StartupInfo.cb = sizeof(StartupInfo);
  StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow = Visibility;

  if (!CreateProcess(NULL, zAppName, // pointer to command line string
    NULL, // pointer to process security attributes
    NULL, // pointer to thread security attributes
    false, // handle inheritance flag
    CREATE_NEW_CONSOLE | // creation flags
    NORMAL_PRIORITY_CLASS,
    NULL, // pointer to new environment block
    NULL, // pointer to current directory name
    &StartupInfo, // pointer to STARTUPINFO
    &ProcessInfo))
{
  return -1; // pointer to PROCESS_INF
}
  else
  {
  WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
  DWORD ExitCode;
  GetExitCodeProcess(ProcessInfo.hProcess, &ExitCode);
  return ExitCode;
  }
}
/******************************************/

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

perdon este es el ejemplo para llamar a la funcion...

Código:

 WinExecAndWait32("regsvr32 BDE\\BdeInst.dll", SW_SHOWDEFAULT   );

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por el Msg, personal, para eso estamos, para ayudarnos..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola,

Estoy intentando utilizar esta funcion con el BDS2006 en WinXP y me da un par de errores en la funcion createprocess:

[C++ Error] Func_ficheros.cpp(157): E2034 Cannot convert 'Windows::_STARTUPINFOA *' to '_STARTUPINFOA *'

[C++ Error] Func_ficheros.cpp(157): E2342 Type mismatch in parameter 'lpStartupInfo' (wanted '_STARTUPINFOA *', got 'Windows::_STARTUPINFOA *')

He probado a incluir:
#include <winbase.h>
#include <windows.h>

pero sin resultados.

¿Como podria solucionarlo?.

Gracias y un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

cambia la funcion por esta

Código:
int __fastcall WinExecAndWait32(AnsiString FileName, int Visibility)
{
  char zAppName[512];
  char zCurDir[255];
  AnsiString WorkDir;
//  TStartupInfo StartupInfo;  <--- OJO AQUI ESTA EL FALLO
  LPSTARTUPINFO StartupInfo;
  TProcessInformation ProcessInfo;

  strcpy(zAppName, FileName.c_str());
  WorkDir = ExtractFilePath(Application->ExeName);
  strcpy(zCurDir, WorkDir.c_str());
  setmem(&StartupInfo, sizeof(StartupInfo), 0);


  StartupInfo->cb = sizeof(StartupInfo);
  StartupInfo->dwFlags = STARTF_USESHOWWINDOW;
  StartupInfo->wShowWindow = Visibility;

  if (!CreateProcess(NULL, zAppName, // pointer to command line string
    NULL, // pointer to process security attributes
    NULL, // pointer to thread security attributes
    false, // handle inheritance flag
    CREATE_NEW_CONSOLE | // creation flags
    NORMAL_PRIORITY_CLASS,
    NULL, // pointer to new environment block
    NULL, // pointer to current directory name
    StartupInfo, // pointer to STARTUPINFO
    &ProcessInfo))
    {
          return -1; // pointer to PROCESS_INF
    }
    else
    {
        WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
        DWORD ExitCode;
        GetExitCodeProcess(ProcessInfo.hProcess, &ExitCode);
        return ExitCode;
    }
}

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola,

Gracias por contestar Cesar.

Compilar compila bien pero en ejecucion falla en la linea:
StartupInfo->cb = sizeof(StartupInfo);

El error que da es este:
Project raised exception class EAccessViolation with message "Access violation at adress xxx in module .exe" write of adress 00000000

Supongo que faltara por ajustar algo mas.

Un saludo y gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

me paso de la misma manera al usar el BDS2006 pero me funciona correctamente
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

kalux escribió:
Hola,

Gracias por contestar Cesar.

Compilar compila bien pero en ejecucion falla en la linea:
StartupInfo->cb = sizeof(StartupInfo);

El error que da es este:
Project raised exception class EAccessViolation with message "Access violation at adress xxx in module .exe" write of adress 00000000

Supongo que faltara por ajustar algo mas.

Un saludo y gracias


Estoy trasladando a BDS2006 un viejo programa que utilizaba la función WinExecAndWait32 Después de modificar dicha función por el error [C++ Error] FPrincipal.cpp(300): E2034 Cannot convert 'Windows::_STARTUPINFOA *' to '_STARTUPINFOA *' con la propuesta de Cesar ahora me compila pero me da el mismo error que a ti en tiempo de ejecución. ¿Lograsteis resolver el problema? Gracias por vuestra atencións.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Prueba con esta corrección:

Código:
int __fastcall WinExecAndWait32(AnsiString FileName, int Visibility)
{
  char zAppName[512];
  char zCurDir[255];
  AnsiString WorkDir;
  STARTUPINFO StartupInfo;
  PROCESS_INFORMATION ProcessInfo;

  strcpy(zAppName, FileName.c_str());
  WorkDir = ExtractFilePath(Application->ExeName);
  strcpy(zCurDir, WorkDir.c_str());
  setmem(&StartupInfo, sizeof(StartupInfo), 0);


  StartupInfo.cb = sizeof(StartupInfo);
  StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow = Visibility;

  if (!CreateProcess(NULL, zAppName, // pointer to command line string
    NULL, // pointer to process security attributes
    NULL, // pointer to thread security attributes
    false, // handle inheritance flag
    CREATE_NEW_CONSOLE | // creation flags
    NORMAL_PRIORITY_CLASS,
    NULL, // pointer to new environment block
    NULL, // pointer to current directory name
    &StartupInfo, // pointer to STARTUPINFO
    &ProcessInfo))
    {
          return -1; // pointer to PROCESS_INF
    }
    else
    {
        WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
        DWORD ExitCode;
        GetExitCodeProcess(ProcessInfo.hProcess, &ExitCode);
        return ExitCode;
    }
}


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.