ParamStr(1)传入的参数变成短文件名的问题?(300分)

  • 主题发起人 主题发起人 kde
  • 开始时间 开始时间
K

kde

Unregistered / Unconfirmed
GUEST, unregistred user!
我通过在注册表中c:/myapp.exe '%1'和其它相应的项把程序myapp和.jpg格式的文件关联,
然后再myapp的FormCreate中检查ParamCount,如果它大于0,则打开ParamStr(1)对应的文
件。当双击短文件名的jpg文件时,一切正常,但是双击长文件名的jpg文件,则从
ParamStr(1)得到的是长文件名对应的短文件名,这样我的程序中处理就有问题(因为要
调用TFileListBox.ApplyFilePath(ParamStr(1)),而ApplyFilePath处理短文件名有问题)。
请问应该如何解决? 我曾尝试用SHGetFileInfo(PChar(FileName), 0, Info, Sizeof(Info),
SHGFI_DISPLAYNAME)将ParamStr(1)转回长文件名,但发现转换后原来文件中的路径都没有了,
当然也就无法处理路径中包含长文件名的问题,请问还有无更好的方法。
 
//长文件名与短文件名互相转换换
function GetShortName(sLongName : string) : string;
var
sShortName : string;
nShortNameLen : integer;
begin
SetLength(sShortName, MAX_PATH);
nShortNameLen := GetShortPathName(PChar(sLongName),
PChar(sShortName), MAX_PATH-1);
if nShortNameLen = 0 then
begin
{ handle errors... }
end;
SetLength(sShortName, nShortNameLen);
Result := sShortName;
end;

function GetLongName(sShortName : string; var bError : boolean) : string;
var
bAddSlash : boolean;
SearchRec : TSearchRec;
nStrLen : integer;
begin
bError := False;
Result := sShortName;
nStrLen := Length(sShortName);
bAddSlash := False;
if sShortName[nStrLen] = '/' then
begin
bAddSlash := True;
SetLength(sShortName, nStrLen-1);
dec(nStrLen);
end;
if((nStrLen-Length(ExtractFileDrive(sShortName))) > 0) then
begin
if FindFirst(sShortName, faAnyFile, SearchRec) = 0 then
begin
Result := ExtractFilePath(sShortName) + SearchRec.name;
if bAddSlash then
begin
Result := Result + '/';
end;
end
else
begin
// handle errors... bError := True;
end;
FindClose(SearchRec);
end;
end;

function GetLongName(sShortName : string) : string;
var
s : string;
p : integer;
bError : boolean;
begin
Result := sShortName;
s := '';
p := Pos('/', sShortName);
while(p > 0)do
begin
s := GetLongName(s + Copy(sShortName, 1, p), bError);
Delete(sShortName, 1, p);
p := Pos('/', sShortName);
if(bError)then
Exit;
end;
if sShortName <> '' then
begin
s := GetLongName(s + sShortName, bError);
if bError then
Exit;
end;
Result := s;
end;
 
^_^,我开始也遇到你说的一摸一样的问题,这是我的代码,C++Builder的
if(ParamCount() > 0)
{
AnsiString TempStr = "";
int i;
for(i=1; i < ParamCount(); i++)
TempStr += ParamStr(i) + " ";
TempStr += ParamStr(i);
if(FileExists(TempStr))
{
ShowItems(true);
CreateNewPage(false, TempStr);
CurrentEditor->Lines->LoadFromFile(TempStr);
dxTotalLineNumber->Caption = "总共: " + IntToStr(CurrentEditor->Lines->Count) + " 行";
AddMRUList(TempStr);
}
else
{
MessageBox(NULL,"最可能出错的地方是程序参数有误,就是/n/n说您要加载的文件的全路径名不正确。",
"程序启动出错",MB_OK|MB_ICONSTOP);
exit(0);
}
}
 
我又仔细看了一下你的问题,唉!这样的问题用300分太浪费了呀!
其实,关键问题在于你将ParamStr(1)当成全部的参数了。
假设 c:/myapp.exe '%1' 对应的实际命令行如下
c:/myapp.exe c:/Program Files/DevExpress ExpressBars for BCB5 v4.1.jpg
整个参数部分是“c:/Program Files/DevExpress ExpressBars for BCB5 v4.1.jpg”,这里不仅有空格,
还有点,应该myapp的FormCreate中这样提取参数部分:

if(ParamCount() > 0)
{
AnsiString TempStr = "";
int i;
for(i=1; i < ParamCount(); i++)
TempStr += ParamStr(i) + " ";
TempStr += ParamStr(i);
//到这里,TempStr = "c:/Program Files/DevExpress ExpressBars for BCB5 v4.1.jpg"
if(FileExists(TempStr))
......
}

这样,根本就不会出现长短文件名的相互转换问题了。
 
Yes,Agree with HD_Copy!因为参数是以空格作为间隔符,所以你只抓一个ParamStr(1)是不
完整的,你都将ParamStr中的都抓进来.上面的是C语言的,我给你改成Delphi的.
var strPar:string;
i:integer;
begin
if ParamCount>0 then
for i=1 to ParamCount do
strpar:=strpar+ParamStr(i);
ShowMessage(strpar);
end;
 
好像有一个API函数是直接转化长文件名为短文件名的,请问各位大虾怎么用?[?]
 
GetShortPathName何GetLongPathNameAPI吗,
小人物已经实现了GetShortPathName,但是他的短文件名转换为长文件名函数就有点太老土了
点,当然也不是不可以啦
 
多人接受答案了。
 
后退
顶部