2009-06-09 15 views
6

स्थिर कोड विश्लेषण उपकरण के लिए, किसी दिए गए डेल्फी प्रोजेक्ट के लिए सभी प्रभावी स्रोत पथों को जानना आवश्यक है, जिन्हें परियोजना स्तर पर और वैश्विक आईडीई कॉन्फ़िगरेशन में परिभाषित किया गया है।क्या कोई डेल्फी लाइब्रेरी है जो किसी प्रोजेक्ट के लिए सभी प्रभावी स्रोत पथ लौटाती है?

क्या कोई डेल्फी लाइब्रेरी है जो इस तरह की परियोजना की जानकारी एकत्र कर सकती है?

जहां तक ​​मुझे पता है, डेल्फी आईडीई के लिए रजिस्ट्री सेटिंग्स एकाधिक कॉन्फ़िगरेशन का समर्थन करने के लिए विभिन्न स्थानों पर हो सकती हैं। लेकिन आईडीई रजिस्ट्री स्थान और एक प्रोजेक्ट फ़ाइल के दिए गए संयोजन के लिए, स्रोत पथ एकत्र करना संभव होना चाहिए।

संपादित करें: एक और समाधान - डिस्पेंड स्विच का उपयोग करना है। यह dcc32.exe को पथ नाम सहित प्रोजेक्ट के सभी डीसीयू फ़ाइल नामों (और सभी निर्भरताओं) के साथ ".d" फ़ाइल लिखने का कारण बन जाएगा। हालांकि, फ़ाइल सूची में इकाइयां शामिल हैं जो पहले से संकलित हैं, इसलिए यह मूल समस्या के लिए सही समाधान नहीं है।

+0

कोई विशिष्ट डेल्फी संस्करण जिसे आप इसके लिए जानना चाहते हैं? –

+0

डेल्फी 200 9 - क्योंकि यह निर्माण कॉन्फ़िगरेशन के साथ बहुत जटिल है, जिसे विरासत में भी प्राप्त किया जा सकता है, और इसमें '$ (DCC_UnitSearchPath)' जैसे मैक्रोज़ शामिल हो सकते हैं - यह अपेक्षा से कठिन लगता है ... – mjn

उत्तर

8

बस एक और समाधान:

अगर मैं रेड स्टूडियो कमांड प्रॉम्प्ट का शुभारंभ और

msbuild /t:Rebuild 
परियोजना निर्देशिका में

चलाने के लिए, MSBuild यहाँ मेरी त्वरित परीक्षण डिजाइन पैकेज से एक इकाई है सभी पथ सेटिंग्स सहित, dcc32 को आमंत्रित करने के लिए पूर्ण कमांड लाइन दिखाएगा। बिल्ड लॉग को किसी फ़ाइल में रीडायरेक्ट करना (या एक स्वयं बनाया संस्करण के साथ dcc32.exe को प्रतिस्थापित करना जो केवल पैरामीटर को कैप्चर करता है) और आउटपुट को पार्स करना डीप्रोजेज़ फ़ाइलों को पार्स करने से कहीं अधिक आसान लगता है।

एक अन्य लाभ यह है कि इसका उपयोग स्वचालित निर्माण/निरंतर एकीकरण में किया जा सकता है।

10

आप सक्रिय प्रोजेक्ट के खोज पथ (सक्रिय कॉन्फ़िगरेशन और विकल्प सेट से विलय) और आईडीई के वैश्विक लाइब्रेरी पथ प्राप्त करने के लिए OpenTools API का उपयोग कर सकते हैं।

unit Unit1; 

interface 

uses 
    Windows, SysUtils, Classes, 
    ToolsAPI; 

type 
    TTestWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard) 
    private 
    { IOTAWizard } 
    function GetIDString: string; 
    function GetName: string; 
    function GetState: TWizardState; 
    procedure Execute; 
    { IOTAMenuWizard } 
    function GetMenuText: string; 
    private 
    function AddLibraryPaths(Strings: TStrings): Integer; 
    function AddProjectSearchPaths(Strings: TStrings): Integer; 
    end; 

procedure Register; 

implementation 

uses 
    Dialogs, 
    DCCStrs, TypInfo; 

var 
    WizardIndex: Integer = -1; 

procedure GetEnvironmentVariables(Strings: TStrings); 
var 
    P: PChar; 
