2012-06-25 31 views
1

好吧,我很難過。 我正在爲智能安裝製造商編寫一個安裝支持插件,它將爲我安裝一些組件 - AlphaControls :)德爾福組件安裝實用程序控制臺應用程序

而附件是一個控制檯應用程序。但出於某種原因[在代碼中]向「已知軟件包」註冊表位置添加軟件包,它希望添加一個額外的註冊表項,即使數組大小僅設置爲3.它正試圖添加一個.DPK文件,即使該數組是爲.BPL設置的。 Soo ...什麼地獄? 它的作品和所有,除了最後嘮叨的一點,它試圖添加。 編譯大小約爲97/98k,優化和壓縮後縮小到約48k

所以我想我的問題是,任何人都可以發現我似乎忽略的錯誤? 是的,我知道設置,但是...我已經花了錢在智能安裝製造商,所以我得使用它。
沒有編譯錯誤,甫一增加了一個額外的非.bpl文件到註冊表

代碼如下...

{Smart Install Maker installation support for components} 
{for Delphi 7.0 environment only} 
program pakghlp; 

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    SysUtils, 
    Classes, 
    Registry; 

var SPath, 
    BPLPath, 
    IDERoot, 
    DPKName: string; 

const 
BaseName = 'AlphaControls'; 

PackageRoot = 'AlphaControls\'; 

DPKFiles: array[1..5] 
    of string = ('acntD7_R.dpk', 
       'acntD7.dpk', 
       'aceD7_R.dpk', 
       'aceD7.dpk', 
       'AlphaDB7.dpk'); 

DPKArraySize = 5; 

BPLFiles: array[1..3] 
of string = ('aceD7.bpl', 
       'acntD7.bpl', 
       'AlphaDB7.bpl'); 

BPLDetails: array[1..3] 
of string = ('AlphaControls extra', 
       'AlphaControls', 
       'AlphaControls DB-aware pack'); 

BPLFileQty = 3; 

    LookFor: array[1..2] of string = ('*.dcp','*.bpl'); 
    LookForQty = 2; 

    RegPath = ';$(DELPHI)\Components\AlphaControls'; 

procedure InitVariables; 
var 
    RegKey: TRegistry; 
TargetKey: string; 
    LibPath: string; 
begin 
RegKey:= TRegistry.Create; 
    try 
    RegKey.RootKey := HKEY_CURRENT_USER; 
    TargetKey:= 'Software\Borland\Delphi\7.0'; 
    if RegKey.OpenKeyReadOnly(TargetKey) then 
     begin 
     IDERoot:= RegKey.ReadString('RootDir'); 
     RegKey.CloseKey; 

     TargetKey:= 'Software\Borland\Delphi\7.0\Library'; 
     RegKey.OpenKeyReadOnly(TargetKey); 
     SPath:= RegKey.ReadString('Search Path'); 
     LibPath:= RegKey.ReadString('Package DPL Output'); 
     RegKey.CloseKey; 

     LibPath:= StringReplace(LibPath,'$(DELPHI)','',[rfIgnoreCase]); 
     BPLPath:= IDERoot + LibPath + '\'; 
     end; 
    finally 
    RegKey.Free; 
    end; 
end; 

procedure GetListing(const SearchFor: String; ImportList:TStringList); 
var SrchResult : TSearchRec; 
begin 
if FindFirst(SearchFor, faAnyFile, SrchResult) = 0 then 
    begin 
    repeat 
    ImportList.Add(SrchResult.name); 
    until FindNext(SrchResult) <> 0; 
    FindClose(SrchResult); 
    end; 
end; 

procedure GetBaseNames(Listing: TStringList); 
var TempList: TStringList; 
      i: integer; 
    BaseName: string; 
begin 
    TempList:= TStringList.Create; 
    TempList.Delimiter:= ';'; 
    TempList.DelimitedText:= SPath; 
    Listing.Clear; 
    for i:= 0 to TempList.Count - 1 do 
    begin 
    BaseName:= TempList[i]; 
    StringReplace(BaseName,'$(DELPHI)','X:\Dummy\Folder',[rfIgnoreCase]); 
    Listing.Add(ExtractFileName(BaseName)); 
    end; 
    TempList.Free; 
end; 

function AlreadyExists: boolean; 
var CheckList: TStringList; 
      i: integer; 
    Installed: boolean; 
begin 
    CheckList:= TStringList.Create; 
    GetBaseNames(CheckList); 

    for i:= 0 to CheckList.Count -1 do 
    begin 
    if CheckList[i] = BaseName 
     then Installed:= true; 
     if Installed = true then break; 
    Installed:= false; 
    end; 
CheckList.Free; 
Result:= Installed; 
end; 

procedure ProcessIDE(InstallType: integer); 
var RegKey: TRegistry; 
    TempList: TStringList; 
     i,j: integer; 
    NewSPath, 
    RegName, 
    RegValue, 
    DelEntry: string; 
begin 
RegKey:= TRegistry.Create; 
    case InstallType of 

    0: begin {-uninstall} 
     TempList:= TStringList.Create; 
     TempList.Delimiter:= ';'; 
     TempList.DelimitedText:= SPath; 
     DelEntry:= copy(RegPath,2,Length(RegPath)); 
     for i:= 0 to TempList.Count - 1 do 
      begin 
      if TempList[i] = DelEntry 
      then 
      begin 
       Templist.BeginUpdate; 
       Templist.Delete(i); 
       TempList.EndUpdate; 
      end; 
      end; 
      NewSPath:= TempList.DelimitedText; 
      try 
      RegKey.RootKey:= HKEY_CURRENT_USER; 
      RegKey.OpenKey('Software\Borland\Delphi\7.0\Library',false); 
      RegKey.WriteString('Search Path',NewSPath); 
      RegKey.CloseKey; 

      RegKey.OpenKey('Software\Borland\Delphi\7.0\Known Packages',false); 
      for i:= 0 to BPLFileQty do 
       begin 
       RegName:= BPLPath + BPLFiles[i]; 
       RegKey.DeleteValue(RegName); 
       end; 
      finally 
      RegKey.CloseKey; 
      end; 
     TempList.Free; 
     end; 

    1: begin {-install} 
      SPath:= SPath + RegPath; 
      try 
      RegKey.RootKey:= HKEY_CURRENT_USER; 
      RegKey.OpenKey('Software\Borland\Delphi\7.0\Library',false); 
      RegKey.WriteString('Search Path',SPath); 
      RegKey.CloseKey; 

      RegKey.OpenKey('Software\Borland\Delphi\7.0\Known Packages',false); 
      for j:= 0 to BPLFileQty do 
       begin 
       RegName:= BPLPath + BPLFiles[j]; 
       RegValue:= BPLDetails[j]; 
       RegKey.WriteString(RegName,RegValue); 
       end; 
      finally 
      RegKey.CloseKey; 
      end; 
     end; 
    end; 
RegKey.Free; 
end; 

procedure CompilePackage(PackageName: String; Wait: Boolean); 
var 
    StartInfo : TStartupInfo; 
    ProcInfo : TProcessInformation; 
    CreateOK : Boolean; 
