Com Server가 realloce ([in, out] caclsid * arg)를 할 수 있습니까?
-
03-07-2019 - |
문제
COM 인터페이스 메소드가 다음과 같이 선언되었습니다.
[ object,
uuid(....),
]
interface IFoo : IUnknown
{
HRESULT Foo([in, out] CACLSID * items);
}
마샬링과 관련하여 서버가 계산 된 배열을 재 할당 할 수 있습니까? (나 생각한다 그것은 더 이상 확실하지 않습니다)
현재 구현은 기존 ID 만 대체하지만 새 인터페이스를 도입하지 않고 더 많은 항목을 반환 할 수있는 변경 사항 (계약을 중단하지 않음)을 구현하고 싶습니다.
편집하다 점에 유의하시기 바랍니다 Caclsid 카운트와 포인터가 포함 된 배열입니다.
해결책
나는 오랫동안 COM을하지 않았지만 새 배열을 할당하는 것도 가능합니까? 이 경우에는 그렇지 않아야합니다 CACLSID ** items
?
다른 팁
이 COM 라이브러리를 사용하여 요소를 사용하여 많은 수의 요소에 대한 공간을 나타내는 두 번째 매개 변수로 카운트를 제공해야합니다.
먼저, 원한다면 Foo
내 배열을 수락하려면 카운트를 제공하는 매개 변수를 추가해야합니다.
HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items);
경고 :이 코드는 컴파일되지 않았으며 문서화를 꺼냅니다.
둘째, 선언을 변경하지 않고는이 방법의 외부 동작을 수정할 수 없습니다. 크기 조정을 지원하려면 배열을 재 할당하고 주소를 전달할 수 있어야합니다. 당신은 a를 사용할 수 있습니다 SAFEARRAY
또는 선언합니다 cItems
그리고 items
원래 유형으로의 포인터로 Foo
예를 들어 :
HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items);
다시, 컴파일되지 않으므로, 당신은 이것을 사용하면 실제로 무엇을하고 있는지 알아야합니다.
제휴하지 않습니다 StackOverflow