begin 
    P := nil; 
    Strings.BeginUpdate; 
    try 
    Strings.Clear; 
    P := GetEnvironmentStrings; 
    repeat 
     Strings.Add(P); 
     P := StrEnd(P); 
     Inc(P); 
    until P^ = #0; 
    finally 
    if Assigned(P) then 
     FreeEnvironmentStrings(P); 
    Strings.EndUpdate; 
    end; 
end; 

function EvaluateEnvironmentVariables(const S: string): string; 
var 
    Strings: TStringList; 
    I: Integer; 
begin 
    Result := S; 

    Strings := TStringList.Create; 
    try 
    GetEnvironmentVariables(Strings); 
    for I := 0 to Strings.Count - 1 do 
     Result := StringReplace(Result, Format('$(%s)', [Strings.Names[I]]), Strings.ValueFromIndex[I], 
     [rfReplaceAll, rfIgnoreCase]); 
    finally 
    Strings.Free; 
    end; 
end; 

procedure Register; 
begin 
    WizardIndex := (BorlandIDEServices as IOTAWizardServices).AddWizard(TTestWizard.Create); 
end; 

{ TTestWizard private: IOTAWizard } 

function TTestWizard.GetIDString: string; 
begin 
    Result := 'TOndrej.TestWizard'; 
end; 

function TTestWizard.GetName: string; 
begin 
    Result := 'TestWizard'; 
end; 

function TTestWizard.GetState: TWizardState; 
begin 
    Result := [wsEnabled]; 
end; 

procedure TTestWizard.Execute; 
var 
    Paths: TStrings; 
begin 
    Paths := TStringList.Create; 
    try 
    AddProjectSearchPaths(Paths); 
    AddLibraryPaths(Paths); 
    ShowMessage(EvaluateEnvironmentVariables(Paths.Text)); 
    finally 
    Paths.Free; 
    end; 
end; 

{ TTestWizard private: IOTAMenuWizard } 

function TTestWizard.GetMenuText: string; 
begin 
    Result := GetIDString; 
end; 

function TTestWizard.AddLibraryPaths(Strings: TStrings): Integer; 
var 
    Paths: TStringList; 
    EnvironmentOptions: IOTAEnvironmentOptions; 
begin 
    Paths := TStringList.Create; 
    try 
    Paths.Delimiter := ';'; 
    Paths.StrictDelimiter := True; 
    EnvironmentOptions := (BorlandIDEServices as IOTAServices).GetEnvironmentOptions; 
    Paths.DelimitedText := EnvironmentOptions.Values['LibraryPath']; 
    Strings.AddStrings(Paths); 
    Result := Paths.Count; 
    finally 
    Paths.Free; 
    end; 
end; 

function TTestWizard.AddProjectSearchPaths(Strings: TStrings): Integer; 
var 
    ActiveProject: IOTAProject; 
    Configurations: IOTAProjectOptionsConfigurations; 
    Configuration: IOTABuildConfiguration; 
    Paths: TStringList; 
begin 
    Result := -1; 
    ActiveProject := GetActiveProject; 
    if not Assigned(ActiveProject) then 
    Exit; 
    Configurations := ActiveProject.ProjectOptions as IOTAProjectOptionsConfigurations; 
    Configuration := Configurations.ActiveConfiguration; 
    if not Assigned(Configuration) then 
    Exit; 

    Paths := TStringList.Create; 
    try 
    Configuration.GetValues(sUnitSearchPath, Paths, True); 
    Strings.AddStrings(Paths); 
    Result := Paths.Count; 
    finally 
    Paths.Free; 
    end; 
end; 

initialization 

finalization 
    if WizardIndex <> -1 then 
    (BorlandIDEServices as IOTAWizardServices).RemoveWizard(WizardIndex); 

end. 
+0

यह बहुत ही आशाजनक प्रतीत होता है, धन्यवाद बहुत! मैं ओटीए पर नजदीक नजर रखूंगा। प्रोजेक्ट स्रोत फ़ाइलों की एक सूची प्राप्त करना आसान है (सभी फाइलें जिन्हें डीपीआर में स्पष्ट रूप से जोड़ा गया है)? मैं GExpert/cnWizard स्रोतों पर भी एक नज़र डालेगा। – mjn

+0

हां, ओटीए के साथ आप एक परियोजना के मॉड्यूल की गणना कर सकते हैं। IOTAProject इंटरफ़ेस पर एक नज़र डालें। विशेष रूप से, IOTAProject40 विधियां GetModuleCount, GetModule। –

संबंधित मुद्दे

 संबंधित मुद्दे