최근에 DLL에 COM coclass/인터페이스를 생성하고 구현하는 프로젝트를 상속했습니다. 이 COM DLL은 COM 클래스의 인터페이스에 GUI를 적용하는 응용 프로그램에서 사용됩니다. 이것은 COM DLL을 사용하는 유일한 응용 프로그램입니다. COM을 잘 다루지 못해 좋은 문서를 찾기가 어렵습니다.COM 메소드 및 속성 추가/제거시 고려 사항
내 작업의 일부에는 인터페이스에 더 이상 필요하지 않은 일부 메소드/속성을 추가하는 작업이 포함됩니다. 나는 이것을 달성하기 위해 IDL을 수정해야한다는 것을 배웠다. 지금은 인터페이스의 끝에 새로운 메소드와 속성을 추가하기 만하면 모든 것이 잘 작동하는 것 같습니다. 그러나 속성 중 하나를 제거하면 (예를 들어) 응용 프로그램을 실행하면 문제가 빠르게 발생합니다.
interface IMyComInterface : IDispatch
{
[id(1), helpstring("method CheckMessage")] HRESULT CheckMessage([in] VARIANT vMsg);
[id(2), helpstring("method CheckFolder")] HRESULT CheckFolder([in] VARIANT Folder, [out] VARIANT *pCount, [out, retval] VARIANT *pErrorCount);
//[propget, id(3), helpstring("property Flags")] HRESULT Flags([out, retval] VARIANT *pVal);
//[propput, id(3), helpstring("property Flags")] HRESULT Flags([in] VARIANT newVal);
[propget, id(4), helpstring("property MessageStore")] HRESULT MessageStore([out, retval] VARIANT *pVal);
[propput, id(4), helpstring("property MessageStore")] HRESULT MessageStore([in] VARIANT newVal);
[propget, id(5), helpstring("property Directory")] HRESULT Directory([out, retval] VARIANT *pVal);
[propput, id(5), helpstring("property Directory")] HRESULT Directory([in] VARIANT newVal);
}
나는 그것이 ID 번호 순서가 깨진 것과 관련이 있다고 생각합니다. 나는 모든 것들을 그 아래로 옮길 수 있고 모든 것이 작동 할 것이라고 생각합니다. 그러나 나는이 모든 것을하기위한 적절한 방법에 대해 궁금합니다.
감사합니다.
는 [32 비트 양의 정수 값이 ID가 될 수 있습니다] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa367040(v=vs.85).aspx) 시퀀스에 관계없이. 어떤 라이브러리 (있는 경우)를 사용하여 IDispatch 메서드를 구현 했습니까? Murphy를 방해하지 않으려면 수동으로 .dll, .obj 및 .tlb를 제거하여 shure가되도록 모든 것을 다시 빌드하십시오. – ixe013
(C++로 작성된) GUI 응용 프로그램을 다시 컴파일하면 문제가 해결됩니다. 나는'IDispatch :: Invoke'가 후기 바인딩에서 사용될 때 ID가 중요하다는 것을 알았습니다. 사용하지 않았습니다. –