Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   una aplicacion puede actuar como funcion ?? (https://www.clubdelphi.com/foros/showthread.php?t=63387)

arequipa2000 11-02-2009 20:42:26

una aplicacion puede actuar como funcion ??
 
quiero hacer una aplicacion delphi, que una vez finalizado retorne como cadena una unidad de volumen. ejemplo:

ejecutar desde un .bat :

set cdrom= miaplicacion;

despues de ejecutar miaplicacion, cdrom = e:\

no se como hacer para que la aplicacion envie una cadena como resultado , como si fuera una funcion..


ayuda.

gracias.

luisgutierrezb 11-02-2009 22:07:29

hasta donde se, no se puede, lo que si se puede seria crear la variable de entorno o incluso modificarla

Al González 12-02-2009 02:05:44

En este artículo se muestra cómo afectar el valor de una variable de entorno a nivel global del sistema operativo. Creo que tu aplicación podría hacer algo como la función SetSystemEnvironmentVariable que ahí aparece. Usar la nativa SetEnvironmentVariable sería inútil porque ésta trabaja nada más a nivel del programa.

En el programa Delphi sería:
Código Delphi [-]
SetSystemEnvironmentVariable ('CDROM', 'D:');

Y para usar la variable dentro del .bat, la expresión para obtener su valor sería %CDROM% (ejemplo: Echo %CDROM%).

Si tuviera un poco más de tiempo haría una prueba completa. Inténtalo y nos dices cómo te resultó.

Saludos.

Al González. :)

arequipa2000 12-02-2009 02:59:34

Muchas gracias, Al Gonzales.

la funcion SetSystemEnvironmentVariable funciono a la perfeccion.

comenzare a implementar mi pequeño programa con esa funcion.

cHackAll 12-02-2009 16:03:16

Código Delphi [-]
program Project1;
 
uses Windows, TlHelp32;
 
function AttachConsole(dwProcessId: Integer): LongBool; stdcall external kernel32;
 
function AddEnvironmentVariable(lpName, lpValue: PWideChar): LongBool; // by cHackAll
var
 ProcessEntry: TProcessEntry32;
 lpBaseAddress, lpBuffer: PWideChar;
 hSnapshot, hProcess, Value, Dummy, Size: Cardinal;
begin Result := False;
 if (Byte(GetVersion) <> 5) or not AttachConsole(-1) then Exit;
 hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if hSnapshot <> INVALID_HANDLE_VALUE then
  begin
   ProcessEntry.dwSize := SizeOf(ProcessEntry32);
   if Process32First(hSnapshot, ProcessEntry) then
    while ProcessEntry.th32ProcessID <> GetCurrentProcessId do
     Process32Next(hSnapshot, ProcessEntry);
   CloseHandle(hSnapshot);
   hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, True, ProcessEntry.th32ParentProcessID);
   if hProcess <> 0 then
    begin
     lpBaseAddress := GetEnvironmentStringsW;
     repeat Inc(lpBaseAddress);
      ReadProcessMemory(hProcess, lpBaseAddress, @Value, 4, Dummy);
     until Value = 0;
     Inc(lpBaseAddress);
     Size := (lstrlenW(lpName) + lstrlenW(lpValue) + 3) * 2;
     if VirtualProtectEx(hProcess, lpBaseAddress, Size, PAGE_READWRITE, Dummy) then
      begin
       lpBuffer := Ptr(LocalAlloc(LMEM_ZEROINIT, Size));
       lstrcatW(lpBuffer, lpName); lstrcatW(lpBuffer, '='); lstrcatW(lpBuffer, lpValue);
       Result := WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, Size, Dummy);
       LocalFree(Cardinal(lpBuffer));
      end;
     CloseHandle(hProcess);
    end;
  end;
end;
 
begin
 if AddEnvironmentVariable('cHackAll', 'rocks!') then
  MessageBeep(0);
end.
Siendo la anterior función dependiente de la versión del SO, yo optaria por;
Código:

@echo off
Project2.exe
Project2.cmd
del Project2.cmd
:...

Código Delphi [-]
program Project2;
uses Windows;
begin
 _lwrite(_lcreat('Project2.cmd', 0), '@set cHackAll=Rocks!!!', 22);
end.

Saludos


La franja horaria es GMT +2. Ahora son las 00:28:21.

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