2010-03-05 13 views
5

का उपयोग कर उपलब्ध समांतर बंदरगाहों और उनके आई/ओ पते को कैसे ढूंढें, मुझे लगता है कि डब्लूएमआई बहुत शक्तिशाली है और ऐसा लगता है कि यह एक पीसी हार्डवेयर के अधिकांश गुणों को वापस करने में सक्षम है। मैं किसी भी पीसी पर उपलब्ध समांतर बंदरगाहों को प्रदर्शित करना चाहता हूं और उनके आई/ओ पते ढूंढना चाहता हूं - मुझे पता है कि आम तौर पर यह कर्नेल ड्राइवर का उपयोग करके किया जाता है लेकिन यह एक विरासत की आवश्यकता है - न पूछें! वर्तमान में हम डिवाइस मैनेजर में देखते हैं और फिर वहां प्रदर्शित पते में टाइप करना होगा। मैं इस जानकारी को जानने के लिए डब्लूएमआई का उपयोग करना चाहता हूं। 1 पर WMI कक्षाओं का एक उत्कृष्ट सेट है लेकिन मैं नहीं देख सकता कि पुनरावृत्ति कैसे करें।डेल्फी और डब्लूएमआई

धन्यवाद।

उत्तर

2

एक WMI से एक जटिल जानकारी निकालने के लिए प्रयोग करना चाहिए। मैंने अपने पीसी पर समांतर बंदरगाह पते खोजने की कोशिश की है और यह रिपोर्ट है:

सबसे पहले मैंने सभी समांतर बंदरगाहों को खोजने के लिए Win32_ParallelPort क्लास से पूछताछ की है। (पहले अपनी पोस्ट में PRUZ के समान कोड का उपयोग करके): 'Win32_ParallelPort से * चुनें *। परिणाम है (मैं अपने सिस्टम में केवल एक समानांतर पोर्ट है):

instance of Win32_ParallelPort 
{ 
    Availability = 3; 
    Caption = "LPT1"; 
    ConfigManagerErrorCode = 0; 
    ConfigManagerUserConfig = FALSE; 
    CreationClassName = "Win32_ParallelPort"; 
    Description = "LPT1"; 
    DeviceID = "LPT1"; 
    Name = "LPT1"; 
    OSAutoDiscovered = TRUE; 
    PNPDeviceID = "ACPI\\PNP0401\\4&25C6B52A&0"; 
    PowerManagementSupported = FALSE; 
    ProtocolSupported = 17; 
    SystemCreationClassName = "Win32_ComputerSystem"; 
    SystemName = "JUPITER"; 
}; 

दूसरा, मैं पूछे है Win32_PNPAllocatedResource ('* Win32_PnPAllocatedResource से चुनें')। मुझे यहां बहुत सारी जानकारी मिली है, लेकिन मैंने केवल 3 प्रविष्टियों को पीएनपीडीवाइसिसआईडी = "एसीपीआई \ पीएनपी 04401 \ 4 & 25C6B52A & 0" चुना है।

instance of Win32_PNPAllocatedResource 
{ 
    Antecedent = "\\\\JUPITER\\root\\cimv2:Win32_PortResource.StartingAddress=\"888\""; 
    Dependent = "\\\\JUPITER\\root\\cimv2:Win32_PnPEntity.DeviceID=\"ACPI\\\\PNP0401\\\\4&25C6B52A&0\""; 
}; 


instance of Win32_PNPAllocatedResource 
{ 
    Antecedent = "\\\\JUPITER\\root\\cimv2:Win32_PortResource.StartingAddress=\"1912\""; 
    Dependent = "\\\\JUPITER\\root\\cimv2:Win32_PnPEntity.DeviceID=\"ACPI\\\\PNP0401\\\\4&25C6B52A&0\""; 
}; 


instance of Win32_PNPAllocatedResource 
{ 
    Antecedent = "\\\\JUPITER\\root\\cimv2:Win32_DMAChannel.DMAChannel=3"; 
    Dependent = "\\\\JUPITER\\root\\cimv2:Win32_PnPEntity.DeviceID=\"ACPI\\\\PNP0401\\\\4&25C6B52A&0\""; 
}; 

तीसरी प्रविष्टि कोई रूचि नहीं है। पहले दो प्रविष्टियों हमें दो (दशमलव) शुरू करने के पते (888 और 1912)

अंत में मैं पूछे है Win32_PortResource ('* Win32_PortResource से चुनें') इसी के लिए शुरू के पते समाप्ति पता लगाने के लिए देता है 888 और 1912:

instance of Win32_PortResource 
{ 
    Alias = FALSE; 
    Caption = "0x00000378-0x0000037F"; 
    CreationClassName = "Win32_PortResource"; 
    CSCreationClassName = "Win32_ComputerSystem"; 
    CSName = "JUPITER"; 
    Description = "0x00000378-0x0000037F"; 
    EndingAddress = "895"; 
    Name = "0x00000378-0x0000037F"; 
    StartingAddress = "888"; 
    Status = "OK"; 
}; 


instance of Win32_PortResource 
{ 
    Alias = FALSE; 
    Caption = "0x00000778-0x0000077B"; 
    CreationClassName = "Win32_PortResource"; 
    CSCreationClassName = "Win32_ComputerSystem"; 
    CSName = "JUPITER"; 
    Description = "0x00000778-0x0000077B"; 
    EndingAddress = "1915"; 
    Name = "0x00000778-0x0000077B"; 
    StartingAddress = "1912"; 
    Status = "OK"; 
}; 