begin 
    FillChar(StartInfo,SizeOf(TStartupInfo),#0); 
    FillChar(ProcInfo,SizeOf(TProcessInformation),#0); 
    StartInfo.cb := SizeOf(TStartupInfo); 
    CreateOK := CreateProcess(nil, PChar(PackageName), nil, nil,False, 
       CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, 
       nil, nil, StartInfo, ProcInfo); 
    if CreateOK then 
    begin 
     if Wait then 
     WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    end 
    else 
    begin 
     WriteLN('Unable to compile: ' + DPKName); 
    end; 
    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 
end; 

procedure ProcessPackages; 
var Package: string; 
      i: integer; 
const DCC32 = 'DCC32 '; 
begin 
    for i:= 1 to DPKArraySize do 
    begin 
    DPKName:= ExpandFileName(GetCurrentDir + '\..') 
      + '\' + PackageRoot + DPKFiles[i]; 
    Package:= DCC32 + '"' + DPKName + '"'; 
    CompilePackage(Package,true); 
    Sleep(500); 
    end; 
end; 

procedure ProcessFiles(InstallType: integer); 
var TempList: TStringList; 
    MoveList: TextFile; 
     i,j: integer; 
    FileFrom, 
     FileTo, 
    ParentDir, 
    SearchType: string; 
begin 
    case InstallType of 

    0: begin {-uninstall} 
      AssignFile(MoveList,'pakghlp.dat'); 
      Reset(MoveList); 
      while not eof(MoveList) do 
       begin 
       readLn(MoveList,FileFrom); 
       if FileExists(FileFrom) 
       then DeleteFile(PChar(FileFrom)); 
       end; 
      CloseFile(MoveList); 
      DeleteFile(PChar('pakghlp.dat')); 
     end; 

    1: begin {-install} 
     ProcessPackages; 
      if FileExists('pakghlp.dat') then DeleteFile(PChar('pakghlp.dat')); 
      AssignFile(MoveList,'pakghlp.dat'); 
      Rewrite(MoveList); 
      ParentDir:= ExpandFileName(GetCurrentDir + '\..') + '\'; 
      TempList:= TStringList.Create; 
      for i:= 1 to LookForQty do // file extension types 
      begin 
       SearchType:= ParentDir + PackageRoot + LookFor[i]; 
       GetListing(SearchType,TempList); 
       for j:= 0 to Templist.Count - 1 do 
       begin 
        FileFrom:= ParentDir + PackageRoot + TempList[j]; 
        FileTo:= BPLPath + TempList[j]; 
        CopyFile(PChar(FileFrom),PChar(FileTo),False); 
        DeleteFile(PChar(FileFrom)); 
        WriteLn(MoveList,FileTo); 
       end; 
      end; 
      CloseFile(MoveList); 
     end; 
    end; 
TempList.Free; 
end; 

procedure InstallComponents; 
begin 
    InitVariables; 
    if AlreadyExists then ProcessFiles(1) // refresh corrupt .dcu's. 
    else 
    begin // didn't previously exist 
     ProcessFiles(1); 
     ProcessIDE(1); 
    end; 
end; 

procedure RemoveComponents; 
begin 
    InitVariables; 
    ProcessFiles(0); 
    ProcessIDE(0); 
end; 

{ ----- Console Application Begins Here ------- } 
begin 
    if ParamCount = 0 then exit; 

    if ParamStr(1) = '-install' 
    then InstallComponents; 

    if ParamStr(1) = '-uninstall' 
    then RemoveComponents 

    else exit; // garbage trap 
end. 
+1

你已經屈服於「沉沒成本」謬誤。你花錢買東西,你認爲這會讓你使用它,但不管你使用它還是沒有錢!你可以在沒有額外花錢的情況下獲得更好的工具,那麼誰在乎你在劣質產品上的花費?假裝你把它花在免費產品上,而不是讓你感覺更好。 –

回答

1

發出似與用於迭代的BPLFiles陣列上的索引。這是基於1索引,並且您使用的是基於0的索引。

const 
    BPLFiles: array[1..3] 
    of string = ('aceD7.bpl', 
        'acntD7.bpl', 
        'AlphaDB7.bpl'); 

恰克這個代碼

for i:= 0 to BPLFileQty do 
    begin 
     RegName:= BPLPath + BPLFiles[i]; 
     RegKey.DeleteValue(RegName); 
    end; 

for i:= 1 to BPLFileQty do 
    begin 
     RegName:= BPLPath + BPLFiles[i]; 
     RegKey.DeleteValue(RegName); 
    end; 

而這種代碼

 for j:= 0 to BPLFileQty do 
      begin 
      RegName:= BPLPath + BPLFiles[j]; 
      RegValue:= BPLDetails[j]; 
      RegKey.WriteString(RegName,RegValue); 
      end; 

 for j:= 1 to BPLFileQty do 
      begin 
      RegName:= BPLPath + BPLFiles[j]; 
      RegValue:= BPLDetails[j]; 
      RegKey.WriteString(RegName,RegValue); 
      end; 
+0

以及所有被詛咒。我必須至少在十幾次的時間裏仔細看過那部分內容,它正盯着我。大聲笑。我改變了它,現在它完美運行。還有一些其他的東西[上面沒有顯示]也是固定的。至於謬誤,是的,我猜你的權利。但由於你的幫助,現在它的工作很好,我保持它。 –

相關問題