2013-06-25 3 views
1

미안은 파스칼 스크립트 설정을 INNO 자바 스크립트 코드를 다음 포트로 시도 :유형으로 유형 (알 수 없음)의 변형을 변환 할 수 없습니다 (파견)

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.AdminManager'); 
var appPoolsSection = adminManager.GetAdminSection('system.applicationHost/applicationPools', 'MACHINE/WEBROOT/APPHOST'); 
var appPoolsCollection = applicationPoolsSection.Collection; 
for (var i = 0; i < appPoolsCollection.Count; i++) 
{ 
    var appPool = appPoolsCollection.Item(i); 
    // doing someting with the application pool 
} 

이 코드는이 번역되었습니다 :

var AdminManager, AppPoolsSection, AppPoolsCollection, AppPool: Variant; 
    i: Integer; 
begin 
    AdminManager := CreateOleObject('Microsoft.ApplicationHost.AdminManager'); 
    AppPoolsSection := AdminManager.GetAdminSection('system.applicationHost/applicationPools', 'MACHINE/WEBROOT/APPHOST'); 
    AppPoolsCollection := AppPoolsSection.Collection; 
    for i := 0 to AppPoolsCollection.Count-1 do begin 
    AppPool := AppPoolsCollection.Item(i); 
    // doing someting with the application pool 
    end; 
end; 

그러나 라인 AppPoolsCollection := AppPoolsSection.Collection에 다음과 같은 오류를 제기한다 : 어떤 일이 있습니다

Exception: Could not convert variant of type (Unknown) into type (Dispatch). 

AppPoolsSection 오브젝트가 IDispach이고, IUnknown 일뿐만 아니라 파스칼 스크립트에 알릴 수 있습니까?

+0

귀하의 ['IAppHostAdminManager :: GetAdminSection'] (http://msdn.microsoft.com/en-us/library/aa965186 (V = vs.90)를. aspx) 메서드 호출이 어떻게 든 이상하게 보입니다. 세번째 매개 변수는'AppPoolsSection' 변수이고'HRESULT' 형 결과입니다. 그것은 당신의 코드가'HRESULT' 값을'AppPoolsSection' 변수에 전달할 때 실패했습니다. 나중에 그 콜렉션이라고 가정합니다. – TLama

+0

이것은 [여기] (http://www.iis.net/configreference/system.applicationhost/sites)의 자바 스크립트 예제의 직접 포트였습니다. 나는 인터페이스 선언을 사용하여 그것을 배울 것이다. 감사. –

답변

2

인터페이스 정의를 "가져 오기"하는 것보다 효과적이고 간단한 솔루션을 발견했습니다.

이 코드에 사용 된 모든 COM 구성 요소는 IDispatch (VBScript 또는 JScript에서 사용해야 함)를 구현 한 다음 VariantChangeType 함수를 가져와 IUnknown 참조를 IDispatch 참조로 캐스팅했습니다 (지원되지 않는 것처럼 보임). 파스칼 스크립트).

최종 규정을 따르십시오 :

function VariantChangeType(out Dest: Variant; Source: Variant; Flags, vt: Word): HRESULT; external '[email protected] stdcall'; 

function VarToDisp(Source: Variant): Variant; 
begin 
    Result := Unassigned; 
    OleCheck(VariantChangeType(Result, Source, 0, varDispatch)); 
end; 

procedure EnumerateAppPools(AppPools: TStrings); 
var AdminManager, Section, Collection, Item, Properties: Variant; 
    i: Integer; 
begin 
    AdminManager := CreateOleObject('Microsoft.ApplicationHost.AdminManager'); 
    Section := VarToDisp(AdminManager.GetAdminSection('system.applicationHost/applicationPools', 'MACHINE/WEBROOT/APPHOST')); 
    Collection := VarToDisp(Section.Collection); 
    for i := 0 to Collection.Count-1 do begin 
    Item := VarToDisp(Collection.Item(i)); 
    Properties := VarToDisp(Item.Properties); 
    if (VarToDisp(Properties.Item('managedPipelineMode')).Value = 1) and 
     (VarToDisp(Properties.Item('managedRuntimeVersion')).Value = 'v4.0') then 
     AppPools.Add(VarToDisp(Properties.Item('name')).Value); 
    end; 
end;