Проблема в получении результата «Ассоциаторы» в запросе WMI (недопустимая операция! - PullRequest
2 голосов
/ 05 сентября 2010

Я хочу преобразовать в этом примере в код Delphi. Моя проблема в получении результата запроса оператора "Associators of":

procedure TUSB.GetInfo;
var
 WMIService : OLEVariant;
 DItems, PItems, LItems, VItems: OLEVariant;
 Drive, Partition, Logical, Volume : OLEVariant;
 Drives, Partitions, Logicals, Volumes : IEnumVARIANT;
 IValue : LongWord;
begin
 WMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
 DItems := WMIService.ExecQuery('select DeviceID, Model from Win32_DiskDrive where InterfaceType='+QuotedStr('USB'));

 Drives := IUnKnown(DItems._NewEnum) as IEnumVARIANT;
 Drives.Next(1, Drive, IValue);
 DeviceID := Drive.Properties_.Item('DeviceID', 0);

 PItems := WMIService.ExecQuery('associators of {{Win32_DiskDrive.DeviceID='+QuotedStr(DeviceID)+'}} where AssocClass = Win32_DiskDriveToDiskPartition');

 Partitions := IUnKnown(PItems._NewEnum) as IEnumVARIANT;
 Partitions.Next(1, Partition, IValue);
 **PDeviceID := Partition.Properties_.Item('DeviceID', 0);**

...

end;

В строке, отмеченной 2 звездочкой! Я получил ошибку: « недопустимая операция с вариантами », хотя в приведенном выше коде в том же коде ошибки нет!

в чем проблема? , в заявлении "Ассоциаторы" или ...?!

Большое спасибо ...

Ответы [ 2 ]

0 голосов
/ 06 сентября 2010

благодаря Франсуа ...

"Трудно сказать, не видя весь соответствующий код и декларации."

Но более подходящего Кодекса нет!Я изменил код следующим образом:

procedure TUSBItem.GetInfo;
var
 WMIService : OLEVariant;
 DItems, PItems, LItems, VItems: OLEVariant;
 Drive, Partition, Logical, Volume : OLEVariant;
 Drives, Partitions, Logicals, Volumes : IEnumVARIANT;
 IValue : LongWord;
begin
 WMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');

 DItems := WMIService.ExecQuery('select DeviceID, Model from Win32_DiskDrive where InterfaceType='+QuotedStr('USB'));
 Drives := IUnKnown(DItems._NewEnum) as IEnumVARIANT;
 while Drives.Next(1, Drive, IValue) = S_OK do
  begin
   DeviceID := Drive.Properties_.Item('DeviceID', 0);
   PItems := WMIService.ExecQuery('associators of {{Win32_DiskDrive.DeviceID='+QuotedStr(DeviceID)+'}} where AssocClass = Win32_DiskDriveToDiskPartition');
   Partitions := IUnKnown(PItems._NewEnum) as IEnumVARIANT;
   if Partitions.Next(1, Partition, IValue) = S_OK then
    begin
     if not VarIsNull(Partition) then
      PDeviceID := Partition.Properties_.Item('DeviceID', 0);
    end;
   ...
  end;
 ...
end;

В цикле Пока , для каждого варианта привода в приводе перечисления я получаю «DeviceID», я должен передать «DeviceID» вОператор «Associators of» для получения списка разделов, связанных с диском по «DeviceID» в результате запроса ...

В следующей строке я помещаю элементы в разделы как IEnumVARIANT, затем я проверяю,Помещение первого элемента Partition в Partition вернуло «S_OK» (успешно!), затем я проверяю Partition и, если это не t null then i get one of it s элементы с именем «DeviceID», но в этой строке я получаю сообщение об ошибке: «Invalid Variant Operation»

Существуют одинаковые способы получения DeviceID диска и DeviceID раздела, но когда я хочу получить DeviceID раздела, я получаю сообщение об ошибке, между ними и запросом WMI возникает другой вопрос.Проблема в том, но я не уверен!

есть несколько полезных предложений:

" Однако вы должны сохранить следующее вбудьте осторожны при написании вашего провайдера фреймворка:

* Make sure you support standard queries in your association class, especially queries where the reference properties are used in a WHERE clause. For more information, see CFrameworkQuery::GetValuesForProp.
* In your association class support, when you check to see if the endpoints exist, ensure you use the CWbemProviderGlue::GetInstanceKeysByPath or CWbemProviderGlue::GetInstancePropertiesByPath methods.

  These methods allow the endpoints to skip populating expensive or unneeded properties.
* Make sure any association endpoint classes support per-property Get methods. For more information, see Supporting Partial-Instance Operations. For more information about the query parameter, see CFrameworkQuery. **"**

, потому что это объясняет!Я думаю, что проблема в Пути!, означает, что я должен дать свою цель (здесь раздел) объекту WMIService, чтобы получить результаты!, есть какая-то помощь в этом, но я в полном замешательстве !!!!

Конечно, на Исходной странице , которую я конвертировал, ничего не говорится о пути ...!

спасибо большое ...

0 голосов
/ 05 сентября 2010

Трудно сказать, не видя весь соответствующий код и объявления.
Когда вы пишете:

Partitions.Next(1, Partition, IValue);  

Вы должны проверить, что вы действительно получаете то, что вы хотите в Partition.
Ив более общем смысле, для отладки вы всегда должны разбивать составной оператор для проверки каждого промежуточного шага:

Partition.Properties_  // is it correct? how many items?
Partition.Properties_.Item('DeviceID', 0) // if not OK try to iterate through all items
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...