Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   PChar y PAnsiChar en WinExec (https://www.clubdelphi.com/foros/showthread.php?t=65177)

gatosoft 25-11-2009 21:16:07

PChar y PAnsiChar en WinExec
 
Hola Compañeros,

Les tengo la siguiente inquiteud:

Tengo una instrucción en Delphi 7 de la siguiente manera:

Código:

WinExec(PChar('Ejecutable.exe '+Parametros),SW_SHOWNORMAL);
Al migrar a Delphi 2009 encontré que la función WinExec ahora recibe como primer parametro un AnsiChar en lugar de un PChar...

Tambien, al navegar en algunos foros encontré que la solución sencilla es reemplazar todos los PChar por un PAnsiChar, asi:

Código:

WinExec(PAnsiChar('Ejecutable.exe '+Parametros),SW_SHOWNORMAL);
No se si esté equivocado o haya interpretado mal, pero eso no me funcionó pues al testear el resultado con un showmessage de ambas funciones, el resultado de :


Código:

ShowMessage(PAnsiChar('Cadena de texto'));
Es solo el primer caracter de la cadena, a diferencia de PChar que si la muestra completa...

¿Quién ya ha pasado por esto?

les agradezco,

gatosoft 27-11-2009 14:58:50

hola amigos,

Les cuento que ya encontré la solución, en el siguiente hilo de otro foro:

http://stackoverflow.com/questions/2...in-delphi-2009

La respuesta es primero convertir la cadena en AnsiString y luego si hacer el llamado a PAnsiChar, asi:

Código:

s := PAnsiChar(AnsiString('Ejecutable.exe '+strParametros_l);
De este modo si retorna el Path completo y no solo la primera letra...

Espero que les sirva..!!!

un saludo,

SyncReuter 27-11-2009 15:58:48

Hola, Esta cuestion me tiene loco, tengo un problema algo similiar, intente la solución que sale en el otro foro que tu indicas que la cuestion no funciona. Explico mi problema.

Tengo una variable string (FAppFileName) dentro de un componente la cual contiene la ruta completa mas el ejecutable, especificamente asi:

D:\Proyectos\Delphi\Cap\CapMain\AppNew.exe

ahora bien, el problema que tengo es que WinEXEC NO me ejecuta el archivo (AppNew.EXE) ahora bien si el mismo archivo lo pongo en la raiz del disco (D:\AppNew.EXE') y se lo asigno en forma absoluta a la variable FAppFileName:

WinExec(PAnsiChar(FAppFileName), SW_SHOWNORMAL);

SIIII ABREEEE LA aplicación, pero con ruta completa no hay manera que funcione. ahhh y lo olvidada me pasa lo mismo con Shellexecute, ¿Alguna idea?

¿Porque m... será?

Saludos

mamcx 27-11-2009 16:26:28

Debes entender que char, string y pstring y pchar son ALIAS al tipo string especifico de compilador. Antes de D2009 eso era ANSi y esde 2009 es UNICODE.

Entiende que el API de Windows es NATIVO EN UNICODE y tiene tambien alias y versiones en ANSI y UNICODE.

Asi, hay una version de la llamada al API de windows que empieza o termina en "A" y una que termina en "W". La que termina en W es nativo unicode y no tienes que hacer las conversiones.

SyncReuter 27-11-2009 16:59:58

ok Mamcx, entiendo lo que quieres decir, pero en mi caso en particular cual es el problema? Utilizo D2005 Pro UPD3!!! y los parametros que paso a la función son los correctos?

function WinExec(lpCmdLine: LPCSTR; uCmdShow: UINT): UINT; stdcall; // LPCSTR = PAnsiChar;

Código Delphi [-]
procedure TPrcWaitFormProgress.ExtractWaitForm(Sender: TObject);
var
  F: string;
begin
  F:=PathLocal + 'AppWFP.EXE'; // No funciona
  //ShowMessage(F); // me devuelve D:\Proyectos\Delphi\WSam\WSamManager\AppWFP.EXE
  //F:='C:\AppWFP.EXE'; // Asi funciona OK
  WinExec(PAnsiChar(F), SW_SHOW);
end;

Iluminame por favor, dime que estoy haciendo MAL!!!!

mmm lo olvidaba...ambas rutas el archivo existe :)

gracias por tu tiempo, Saludos

gatosoft 27-11-2009 17:15:31

Amigo SyncReuter, tu dices que ya probaste, pero intenta hacer un showmessage a las instrucciones:

ShowMessage(PAnsiChar(p));
ShowMessage(PAnsiChar(PAnsiString(p)));

Hazlo para ambos PATH:

D:\Proyectos\Delphi\WSam\WSamManager\AppWFP.EXE
D:\AppWFP.EXE

Ahora, ¿de que tipo es tu variable FAppFileName?

Un saludo,

SyncReuter 27-11-2009 17:28:18

Hola gatosoft, bueno puse el codigo completo que tengo en este momento dentro del procedimiento:

Código Delphi [-]
procedure TPrcWaitFormProgress.ExtractWaitForm(Sender: TObject);
var
  //F: Ansistring; // No hay diferencia
  F: string;
begin
  F:=PathLocal + 'AppWFP.EXE'; // No funciona
  //ShowMessage(F); // me devuelve D:\Proyectos\Delphi\WSam\WSamManager\AppWFP.EXE
  //F:='C:\AppWFP.EXE'; // Asi funciona OK

  //ShowMessage(PAnsiChar(F)); // me devuelve D:\Proyectos\Delphi\WSam\WSamManager\AppWFP.EXE
  //ShowMessage(PAnsichar(PAnsiString(F))); // me devuelve D:\Proyectos\Delphi\WSam\WSamManager\AppWFP.EXE

  WinExec(PAnsiChar(F), SW_SHOW);
end;

como puedes ver la variable que contiene la ruta + el ejecutable es "string" (tambien probe son Ansi)

El problema me tiene parado desde anoche, como decimos aca...estoy metioooo la verdad con los años que llevo con delphi es la cuestion mas rara que me a pasado, estoy
seriamente pensando en que puede existir una falla en mi delphito.
Ahora bien para asegurarme PAnsiChar esta relacionada con la unit System y WinExec con la unit Windows

Saludos.... (Estoy que formateo el pc y reinstalo todo :mad:)

SyncReuter 27-11-2009 17:42:17

En mi desesperación realice un proyecto aparte con mi drama.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Path: string;
  F: string;
begin
  Path:=ExtractFilePath(Application.ExeName);
  F:='AppWFP.EXE';

  //ShowMessage(Path); // Devuelve:--> D:\Proyectos\Delphi\Test\
  //ShowMessage(Path + F); // Devuelve:--> D:\Proyectos\Delphi\Test\AppWFP.EXE

  //WinExec(PAnsiChar(Path + F), SW_SHOW); // NO FUNCIONA

  //WinExec('D:\Proyectos\Delphi\Test\AppWFP.EXE', SW_SHOW); // NO FUNCIONA

  WinExec('C:\AppWFP.EXE', SW_SHOW); // SI FUNCIONA :-)

end;

En ambas rutas (Path) existe el archivo AppWFP.EXE, Utilizo Delphi 2005 Pro UPD3 y tengo winxp pro sp3

Saludos

SyncReuter 27-11-2009 18:08:09

mmmmmm lo raro es en el proyecto de prueba si funciona con:

ShellExecute( 0, nil, PAnsiChar(Path + F), nil, nil, SW_SHOWNORMAL );

y lo acabo de probar dentro del proyecto principal (dentro de una clase) y no funciona :eek:, creo que debo tener un problema en la clase

:confused:

Gracias, saludos desde chile

DeG 27-04-2010 01:13:21

asi anda lo uso yo y tengo delphi 2010
 
WinExec(PAnsiChar(AnsiString('c:\TuCarpeta\Tuprograma.exe')),SW_SHOWNORMAL);

DeG 27-04-2010 01:16:26

otra opción
 
Path:='C:\TuCarpeta\';
WinExec(PAnsiChar(AnsiString(Path+TuPrograma.exe')),SW_SHOWNORMAL);


La franja horaria es GMT +2. Ahora son las 22:13:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi