DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 33227
今日帖子: 17
在线用户: 15
导航: 论坛 -> Web应用开发 斑竹:bodies  
作者:
男 wu_delphi (我的老本行) ★☆☆☆☆ -
普通会员
2009/4/15 17:54:33
标题:
如何读取通过CMD(CMDOS)中运行的*.exe带的参数? 浏览:2890
加入我的收藏
楼主: 如何读取通过CMD(CMDOS)中运行的*.exe带的参数
比如
在DOS命令下运行Delphi编译的*.exe:
E:\GFMIS\GFMIS1.1\CLIENT>fbis.exe -u 001 -p 009
我现在想取fbis.exe后面带的参数:-u 001 -p 009
Delphi中通过什么方法可以取得到呢?
请教,很急很急。
----------------------------------------------
-决定我们是谁?不是我们的能力,是我们的选择!
作者:
男 zbzb ( ) ★☆☆☆☆ -
盒子活跃会员
2009/4/15 20:44:23
1楼: 命令行参数:ParamStr
命令行参数数量:ParamCount
如上例中,ParamCount返回值为4,
ParamStr(1):-u
ParamStr(2):001
ParamStr(3):-p
ParamStr(4):009
另外,ParamStr(0)为程序自己。
----------------------------------------------
-
作者:
男 soft9999 (熟能生巧) ★☆☆☆☆ -
盒子活跃会员
2009/4/15 21:38:02
2楼: 自己写个程序替换掉那个然后就可以取出对应的参数了。
----------------------------------------------
此人发布的内容纯属虚构,如有雷同实属巧合。

盒子 FTP 地址,请在这里猛击鼠标左键。
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2009/4/16 10:03:58
3楼: type

  UNICODE_STRING = packed record

    Length: Word;

    MaximumLength: Word;

    Buffer: PWideChar;

  end;

  PUNICODE_STRING = UNICODE_STRING;

type

  PROCESS_PARAMETERS = packed record

    AllocationSize: ULONG;

    ActualSize: ULONG;

    Flags: ULONG;

    Unknown1: ULONG;

    Unknown2: UNICODE_STRING;

    InputHandle: THandle;

    OutputHandle: THandle;

    ErrorHandle: THandle;

    CurrentDirectory: UNICODE_STRING;

    CurrentDirectoryHandle: THandle;

    SearchPaths: UNICODE_STRING;

    ApplicationName: UNICODE_STRING;

    CommandLine: UNICODE_STRING;

    EnvironmentBlock: Pointer;

    Unknown: array[0..9 - 1] of ULONG;

    Unknown3: UNICODE_STRING;

    Unknown4: UNICODE_STRING;

    Unknown5: UNICODE_STRING;

    Unknown6: UNICODE_STRING;

  end;

  PPROCESS_PARAMETERS = ^PROCESS_PARAMETERS;

(*//

type

  _PEB = packed record

    Reserved1: array[0..2 - 1] of Byte;

    BeingDebugged: Byte;

    Reserved2: array[0..229 - 1] of Byte;

    Reserved3: array[0..59 - 1] of Pointer;

    SessionId: ULONG;

  end;

  PEB = _PEB;

  PPEB = ^PEB;

//*)

type

  PEB = packed record

    AllocationSize: ULONG;

    Unknown1: ULONG;

    ProcessHinstance: Longword;

    ListDlls: Pointer;

    ProcessParameters: PPROCESS_PARAMETERS;

    Unknown2: ULONG;

    Heap: THandle;

  end;

  PPEB = ^PEB;

type

  _PROCESS_BASIC_INFORMATION = packed record

    Reserved1: Pointer;

    PebBaseAddress: PPEB;

    Reserved2: array[0..1] of Pointer;

    UniqueProcessId: PULONG;

    Reserved3: Pointer;

  end;

  PROCESS_BASIC_INFORMATION = _PROCESS_BASIC_INFORMATION;

  PPROCESS_BASIC_INFORMATION = ^PROCESS_BASIC_INFORMATION;

  PROCESSINFOCLASS = (

    ProcessBasicInformation = 0,

    ProcessWow64Information = 26

  );

  NTSTATUS = DWORD;

function NtQueryInformationProcess(

  ProcessHandle: THandle;

  ProcessInformationClass: PROCESSINFOCLASS;

  ProcessInformation: Pointer;

  ProcessInformationLength: ULONG;

  ReturnLength: PULONG

): NTSTATUS; stdcall; external 'ntdll.dll' name 'NtQueryInformationProcess';

function Process_CmdLine(

  mProcessID: THandle

): WideString;

var

  vProcess: THandle;

  vProcessBasicInformation: PROCESS_BASIC_INFORMATION;

  vPEB: PEB;

  vNumberOfBytesRead: Longword;

  vProcessParameters: PROCESS_PARAMETERS;

begin

//设计 Zswang 2006-09-09 wjhu111#21cn.com 尊重作者,转贴请注明出处

  Result := '';

  vProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,

    False, mProcessID);

  if vProcess = 0 then Exit;

  try

    if NtQueryInformationProcess(

      vProcess,

      ProcessBasicInformation,

      @vProcessBasicInformation,

      SizeOf(vProcessBasicInformation),

      nil) <> 0 then Exit;

    if not ReadProcessMemory(vProcess,

      vProcessBasicInformation.PebBaseAddress,

      @vPEB,

      SizeOf(vPEB),

      vNumberOfBytesRead) then Exit;

    if not ReadProcessMemory(vProcess,

      vPEB.ProcessParameters,

      @vProcessParameters,

      SizeOf(vProcessParameters),

      vNumberOfBytesRead) then Exit;

    SetLength(Result, vProcessParameters.CommandLine.Length div 2);

    if not ReadProcessMemory(vProcess,

      vProcessParameters.CommandLine.Buffer,

      @Result[1],

      vProcessParameters.CommandLine.Length,

      vNumberOfBytesRead) then Exit;

  finally

    CloseHandle(vProcess);

  end;

end; { Process_CmdLine }

procedure EnableDebug();
var
    VerInfo:TOSVersionInfo;
    hToken:THANDLE;
    tkp:TOKEN_PRIVILEGES;
    Nothing:Cardinal;
begin
    VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
    GetVersionEx(VerInfo);
    if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
    Begin
        OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
        LookupPrivilegeValue(nil,'SeDebugPrivilege',tkp.Privileges[0].Luid);
        tkp.PrivilegeCount:= 1;
        tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
    end;
end;




用法:
  EnableDebug();//获取调试权限
  Memo1.Lines.Text := Process_CmdLine(要查看的进程ID);//获取命令含参数
----------------------------------------------
武稀松http://www.raysoftware.cn
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS