ÊÖ»úÕ¾
ÍøÍ¨·ÖÕ¾
µçÐÅÖ÷Õ¾
ÃÜ¡¡Âë:
Óû§Ãû£º
µ±Ç°Î»Öà : Ö÷Ò³>³ÌÐòÉè¼Æ>delphi>Áбí

¶¯Ì¬¼ÓÔØºÍ¶¯Ì¬×¢²áÀ༼ÊõµÄÉîÈë̽Ë÷

À´Ô´£º»¥ÁªÍø ×÷ÕߣºÎ÷²¿ÊýÂë ʱ¼ä£º2008-04-09
Î÷²¿ÊýÂë-È«¹úÐéÄâÖ÷»ú10Ç¿£¡40ÓàÏîÐéÄâÖ÷»ú¹ÜÀí¹¦ÄÜ,È«¹úÁìÏÈ!Ë«Ïß¶àÏßÐéÄâÖ÷»úÄϱ±·ÃÎʳ©Í¨ÎÞ×è!Ãâ·ÑÔùËÍÆóÒµÓʾÖ,.CNÓòÃû,×ÔÖú½¨Õ¾480ÔªÆð,Ãâ·ÑÊÔÓÃ7Ìì,ÂúÒâÔÙ¸¶¿î! P4Ö÷»ú×âÓÃ799Ôª/ÔÂ.Ô¸¶Ãâѹ½ð!

property IDEInfoCount: Integer read GetIDEInfoCount;
property ContainsUnit: TStrings read FContainsUnit;
property RequiresPackage: TStrings read FRequiresPackage;
property DcpBpiName: TStrings read FDcpBpiName;
end;
implementation

var
CurrentPackage : TPackage;

procedure RegComponentsProc(const Page: string;
const ComponentClasses: array of TComponentClass);
var
I : Integer;
IDEInfo : PIDEInfo;
begin
for i := 0 to High(ComponentClasses) do
begin
RegisterClass(ComponentClasses[I]);
new(IDEInfo);
IDEInfo.iPage := Page;
IDEInfo.iClass := ComponentClasses[I];
CurrentPackage.FPageInfos.Add(IDEInfo);
end;
end;

procedure EveryUnit(const Name: string; NameType: TNameType; Flags: Byte; Param:
Pointer);
begin
case NameType of
ntContainsUnit:
CurrentPackage.FContainsUnit.Add(Name);
ntDcpBpiName:
CurrentPackage.FDcpBpiName.Add(Name);
ntRequiresPackage:
CurrentPackage.FRequiresPackage.Add(Name);
end;
end;
{ TPackage }

constructor TPackage.Create(const FileName: string);
begin
FPackageFileName := FileName;
LoadPackage;
end;

procedure TPackage.ClearPageInfo;
var
I:Integer;
IDEInfo:PIDEInfo;
begin
for i:=FPageInfos.Count-1 downto 0 do
begin
IDEInfo:=FPageInfos[I];
Dispose(IDEInfo);
FPageInfos.Delete(I);
end;
FPageInfos.Clear;
end;

constructor TPackage.Create(const PackageHandle: THandle);
begin
FPackageFileName := GetModuleName(PackageHandle);
LoadPackage;
end;

destructor TPackage.Destroy;
var
I : Integer;
begin
FContainsUnit.Free;
FRequiresPackage.Free;
FDcpBpiName.Free;
if FPackHandle <> 0 then
begin
UnRegisterModuleClasses(FPackHandle);
ClearPageInfo;
FPageInfos.Free;
UnloadPackage(FPackHandle);
FPackHandle := 0;
end;
inherited Destroy;
end;

function TPackage.GetIDEInfoCount: Integer;
begin
Result := FPageInfos.Count;
end;

function TPackage.GetIDEInfo(Index: Integer): TIDEInfo;
begin
if (Index in [0..(FPageInfos.Count - 1)]) then
begin
Result := TIDEInfo(FPageInfos[Index]^);
end;
end;