मैं RRUZ रूप में एक ही कोड का इस्तेमाल किया है अपडेट किया गया, जीयूआई आवेदन में (देखें नीचे)। केवल एक चीज जिसे आप संकलित करने की आवश्यकता है वह WbemScripting_TLB.pas इकाई है। इकाई द्वारा प्रकार लायब्रेरी आयात विज़ार्ड उत्पन्न होता है, तो आप my blog

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    TForm1 = class(TForm) 
    Memo1: TMemo; 
    Button4: TButton; 
    Button5: TButton; 
    Button6: TButton; 
    procedure Button4Click(Sender: TObject); 
    procedure Button5Click(Sender: TObject); 
    procedure Button6Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

uses WbemScripting_TLB, ActiveX; 


{$R *.dfm} 


procedure TForm1.Button4Click(Sender: TObject); 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    Memo1.Lines.Clear; 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_PnPAllocatedResource','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Memo1.Lines.Add(SWbemObject.GetObjectText_(0)); 
    end; 
    end; 
end; 

procedure TForm1.Button5Click(Sender: TObject); 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    Memo1.Lines.Clear; 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_PortResource','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Memo1.Lines.Add(SWbemObject.GetObjectText_(0)); 
    end; 
    end; 
end; 

procedure TForm1.Button6Click(Sender: TObject); 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    Memo1.Lines.Clear; 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_ParallelPort','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Memo1.Lines.Add(SWbemObject.GetObjectText_(0)); 
    end; 
    end; 
end; 

end. 
+0

यह आशाजनक सर्ज दिखता है - पते मेरा लक्ष्य हैं - कुछ मोटे डेल्फी कोड का कोई मौका? धन्यवाद ब्रायन। –

+0

@ सर्ग: ग्रेट - मैं अनुभवी हूं। धन्यवाद। ब्रायन। –

+0

@ सर्ग: यह बहुत अच्छा काम करता है, बहुत धन्यवाद - बिल्कुल मुझे जो शुरू करने के लिए जरूरी था। –

1

हो सकता है यह तुम्हारी मदद करेगा:

uses ComObj, ActiveX; 

function TForm1.GetObject(const objectName: String): IDispatch; 
var 
    bindCtx: IBindCtx; 
    moniker: IMoniker; 
    chEaten: Integer; 
begin 
    OleCheck(CreateBindCtx(0, bindCtx)); 
    OleCheck(MkParseDisplayName(bindCtx, StringToOleStr(objectName), chEaten, moniker)); 
    OleCheck(moniker.BindToObject(bindCtx, nil, IDispatch, Result)); 
end; 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    objWMIService: OLEVariant; 
    colItems, colItem: OLEVariant; 
    oEnum : IEnumvariant; 
    iValue, test : longword; 
begin 
    objWMIService := GetObject('winmgmts:\\YourPCname\root\CIMV2'); 
    colItems := objWMIService.ExecQuery('SELECT * FROM Win32_ParallelPort',,48); 
    oEnum := IUnknown(colItems._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, colItem, iValue) = 0 do begin 
    //You can get all the properties here 
    //for example colItem.Caption 
    // properties of Win32_ParalelPort class : http://msdn.microsoft.com/en-us/library/aa394247%28VS.85%29.aspx 
    end; 
end; 
1

@Brian, तो आप सिर्फ जानकारी पाने के लिए Win32_parallelPort वर्ग का उपयोग करें।

इस कोड को चेक करें।

program GetWMI_ParallelPortInfo; 

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    Classes, 
    ActiveX, 
    Variants, 
    SysUtils, 
    WbemScripting_TLB in '..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas'; 

procedure GetWMIParallelPortInfo; 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_ParallelPort','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Writeln(SWbemObject.GetObjectText_(0));//The GetObjectText_ method of the SWbemObject object returns a textual rendering of the object in MOF format 
    end; 
    end; 
end; 

begin 
try 
    CoInitialize(nil); 
    try 
     GetWMIParallelPortInfo; 
     Readln; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:Exception do 
    Begin 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    End; 
    end; 
end. 

alt text http://i48.tinypic.com/2e67wxz.png

+0

@RRUZ धन्यवाद, कोड मुझे एक शुरुआत देता है। मैं 'StartAddress' पैरामीटर कैसे पा सकता हूं? ब्रायन। –

+0

@RRUZ: पॉइंटर्स के लिए धन्यवाद - अब हल हो गया। –

1

में डेल्फी 2009 में प्रक्रिया के बारे में पढ़ सकते हैं मुझे समझ नहीं आता क्या मूल्यों की जरूरत है।
आप इस जानना चाहते हैं तो:

alt text http://img682.imageshack.us/img682/2382/imagen333.png

मुझे लगता है कि आप Win32_PortResource वर्गों और Win32_portConnector

में पा सकते हैं आप पुष्टि कर सकते हैं कि यह ऐसा है?
एक परीक्षण करें; एक अध्यक्ष एवं प्रबंध निदेशक खिड़कियों और प्रकार खोलें:
> WMIC पोर्ट सूची पूर्ण

alt text http://img215.imageshack.us/img215/1696/imagen332.png

यह मान है कि आप खोज रहे हैं है, तो आप एक new component in GLibWMI बढ़ने लगता है (या आप मदद के लिए मुझसे कहते) कर सकते हैं कि इस मूल्य को पुनः प्राप्त करें।

सम्मान।

पीडी: अंग्रेजी के साथ गलतियों के लिए Excuseme।

+0

हां! यह वही है जो मैं चाहूंगा। मुझे समझ में नहीं आता कि जानकारी कैसे दिखाना है, और एक समान समस्या तब होती है जब दो समांतर बंदरगाह होते हैं, मुझे केवल पहले के लिए जानकारी नहीं जाननी चाहिए। मुझे आशा है कि मैं भ्रमित नहीं हूं। आपका अंग्रेजी ठीक है! ब्रायन। –

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