благодаря Франсуа ...
"Трудно сказать, не видя весь соответствующий код и декларации."
Но более подходящего Кодекса нет!Я изменил код следующим образом:
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, чтобы получить результаты!, есть какая-то помощь в этом, но я в полном замешательстве !!!!
Конечно, на Исходной странице , которую я конвертировал, ничего не говорится о пути ...!
спасибо большое ...