2012-02-14 4 views
6

मुझे इनो सेटअप के साथ बनाई गई स्थापना के दौरान ड्राइव अक्षर के लिए वॉल्यूम सीरियल नंबर प्राप्त करने की आवश्यकता है। मुझे पता है कि डीएलएल कार्यों को इनो में आयात किया जा सकता है, लेकिन मैं इसके लिए काफी नया हूं और इसे काम करने में कुछ समस्याएं हैं। मुझे पता है कि kernel32 में GetVolumeInformation फ़ंक्शन जो मुझे चाहिए वह कर सकता है। क्या कोई मुझे दिखा सकता है कि वॉल्यूम सीरियल नंबर पुनर्प्राप्त करने के लिए इनो स्क्रिप्ट में उस कार्यक्षमता को आयात और उपयोग कैसे करें?मैं इनो सेटअप में GetVolumeInformation का उपयोग कैसे कर सकता हूं?

धन्यवाद!

उत्तर

7

InnoSetup कोड ::

[Code] 
function GetVolumeInformation(
    lpRootPathName: PChar; 
    lpVolumeNameBuffer: PChar; 
    nVolumeNameSize: DWORD; 
    var lpVolumeSerialNumber: DWORD; 
    var lpMaximumComponentLength: DWORD; 
    var lpFileSystemFlags: DWORD; 
    lpFileSystemNameBuffer: PChar; 
    nFileSystemNameSize: DWORD 
): BOOL; 
    external '[email protected] stdcall'; 


function LoWord(dw: DWORD): WORD; 
begin 
    Result := WORD(dw); 
end; 

function HiWord(dw: DWORD): WORD; 
begin 
    Result := WORD((dw shr 16) and $FFFF); 
end; 

function WordToHex(w: WORD): string; 
begin 
    Result := Format('%.4x', [w]); 
end; 

function FindVolumeSerial(const Drive: string): string; 
var 
    FileSystemFlags: DWORD; 
    VolumeSerialNumber: DWORD; 
    MaximumComponentLength: DWORD; 
begin 
    Result := ''; 
    // Note on passing PChars using RemObjects Pascal Script: 
    // '' pass a nil PChar 
    // #0 pass an empty PChar  
    if GetVolumeInformation(
    PChar(Drive), 
    '', // nil 
    0, 
    VolumeSerialNumber, 
    MaximumComponentLength, 
    FileSystemFlags, 
    '', // nil 
    0) 
    then 
    Result := WordToHex(HiWord(VolumeSerialNumber)) + '-' + WordToHex(LoWord(VolumeSerialNumber)); 
end; 

function InitializeSetup(): Boolean; 
begin 
    MsgBox(FindVolumeSerial('c:\'), mbInformation, mb_Ok); 
end; 

Inno- साथ परीक्षण किया गया सेटअप संस्करण 5.2.3
Inno-सेटअप के यूनिकोड संस्करणों में PCharPAnsiChar साथ

+0

आपको बार-बार धन्यवाद। बेवकूफ होने के लिए मुझे माफ़ कर दो, लेकिन मैं इसकी व्याख्या कैसे करूं? उदाहरण के लिए, मेरे सी ड्राइव को कमांड प्रॉम्प्ट पर 44 9 डी -0 सी 30 के रूप में लेबल किया गया है, लेकिन जब मैं आपका इनो कोड चलाता हूं तो msgstr "17565-3120 दिखाता है। मुझे पता है कि मैं सही रास्ते पर हूं, लेकिन मैं इनो में कार्यों को आयात करने के लिए नया हूं! आपकी मदद के लिए बहुत बहुत धन्यवाद! हेक्स दशमलव में – user1208402

+0

17565-3120 44 9 डी -0 सी 30 है। मेरा संपादन देखें। – kobik

+0

मैंने कई लोगों को ठोस सलाह दी है। मैं नया ढेर हूं, तो मैं उन्हें उनके योगदान के लिए क्रेडिट कैसे दे सकता हूं? – user1208402

4

चूंकि InnoSetup पॉइंटर्स का समर्थन नहीं करता है तो आपको GetVolumeInformation फ़ंक्शन के कॉल के लिए बाहरी लाइब्रेरी बनाना होगा। निम्नलिखित कोड नमूने डेल्फी और इनोसेटअप के सभी संयोजनों के लिए काम करना चाहिए (यूनिकोड समर्थन बिंदु से)।

यहाँ डेल्फी पुस्तकालय कोड है:

library VolumeInformation; 

uses 
    Types, Classes, SysUtils, Windows; 

var 
    SerialNumber: AnsiString; 

function GetVolumeSerial(Drive: PAnsiChar): PAnsiChar; stdcall; 
var 
    FileSystemFlags: DWORD; 
    VolumeSerialNumber: DWORD; 
    MaximumComponentLength: DWORD; 
begin 
    SerialNumber := ''; 
    GetVolumeInformationA(Drive, nil, 0, @VolumeSerialNumber, 
    MaximumComponentLength, FileSystemFlags, nil, 0); 
    SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) + ' - ' + 
    IntToHex(LoWord(VolumeSerialNumber), 4); 
    Result := PAnsiChar(SerialNumber); 
end; 

exports 
    GetVolumeSerial; 

end. 

और यहाँ InnoSetup कोड है:

[Files] 
Source: "VolumeInformation.dll"; Flags: dontcopy 

[Code] 

function GetVolumeSerial(Drive: PAnsiChar): PAnsiChar; 
    external '[email protected]:VolumeInformation.dll stdcall setuponly'; 

procedure ButtonOnClick(Sender: TObject); 
var 
    S: string; 
begin 
    S := GetVolumeSerial('c:\'); 
    MsgBox(S, mbInformation, mb_Ok); 
end; 
+0

मैं कोशिश की थी बातें बहुत उन लोगों के समान है, वास्तव में मुझे लगता है कि एक ही डेल्फी लेख यह काम करने के लिए प्राप्त करने की कोशिश को देखा बदलें। लेकिन मुझे त्रुटियां मिल रही हैं। आपके द्वारा प्रदान किए गए कोड का उपयोग करके, मुझे फ़ंक्शन आयात में "अज्ञात प्रकार: PDWORD" मिलता है। यदि मैं इसे किसी और चीज़ में बदलता हूं तो यह तब तक अनुपालन करता है जब तक कि मुझे "अज्ञात पहचानकर्ता वॉल्यूम सेरियल नम्बर" प्राप्त न हो जाए जब यह @VolumeSerialNumber तक पहुंच जाए। मैंने यह देखने के लिए '@' को हटाने का प्रयास किया कि यह क्या होता है, और यह GetVolumeInformation() को कॉल करने के लिए सभी तरह से संकलित करता है और मुझे फ़ंक्शन कॉल के अंत में "टाइप मिस्चैच" त्रुटि प्राप्त होती है। कोई विचार? – user1208402

+1

@TLama, आप संदर्भ ("पॉइंटर्स") द्वारा चर पारित कर सकते हैं। आपको बस पैरामीटर को 'var lpVolumeSerialNumber: DWORD' आदि के रूप में घोषित करने की आवश्यकता है। कॉलर में '@' निर्दिष्ट करने की आवश्यकता नहीं है। एक और मुद्दा समारोह में 'शून्य 'गुजर रहा है। यह 'पीसीर' वैरिएबल जैसे' _NIL' 'को क्रेट करके और '# 0' असाइन करके किया जा सकता है। 'HiWord' और' LoWord' सरल मैक्रोज़ हैं। मैं 'IntToHex' के साथ अटक गया :) लेकिन मैं इनो के अंदर अपना प्रारंभिक कोड लागू करने और सीरियल नंबर प्राप्त करने में सक्षम था। लेकिन, मुझे लगता है कि एक अलग डीएलएल में सहायक कार्यों को रखने के लिए आपका अंतिम समाधान बहुत बेहतर है! +1 – kobik

+0

ऐसा लगता है जैसे इनो के नए संस्करण 'IntToHex' का समर्थन करते हैं, लेकिन इसे कार्यान्वित करना भी आसान है :) – kobik

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