2013-01-04 13 views
13

kullanarak, Windows 2012 Server üzerinde BCDStore bilgi okunamıyor. Bu numara sadece kayıt için kullanılır.Biz şimdiki önyükleme yapılandırma tarafından belirlenen işlemci sayısını almak için aşağıdaki işlevi kullanırken WMI

işlevi aşağıda Ancak, Windows 2012 Server üzerinde başarısız, XP, Vista, 7, 2003 ve 2008. It üzerinde çalışıyor.

// -1 = not implemented or not allowed 
// 0 = not limited 
// >0 = number of processors in the {current} boot entry 
function Internal_GetBCDNumberOfProcessors: integer; 
var 
    objBcdStore : OleVariant; 
    objElement : OleVariant; 
    objWBL  : OleVariant; 
    objWMIService: OleVariant; 
begin 
    // for more info, see: http://stackoverflow.com/questions/7517965/accessing-bcdstore-from-delphi/7527164#7527164 
    Result := -1; 
    try 
    objWMIService := GetObject('winmgmts:{(Backup,Restore)}\\.\root\wmi:BcdStore'); 
    if (not VarIsNull(objWMIService)) and 
     boolean(objWMIService.OpenStore('', objBcdStore)) and 
     (not VarIsNull(objBcdStore)) and 
     boolean(objBcdStore.OpenObject('{fa926493-6f1c-4193-a414-58f0b2456d1e}', objWBL)) and 
     (not VarIsNull(objWBL)) 
    then 
     if objWBL.GetElement($25000061, objElement) and //<-- fails here on Server 2012 
     (not VarIsNull(objElement)) 
     then 
     Result := StrToIntDef(objElement.Integer, 0) 
     else 
     Result := 0; 
    except 
    on E: EOleSysError do 
     Result := -1; 
    end; 
end; 

Ben Win2012 üzerinde çalıştırmak denerseniz

, objWBL.GetElement metin OLE error D0000225 ile EOleSysError durum oluşturur. Google, bu hata kodu :(

Yığın izleme istisna VarDispInvoke tarafından çağrılan DispatchInvoke tarafından çağrılan System.Win.ComObj.DispatchInvokeError tetiklenir söylüyor.

ile ilgili anlamlı bir şey bulamazsa

bu XE2'de kullanılarak yeniden edildi Tümü. Ben XE3 ile sorunu tekrarlamak istiyorum, ancak ben Delphi RTL onunla ilgisi inanmıyorum.

kimse bu davranışın olası nedenleri hakkında bir fikrin var mı?

+0

Güncelle 4 düzeltmeyi 1 var mı? –

+0

Evet, sahip olmalıydım. İki kere kontrol edeceğim. (Exe, * U4H1'in kurulu olması gereken yapı sunucusunda oluşturuldu.) – gabr

+0

UAC açık veya kapalı? Süreç yükselmiş mi, yükseltilmemiş mi? –

cevap

1

GetElement kısmı:

eleman bulamaz ne yazık ki aynı zamanda

if objWBL.EnumerateElements(objArray) then try 
    for i := VarArrayLowBound(objArray, 1) to VarArrayHighBound(objArray, 1) do begin 
    objElement := objArray[i]; 
    if objElement.Type = $25000061 then 
     Exit(objElement.Integer); 
    end; 
finally VarClear(objArray); end; 

Bu EOleException yükseltmek değil, ama:

if objWBL.GetElement($25000061, objElement) and //<-- fails here on Server 2012 
    (not VarIsNull(objElement)) 
then 
    Result := StrToIntDef(objElement.Integer, 0) 
else 
    Result := 0; 

EnumerateElements ile değiştirin edilebilir.

İlgili konular