2011-12-08 15 views
16

मैं अपने कोड में परिभाषित करना चाहता हूं जिस पर निष्पादन योग्य बनाया गया था। मैं स्वाभाविक रूप से उस प्रक्रिया को स्वचालित करना पसंद करूंगा।मैं अपने कोड के निरंतर दृश्य में निर्माण की तारीख को स्वचालित कैसे कर सकता हूं?

मुझे पता है कि मैं एक प्री-बिल्ड स्क्रिप्ट लिख सकता हूं, उदाहरण के लिए, पर्ल, .inc फ़ाइल को दिनांक वाली फ़ाइल लिखने के लिए। मैं, शायद, पर्यावरण चर या निर्माण चर का उपयोग कर एक और हल्के समाधान पसंद करेंगे। क्या msbuild किसी भी चर प्रदान करता है जो मदद करेगा? क्या किसी को समस्या का एक साफ समाधान पता है?

+0

मैं यह पहचानने के लिए स्वाभाविक रूप से EXE फ़ाइल की 'दिनांक संशोधित' और/या 'दिनांक निर्मित' को देखता हूं, लेकिन यह सुनिश्चित नहीं करता कि यह आधिकारिक निर्माण तिथि से अलग हो सकता है - इसलिए मैं उत्तर देने के बजाय टिप्पणी कर रहा हूं। –

+0

वह है, फ़ाइल के गुण प्राप्त करने के लिए 'Application.ExeName' का उपयोग करें, आवश्यक दिनांक पढ़ना। –

+0

@ जेरी जिसे संशोधित किया जा सकता है। मैं उस तारीख को चाहता हूं जब एक्सई बनाया गया था, एक निरंतर –

उत्तर

28

आप निष्पादन की PE header से लिंकर टाइमस्टैम्प पढ़ सकते हैं:

function LinkerTimestamp: TDateTime; overload; 
begin 
    Result := PImageNtHeaders(HInstance + Cardinal(PImageDosHeader(HInstance)^._lfanew))^.FileHeader.TimeDateStamp/SecsPerDay + UnixDateDelta; 
end; 

पुराने संस्करण:

uses 
    ImageHlp; 

function LinkerTimeStamp(const FileName: string): TDateTime; overload; 
var 
    LI: TLoadedImage; 
begin 
    Win32Check(MapAndLoad(PChar(FileName), nil, @LI, False, True)); 
    Result := LI.FileHeader.FileHeader.TimeDateStamp/SecsPerDay + UnixDateDelta; 
    UnMapAndLoad(@LI); 
end; 

वर्तमान मॉड्यूल के लोड छवि के लिए, निम्न काम करने के लिए लगता है डेल्फी ने इसे सही तरीके से अपडेट नहीं किया है लेकिन इसे डेल्फी 2010 या उसके आसपास तय किया गया है। पिछले संस्करणों के लिए, मैंने एक सफल संकलन के बाद स्वचालित रूप से अपडेट करने के लिए IDE plugin का उपयोग किया था।

नोट: मूल्य यूटीसी के रूप में संग्रहीत किया जाता है ताकि प्रदर्शन उद्देश्यों के लिए आपको इसे उचित टाइमज़ोन में परिवर्तित करने की आवश्यकता हो।

+2

बहुत बहुत धन्यवाद। मुझे नहीं लगता था कि यह संभव होगा। मुझे खुशी है मैंने अभी पूछा! –

+2

:-) आपका स्वागत है, मुझे मदद करने में खुशी है! –

+2

बढ़िया! आप स्थानीय समय में कनवर्ट करने के लिए DateUtils routine का उपयोग कर सकते हैं: 'TTimeZone.Local.ToLocalTime()' –

5

DDevExtensions में संस्करणinfo संसाधन में संकलन दिनांक और समय शामिल करने का विकल्प है। मुझे लगता है कि मैं तुम्हें दिखाता कैसे इस कार्यक्रम के अंदर से निकालने के लिए है कि करने के लिए नहीं है ...

अद्यतन स्वचालित के बारे में बनाता है: FinalBuilder एक ऐसी ही विकल्प है।

+0

मैं अपने स्वयं के संस्करण संसाधन का उपयोग करता हूं। क्या DDevExtensions टूल आपके इन-टूल्स टूल्स का उपयोग कर भरोसा करता है? –

+0

मुझे नहीं पता। आपको एंडी से सीधे एक सभ्य उत्तर प्राप्त करने के लिए कहा जाना चाहिए। वह आमतौर पर काफी मददगार है। –

8

यदि आप JCL का उपयोग करते हैं तो jclPEImage.PeReadLinkerTimeStamp() आपके बाद क्या होता है। डेल्फी के पुराने संस्करणों ने लिंकर टाइमस्टैम्प सेट नहीं किया है, लेकिन AFAIK नए संस्करण करते हैं (यानी यह डी 2010 के साथ ठीक काम करता है)।

1

