특성 프로그래밍 FAQ
이 항목에서는 다음에 대 한 질문과 대답 합니다.
HRESULT는 무엇입니까?
특성의 매개 변수 이름을 지정할 수 있는 경우
의견을 특성 블록에서 사용할 수 있습니까?
특성이 상속과 상호 작용 하는 방법
특성된 ATL 프로젝트에서 특성을 사용 하려면 어떻게 해야 합니까?
특성 사용된 프로젝트에서.idl 파일을 어떻게 사용할 수 있습니까?
특성에 의해 삽입 된 코드를 수정할 수 있습니까?
어떻게 앞으로 특성 사용된 인터페이스를 선언할 수 있습니다.
특성에서는 특성을 사용 하는 클래스에서 파생 된 클래스에 사용할 수 있습니까?
HRESULT는 무엇입니까?
HRESULT 자주 반환 값으로 특성 및 ATL에서 일반적 사용 하는 단순 데이터 형식입니다.다음 표에서 다양 한 값에 설명합니다.더 많은 값을 헤더 파일이 아니라 winerror.h에 포함 되어 있습니다.
Name |
설명 |
값 |
---|---|---|
S_OK |
작업 성공 |
0x00000000 |
E_UNEXPECTED |
예기치 않은 오류 |
0x8000ffff는 |
E_NOTIMPL |
구현 되지 않음 |
0x80004001 |
E_OUTOFMEMORY |
필요한 메모리를 할당 하지 못했습니다. |
0x8007000E |
E_INVALIDARG |
하나 이상의 인수가 잘못 되었습니다. |
0x80070057 |
E_NOINTERFACE |
지원 되지 않는 인터페이스 |
0x80004002 |
E_POINTER |
잘못 된 포인터 |
0x80004003 |
E_HANDLE |
잘못 된 핸들 |
0x80070006 |
E_ABORT |
작업이 중단 되었습니다 |
0x80004004 |
E_FAIL |
지정 되지 않은 오류 |
0x80004005 |
이 실패 |
일반 액세스 거부 오류 |
0x80070005 |
특성의 매개 변수 이름을 지정할 수 있는 경우
단일 매개 변수는 특성이 있을 경우 대부분의 경우 해당 매개 변수 라고 합니다.이 이름은 특성을 코드에 삽입 하는 경우 필요 하지 않습니다.예를 들어, 다음 사용에 있는 집계 가능한 특성:
[coclass, aggregatable(value=allowed)]
class CMyClass
{
// The class declaration
};
정확 하 게 동일 합니다.
[coclass, aggregatable(allowed)]
class CMyClass
{
// The class declaration
};
그러나 다음과 같은 특성이 단일, 명명 되지 않은 매개 변수가 있습니다.
의견을 특성 블록에서 사용할 수 있습니까?
한 줄 및 여러 줄을 모두 주석 특성 블록 내에서 사용할 수 있습니다.그러나 속성을 사용 하는 매개 변수를 보유 하는 괄호 안에 메모의 두 스타일 중 하나를 사용할 수 없습니다.
다음 허용 됩니다.
[ coclass,
progid("MyClass.CMyClass.1"), /* Multiple-line
comment */
threading("both") // Single-line comment
]
다음 허용 됩니다.
[ coclass,
progid("MyClass.CMyClass.1" /* Multiple-line comment */ ),
threading("both" // Single-line comment)
]
특성이 상속과 상호 작용 하는 방법
특성 사용 및 해결 되지 않은 클래스 자체 또는 않는 볼 수 있습니다 다른 클래스 로부터 상속할 수 있습니다.가 특성 사용된 클래스에서 파생 한 결과 특성 공급자가 해당 코드를 변환한 후 해당 클래스에서 파생 시키는 것입니다.특성은 C++ 상속을 통해 클래스를 파생 하도록 전송 되지 않습니다.특성 공급자만 코드의 특성으로 변환합니다.
특성된 ATL 프로젝트에서 특성을 사용 하려면 어떻게 해야 합니까?
.Idl 파일이 있는 특성된 ATL 프로젝트에 있을 수 있습니다 한 특성된 개체를 추가 할 수 있습니다.이 경우 클래스 추가 마법사를 사용 하는 코드를 제공 합니다.
특성 사용된 프로젝트에서.idl 파일을 어떻게 사용할 수 있습니까?
특성을 사용 하는 ATL 프로젝트에 사용 하려는.idl 파일이 있을 수 있습니다.사용 합니다이 경우에 importidl 특성,.idl 파일의.h 파일을 컴파일할 (참조 하십시오의 MIDL 속성 페이지 프로젝트의 속성 페이지 대화 상자에서), 다음 프로젝트의.h 파일을 포함 합니다.
특성에 의해 삽입 된 코드를 수정할 수 있습니까?
일부 특성은 프로젝트에 코드를 삽입 합니다.사용 하 여 삽입 된 코드를 볼 수 있는 /Fx 컴파일러 옵션.삽입 된 파일에서 코드를 복사 하 고 소스 코드에 붙여넣을 수 있습니다.이 특성의 동작을 수정할 수 있습니다.그러나, 함께 사용자 코드의 다른 부분을 수정 해야 합니다.
다음 샘플의 소스 코드 파일에 삽입 된 코드를 복사 결과입니다.
// attr_injected.cpp
// compile with: comsupp.lib
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>
[ module(name="MyLibrary") ];
// ITestTest
[
object,
uuid("DADECE00-0FD2-46F1-BFD3-6A0579CA1BC4"),
dual,
helpstring("ITestTest Interface"),
pointer_default(unique)
]
__interface ITestTest : IDispatch {
[id(1), helpstring("method DoTest")]
HRESULT DoTest([in] BSTR str);
};
// _ITestTestEvents
[
uuid("12753B9F-DEF4-49b0-9D52-A79C371F2909"),
dispinterface,
helpstring("_ITestTestEvents Interface")
]
__interface _ITestTestEvents {
[id(1), helpstring("method BeforeChange")] HRESULT BeforeChange([in] BSTR str, [in,out] VARIANT_BOOL* bCancel);
};
// CTestTest
[
coclass,
threading(apartment),
vi_progid("TestATL1.TestTest"),
progid("TestATL1.TestTest.1"),
version(1.0),
uuid("D9632007-14FA-4679-9E1C-28C9A949E784"),
// this line would be commented out from original file
// event_source("com"),
// this line would be added to support injected code
source(_ITestTestEvents),
helpstring("TestTest Class")
]
class ATL_NO_VTABLE CTestTest : public ITestTest,
// the following base classes support added injected code
public IConnectionPointContainerImpl<CTestTest>,
public IConnectionPointImpl<CTestTest, &__uuidof(::_ITestTestEvents), CComDynamicUnkArray>
{
public:
CTestTest() {
}
// this line would be commented out from original file
// __event __interface _ITestTestEvents;
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct() {
return S_OK;
}
void FinalRelease() {}
public:
CComBSTR m_value;
STDMETHOD(DoTest)(BSTR str) {
VARIANT_BOOL bCancel = FALSE;
BeforeChange(str,&bCancel);
if (bCancel) {
return Error("Error : Someone don't want us to change the value");
}
m_value =str;
return S_OK;
}
// the following was copied in from the injected code.
HRESULT BeforeChange(::BSTR i1,::VARIANT_BOOL* i2) {
HRESULT hr = S_OK;
IConnectionPointImpl<CTestTest, &__uuidof(_ITestTestEvents), CComDynamicUnkArray>* p = this;
VARIANT rgvars[2];
Lock();
IUnknown** pp = p->m_vec.begin();
Unlock();
while (pp < p->m_vec.end()) {
if (*pp != NULL) {
IDispatch* pDispatch = (IDispatch*) *pp;
::VariantInit(&rgvars[1]);
rgvars[1].vt = VT_BSTR;
V_BSTR(&rgvars[1])= (BSTR) i1;
::VariantInit(&rgvars[0]);
rgvars[0].vt = (VT_BOOL | VT_BYREF);
V_BOOLREF(&rgvars[0])= (VARIANT_BOOL*) i2;
DISPPARAMS disp = { rgvars, NULL, 2, 0 };
VARIANT ret_val;
hr = __ComInvokeEventHandler(pDispatch, 1, 1, &disp, &ret_val);
if (FAILED(hr))
break;
}
pp++;
}
return hr;
}
BEGIN_CONNECTION_POINT_MAP(CTestTest)
CONNECTION_POINT_ENTRY(__uuidof(::_ITestTestEvents))
END_CONNECTION_POINT_MAP()
// end added code section
// _ITestCtrlEvents Methods
public:
};
int main() {}
어떻게 앞으로 특성 사용된 인터페이스를 선언할 수 있습니다.
특성 사용된 인터페이스의 정방향 선언 하는 경우 실제 인터페이스 선언에 적용 하는 전방 선언에 동일한 특성을 적용 해야 합니다.또한 적용 해야는 내보내기 에 전방 선언에 특성.
특성에서는 특성을 사용 하는 클래스에서 파생 된 클래스에 사용할 수 있습니까?
또한 특성을 사용 하는 클래스에서 파생 된 클래스에 특성을 사용 하 여 아니오, 지원 되지 않습니다.