vcl源码研究,GetParamStr()的解释?(20分)

  • 主题发起人 主题发起人 champainzb
  • 开始时间 开始时间
C

champainzb

Unregistered / Unconfirmed
GUEST, unregistred user!
我偶尔看到vcl的源码中有如下一段
function ParamCount: Integer;
{$IFDEF MSWINDOWS}
var
P: PChar;
S: string;
begin
Result := 0;
P := GetParamStr(GetCommandLine, S);
while True do
begin
P := GetParamStr(P, S);
if S = '' then Break;
Inc(Result);
end;
{$ENDIF}
{$IFDEF LINUX}
begin
if ArgCount > 1 then
Result := ArgCount - 1
else Result := 0;
{$ENDIF}
end;
我知道此函数返回是命令行的参数个数,但找不到GetParamStr()的源码,我想可能是比较低层的,问题是我猜不出GetparamStr的作用,因此无法知道整个的算法,你知道吗?有兴趣的话,帮我猜猜。
 
取得命令行参数。
 
我想知道更具体的内容,比如P := GetParamStr(GetCommandLine, S);中,
执行后p得到的是什么地址,s有什么变化。
 
看看深入浅出MFC,这本书上对WINDOWS的SHELL有比较好的介绍。
另外你在找找SYSTEM单元看看,因为那是不用USES就可以直接使用里面的函数的。
我也很想知道,有结果了希望公布出来!!!
 
特别是这个循环
while True do
begin
P := GetParamStr(P, S);
if S = '' then Break;
Inc(Result);
end;
GetParamStr应该具备什么功能才能实现ParamCount的目的呢?
 
不好意思是我自己粗心,找到源码了,就在system.pas中,研究中......

thanks RealyFail
 
搞定。
function GetParamStr(P: PChar
var Param: string): PChar;
主要功能:取得P的第一个参数过滤掉'"'后赋给Param输出,同时返回第二个参数前的space
的地址或结束时的地址。源码如下,附注释。
function GetParamStr(P: PChar
var Param: string): PChar;
var
i, Len: Integer;
Start, S, Q: PChar;
begin
//找到真正的P的起始,跳过操作符和空字符串
while True do
begin
while (P[0] <> #0) and (P[0] <= ' ') do
P := CharNext(P);
if (P[0] = '"') and (P[1] = '"') then Inc(P, 2) else Break;
end;
//获取第一个参数的长度赋给Lens
Len := 0;
Start := P;
while P[0] > ' ' do
begin
if P[0] = '"' then
begin
P := CharNext(P);
while (P[0] <> #0) and (P[0] <> '"') do
begin
Q := CharNext(P);
Inc(Len, Q - P);
P := Q;
end;
if P[0] <> #0 then
P := CharNext(P);
end
else
begin
Q := CharNext(P);
Inc(Len, Q - P);
P := Q;
end;
end;
//给Param定长
SetLength(Param, Len);
//将第一个参数赋值给Param。但不包括双引本身,如果有的话。
P := Start;
S := Pointer(Param);
i := 0;
while P[0] > ' ' do
begin
if P[0] = '"' then
begin
P := CharNext(P);
while (P[0] <> #0) and (P[0] <> '"') do
begin
Q := CharNext(P);
while P < Q do
begin
S := P^;
Inc(P);
Inc(i);
end;
end;
if P[0] <> #0 then P := CharNext(P);
end
else
begin
Q := CharNext(P);
while P < Q do
begin
S := P^;
Inc(P);
Inc(i);
end;
end;
end;
//返回第一个参数后加一的地址
Result := P;
end;
 
后退
顶部