वास्तव में टीकंपाइल एक डेल्फी एकजुट नहीं है। आप इसे here, on EDN पा सकते हैं। और (बस पृष्ठ की एक प्रतिलिपि):

NonVisual घटक है कि इकाई फ़ाइल "Project.pas" संशोधित करता है। इस फ़ाइल में बिल्ड नंबर के साथ परियोजना को संकलित करने की तिथि और समय है। इस घटक को TForm पर ड्रॉ करें, फिर प्रोजेक्ट पथ सेट करें। यह प्रोजेक्टपाथ प्रॉपर्टी फ़ील्ड में कैरेट रखकर, एंटर कुंजी दबाकर किया जा सकता है।

यूएसईएस खंड में "परियोजना" शामिल करें; प्रोजेक्ट को सेव करें, फिर डेल्फी से बाहर निकलें। अगली बार परियोजना डेल्फी में खोला गया है, इकाई फ़ाइल "Project.pas" बनाई जाएगी। फिर प्रत्येक बार जब आप डेल्फी के अंदर से प्रोग्राम चलाते हैं, तो यूनिट फ़ाइल को वर्तमान दिनांक, समय और बिल्ड नंबर के साथ अपडेट किया जाएगा।

1

मैं अपने सभी बिल्ड करने के लिए फ़ाइनलबिल्डर का उपयोग करता हूं, और इसके साथ एक उपयोगिता को जोड़ना आसान है जो एक चर या स्थिर की परिभाषा को खोजने और संशोधित करने के लिए संकलन के पहले किसी भी स्रोत फ़ाइल को अपडेट करेगा। मैं संस्करण संख्या, तिथियां, कुछ भी बनाता हूं जो इस तरह समझ में आता है।

0

यह कोड नए डेल्फी संस्करणों में काम करता है, समय को प्राप्त करने और इसे स्थानीय समय में परिवर्तित करने में जोड़ता है।

function GetExeBuildTime: TDateTime; 
var 
    LI: TLoadedImage; 
    {$IF CompilerVersion >= 26.0} 
    m: TMarshaller; 
    {$IFEND} 
    timeStamp: Cardinal; 
    utcTime: TDateTime; 
begin 
    {$IF CompilerVersion >= 26.0} //XE7 requires TMarshaller to convert to PAnsiChar 
    Win32Check(MapAndLoad(PAnsiChar(m.AsAnsi(ParamStr(0)).ToPointer), nil, @LI, False, True)); 
    {$ELSE} 
    Win32Check(MapAndLoad(PAnsiChar(AnsiString(ParamStr(0))), nil, @LI, False, True)); 
    {$IFEND} 
    timeStamp := LI.FileHeader.FileHeader.TimeDateStamp; 
    UnMapAndLoad(@LI); 

    utcTime := UnixToDateTime(timeStamp); 
    Result := TTimeZone.Local.ToLocalTime(utcTime); 
end; 
0

डेल्फी का कोई भी संस्करण, बस विंडोज बैच बनाने से पहले एक .inc फ़ाइल बनाने के लिए। कोई आईडीई बिल्कुल जरूरी नहीं है।

यहाँ स्क्रिप्ट:

REM CommandInterpreter: $(COMSPEC) 
@echo off 

setlocal enabledelayedexpansion 
setlocal 
rem determine project top level directory from command file name 
set PRJDIR=%~dp0 
cd %PRJDIR% 

set BUILD_DATE_FILE=%PRJDIR%Source\BuildDate.inc 

call :GetGurrentDateTime&set BUILD_YEAR=!current_year!&set BUILD_MONTH=!current_month!&set BUILD_DAY=!current_day!&set BUILD_TIME=!current_time! 

echo const BUILD_YEAR = %BUILD_YEAR%;> "%BUILD_DATE_FILE%" 
:: 3 letter name Apr for April 
echo const BUILD_MONTH = '%BUILD_MONTH%';>> "%BUILD_DATE_FILE%" 
echo const BUILD_DAY = %BUILD_DAY%;>> "%BUILD_DATE_FILE%" 
echo const BUILD_TIME = '%BUILD_TIME%';>> "%BUILD_DATE_FILE%" 

goto :EOF 
echo Done 
exit /b 0 

:GetGurrentDateTime 
rem GET CURRENT DATE 
echo.>"%TEMP%\~.ddf" 
makecab /D RptFileName="%TEMP%\~.rpt" /D InfFileName="%TEMP%\~.inf" -f "%TEMP%\~.ddf">nul 
for /f "tokens=4,5,6,7" %%a in ('type "%TEMP%\~.rpt"') do (
    if not defined current_date ( 
     set "current_date=%%d-%%a-%%b" 
     set "current_time=%%c" 
    set "current_year=%%d" 
    set "current_month=%%a" 
    set "current_day=%%b" 
    ) 
) 

स्रोत कोड में सिर्फ BuildDate.inc फ़ाइल और उपयोग consts BUILD_* शामिल हैं।

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

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