procedure TPackage.LoadPackage;
var
Flags : Integer;
I : Integer;
UnitName : string;
begin
FPageInfos := TList.Create;
FContainsUnit := TStringList.Create;
FRequiresPackage := TStringList.Create;
FDcpBpiName := TStringList.Create;
FPackHandle := SysUtils.LoadPackage(FPackageFileName);
CurrentPackage := Self;
GetPackageInfo(FPackHandle, @FPackHandle, Flags, EveryUnit);
end;

function TPackage.RegClassInPackage: Boolean;
//¸Ãº¯ÊýÖ»ÄÜÔÚ¹¤³ÌÎļþÐèÒªVCL£¬RTLÁ½¸ö°üÎļþʱ²ÅÄÜÓÃ
//ÒòΪÎÒÃÇÐèÒª°ÑÈ«¾ÖµÄº¯ÊýÖ¸ÕëClasses.RegisterComponentsProcÖ¸ÏòÎÒÃÇ×Ô¼º
//º¯Êý£¨¸Ãº¯ÊýΪIDE×¼±¸£¬IDE»áΪËüÉ趨º¯Êý¶øÎÒÃǵijÌÐòҲҪģ·ÂIDEΪËüÉ趨º¯Êý£©¡£
//Èç¹û²»ÊÇ´øVCLºÍRTLÁ½¸ö°ü£¬ÄÇôÎÒÃÇÉèÖõÄÖ»ÊÇÎÒÃDZ¾ÉíClassesµ¥ÔªµÄº¯ÊýÖ¸Õë
//¶ø²»ÊǰüÀ¨PackageµÄÈ«¾ÖµÄ¡£
//
//¶øÓÐȤµÄÊÇÈç¹ûÎÒÃǵŤ³Ì²»´ø°üÔËÐУ¬ÄÇôÎÒÃÇ»ù±¾ÉÏ¿ÉÒÔͬʱÓÃËüÀ´²é¿´×î½ü¼¸¸ö°æ±¾µÄ
//Borland±àÒëÆ÷Ëù²úÉúµÄ°üÎļþ¶ø²»»á²úÉúÒì³££¬µ«Êǿؼþ²»Äܹ»×¢²áÁË¡£
var
I : Integer;
oldProc : Pointer;
RegProc : procedure();
RegProcName, UnitName: string;
begin
oldProc := @Classes.RegisterComponentsProc;
Classes.RegisterComponentsProc := @RegComponentsProc;
FPageInfos.Clear;
try
try
for i := 0 to FContainsUnit.Count - 1 do
begin
RegProc := nil;
UnitName := FContainsUnit[I];
RegProcName := ''''@'''' UpCase(UnitName[1])
LowerCase(Copy(UnitName, 2, Length(UnitName))) ''''@Register$qqrv'''';
//ºóÃæÕâ¸ö×Ö·û´®@Register$qqrvÊÇBorland¶¨ËÀÁ˵ģ¬Delphi5£¬6£¬7£¬BCB5£¬6¶¼ÊÇÕâÑù×ÓµÄ
//Delphi3ÊÇName ''''.Register@51F89FF7''''¡£¶øDelphi4ÊÖÀïûÓУ¬²»ÔøÊÔÑé¹ý
RegProc := GetProcAddress(FPackHandle,
PChar(RegProcName));
if Assigned(RegProc) then
begin
CurrentPackage := Self;
RegProc;
end;
end;
except
UnRegisterModuleClasses(FPackHandle);
ClearPageInfo;
Result := True;
Exit;
end;
finally
Classes.RegisterComponentsProc := oldProc;
end;
end;

end.
µ÷ÓÃÈçÏÂ
{ *********************************************************************** }
{ }
{ ³ÌÐòÖ÷´°Ìåµ¥Ôª }
{ }
{ wr960204(ÍõÈñ)2003-2-20 }
{ }

ÎÄÕÂÕûÀí£ºÎ÷²¿ÊýÂë--רҵÌṩÓòÃû×¢²á¡¢ÐéÄâÖ÷»ú·þÎñ
http://www.west263.com
ÒÔÉÏÐÅÏ¢ÓëÎÄÕÂÕýÎÄÊDz»¿É·Ö¸îµÄÒ»²¿·Ö,Èç¹ûÄúÒª×ªÔØ±¾ÎÄÕÂ,Çë±£ÁôÒÔÉÏÐÅÏ¢£¬Ð»Ð»!