2017-10-10 10 views
2

Matlab 내의 COM 컬렉션을 반복해야합니다. VB에서는 For Each item In Collection을 사용할 수 있습니다. 파이썬에서는 for item in Collection을 사용할 수 있습니다. 그러나 유감스럽게도 이러한 구조는 다음과 같은 간단한 루프를 사용하는 Matlab에서 사용할 수 없습니다.foreach 또는 .Item()없이 COM 컬렉션을 반복하십시오.

for index = 1 : Collection.Count 
    item = Collection.Item(index); 
    % now do something useful with the item 
end 

이 방법은 일반적으로 잘 작동합니다. 그러나 특정 컬렉션에서 .Item()은 숫자 인덱스가 아닌 문자열 (항목 이름) 만 허용합니다. 그래서 위의 코드 스 니펫은 루프를 반복하기 전에 항목 이름을 미리 알지 못하기 때문에 실패합니다.

VB에서는 item = Collection(index)을 수행 할 수 있지만 Matlab은 "item is Collection number index"로 인식하므로 Matlab에서는 실패합니다. 즉, Collection (2)는 Collection의 두 번째 항목이 아닌 두 번째 Collection에 액세스하려고합니다. 이것이 우리가 일반적으로 Matlab에서 .Item(index)을 사용하는 이유입니다.하지만 위에서 말했듯이 Item은 문자열 만 허용하는 특정 컬렉션에서는 실패합니다.

내 질문은 : foreach 구조 또는 Item(index) 메서드없이 COM 컬렉션을 반복 할 수 있습니까?

답변

0

COM에서이를 수행하는 방법을 알려줄 수는 있지만 Matlab에서이를 수행 할 수 있는지는 알 수 없습니다.

DISPID_NEWENUM이라는 특수한 속성이 있으며 이름은 _NewEnum입니다. 이 속성을 검색하면 IUnknown 인터페이스를 가져옵니다. QueryInterface을 통해 IEnumVARIANT에 대한 인터페이스를 얻을 수 있습니다.

이 인터페이스를 요청하십시오. 그런 다음 Next 메서드를 호출하고 반환 값이 더 이상 S_OK가 될 때까지 VARIANT를 VARIANT로 열거 형에서 검색합니다. 일반적으로 컬렉션의 끝에 도달하면 S_FALSE가 반환됩니다. 나는 Next를 호출 할 때 항상 1의 카운트를 사용한다.

따라서 MatLab이 IDispatch 이외의 다른 인터페이스를 사용할 수 있으면 가능해야합니다.

+0

답변 해 주셔서 감사합니다. 이 코드를 구현하는 간단한 VB 코드 스 니펫을 게시 하시겠습니까? 그 다음 VB 스크립트를 Matlab –

+0

으로 변환하려고 시도합니다. C/C++/C#만을 프로그래밍합니다. 하지만 [COM 개체] (https://de.mathworks.com/help/matlab/using-com-objects-in-matlab.html) 사용에 대한 MATLAB 사이트의 설명서를 찾았습니다 ... – xMRi

+0

불행히도 IEnumVariant는 아닙니다. Matlab에서 지원되므로 막 다른 골목처럼 보입니다 –