당신의 C++ 객체는 ATL이 모든 불쾌한 작업을 수행 할 듀얼 인터페이스라는 것을 지원하기 때문에 걱정할 필요가 없습니다.
.
이 변종하려면 COM 헤더는 내가 여기에 사용합니다있는 편리한 매크로와 상수 우리에게 제공 (VT_BOOL, V_VT(), V_BOOL()는 실패()) :
// I usually initialize to Empty at the top of the method,
// before anything can go wrong.
VariantInit(bAllShared);
// My bad -- ignore the above. It applies to [out] parameters only.
// Because bAllShared is passed as a [ref] variable,
// calling VariantInit() on them would leak any preexisting value.
// Instead, read the incoming value from the variable (optional),
// then "clear" them before storing new values (mandatory):
// This API figures out what's in the variable and releases it if needed
// * Do nothing on ints, bools, etc.
// * Call pObj->Release() if an Object
// * Call SysFreeString() if a BSTR
// etc
VariantClear(bAllShared);
을 초기화; 이전 값이 유출됩니다.
읽기에 VARIANT
: // Always check that the value is of the proper type
if (V_VT(bAllShared) == VT_BOOL) {
// good
bool myArg = (V_BOOL(bAllShared) == VARIANT_TRUE);
} else {
// error, bad input
}
또는 더 나은, VBScript를 사용자가 "참"기대 때문에 항상 자신을 변환하려고해야하며, 1은 VARIANT_TRUE 같은 행동.
// This is exactly the same thing that VBScript does internally
// when you call CBool(...)
VARIANT v;
VariantInit(&v);
if(FAILED(VariantChangeType(&v, &bAllShared, 0, VT_BOOL))
{
// error, can't convert
}
bool myArg = (V_BOOL(v) == VARIANT_TRUE);
가 VARIANT
에 쓸 수 :
// Internal working value
bool isShared;
...
// set the Variant's type to VARIANT_BOOL
V_VT(bAllShared) = VT_BOOL;
// set the value
V_BOOL(bAllShared) = (isShared ? VARIANT_TRUE : VARIANT_FALSE);
이제 두 번째 문제는 샘플 VBScript 코드에 있습니다
m_oReportManager.GetReportAccessRights _
CLng(m_lRptCod), CBool(bAllShared), CBool(bAllRunOnly), CBool(bAllCopy)
다행히도, COM은 대한 멋진 유틸리티 API를 가지고 CBool(something)
등의 인수로 전달하기 때문에 실제 변수이 아닌 임시 변수 (CBool (...)의 반환 값)를 전달합니다.등 올바른 C++ 구현으로도 반환 값은 중간 값으로 버려집니다.
은이 같은 메소드를 호출해야합니다 맞아
m_oReportManager.GetReportAccessRights _
CLng(m_lRptCod), bAllShared, bAllRunOnly, bAllCopy
합니다. 값을 "변환"할 필요가 없습니다. VBScript는 사용자의 작업과 상관없이 항상 VARIANT
을 전달합니다. 위에서 말했듯이 bool 등의 입력 매개 변수에 대해서도 ATL이 CBool()
을 호출하므로 걱정하지 마십시오.
(ATL은 네,하지만 CBool ()가 간단한 래퍼 주위 VariantChangeType()
입니다? CBool은()?가 아닌 VBScript 함수 것을 호출하고, 그 ATL 당신을 위해 호출 할 것입니다)
편집 : 다른 것을 언급하는 것을 잊어 버렸습니다 : VBScript는 [out]
매개 변수를 지원하지 않습니다. [ref]
매개 변수 만 C++에서 매개 변수를 [out]
으로 선언하지 마십시오. 메서드가 [out]
매개 변수를 선언하면 VBScript는 [ref]
매개 변수 인 것처럼 작동합니다. 그러면 들어오는 매개 변수의 값이 유출됩니다. [out] 인수 중 하나가 원래 문자열 인 경우 해당 메모리가 유출됩니다. 그것이 객체를 가지고 있다면, 그 객체는 결코 파괴되지 않을 것입니다.
굉장한 답글 !! 감사. – ssorrrell
+1 매우 철저한 대답. – Tester101