2013-05-15 1 views
1

내 코드에는 InvokeHelper 함수 호출이 있습니다. 내가 인터넷에서 발견 한 것은 InvokeHelper가 dwDispID를 사용하여 함수를 호출하는 데 사용된다는 것입니다.InvokeHelper가 호출하는 함수

이것은 전화입니다.

InvokeHelper(0xd, DISPATCH_METHOD, VT_DISPATCH, (void*)&pDispatch, parms, Name); 

이제 내부를 디버그하고 싶습니다. 그러나 나는 어떤 기능이 호출 될지 모른다. 0xd가 어떤 함수를 가리키고 있습니까? 프로젝트에는 odl 파일도 있습니다. 이 odl에서 일부 호출을 호출합니까? 무슨 기능?

편집 :

나는 CPP 파일의 상단에 다음 라인을 발견했다.

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++ 

// NOTE: Do not modify the contents of this file. If this class is regenerated by 
// Microsoft Visual C++, your modifications will be overwritten. 

그래서이 클래스는 래퍼처럼 보입니다. 하지만 어떤 래퍼 래퍼?

+0

InvokeHelper는 정적 함수가 아닙니다. 현재 클래스 인스턴스에서 메소드 ID 13을 호출하고 있습니다. –

+0

문제는 클래스가 어디에 있는지를 모른다는 것입니다. 일부 제 3 자에게 자동 생성 된 코드입니다. 이 클래스는 idl 파일에 없습니다. 나는 그것이 어떤 클래스 래퍼인지 알고 싶다. –

답변

2

먼저 호출중인 인터페이스의 정의를 찾고 IDispatch을 구현해야합니다. 자체 인터페이스 인 경우 프로젝트 내의 .idl 또는 .odl 파일 내에 있습니다.

인터페이스 정의에서 각 메소드는 해당 숫자와 함께 [DISPID] 속성을 갖습니다. id가 0xD 또는 13 인 것을 찾아야합니다. 이것이 당신의 방법입니다.

'이 메시지가 해당 odl에서 호출됩니까?'

예, 호출을 실행하는 객체가 ODL에 정의 된 클래스의 인스턴스 인 경우 예. 샘플을 보면 이것이 외부 개체 (즉, 다른 곳에서 정의되고 구현 된 개체)인지 아니면 프로젝트의 개체인지 명확하지 않으므로 프로젝트를 보지 않고도 알 수 있습니다.

그러나이 경우 생성 된 래퍼 클래스를 언급 한 것처럼 프로젝트 외부의 클래스라고 말할 수 있습니다. 이것은 외부 COM 라이브러리를 프로젝트에 추가 할 때 생성됩니다. 래퍼는 COM 호출을 C++ 클래스로 편리하게 래핑합니다.

InvokeHelper은 이미 일부 메서드 내에 있습니다.이 메서드의 이름은 결국 호출 될 IDispatch 파생 인터페이스의 메서드 이름과 같습니다. 따라서 디버깅 할 수 있는지 여부는 구성 요소에 대한 코드가 있는지 여부에 따라 다릅니다.

일반적으로 생성 된 래퍼의 이름은 래핑 된 COM 구성 요소의 이름을 가리킬 수 있지만 항상 그렇지는 않습니다 (COM 클래스의 이름과 항상 비슷하지만 여러 클래스가있을 수 있음) 같은 COM 서버에서). 정확히 인 COM 클래스를 확인하려면, 당신은 같은 라인 래퍼 헤더 파일의 부분을 확인할 수 있습니다 :

static CLSID const clsid 
    = { 0x9e3c8066, 0x7f88, 0x11d1, { 0xbb, 0x57, 0x44, 0x45, 0x53, 0x54, 0x0, 0x1 } }; 

이 기본 COM 클래스의 CLSID이며, 당신이보고 레지스트리를 검색 할 수 정확히 클래스의 ProgId이며 dll/exe가 호스팅됩니다. 자세한 내용은 here을 참조하십시오.

첫 번째 4 장 'Essential COM'은 COM 구성 요소 사용과 관련된 90 %의 문제를 해결하기 위해 COM에 대해 알아야 할 사항을 소개합니다.

+0

전체 솔루션에서 검색했습니다.이 줄이 포함 된 방법은 어디에도 없습니다. 나는 외부 수업이 무엇인지 찾아야한다. 이 메소드는 odl 파일에 없습니다. –

+0

지난 두 단락을 이해하지 못했습니다. 이 이름은 _external_ 구성 요소의 래퍼이므로 해당 이름의 메서드는 프로젝트에 존재하지 않습니다. OS에 의해 제공되는 COM 라이브러리/서버 일 수 있습니다. 자세한 내용은 업데이트 된 답변을 참조하십시오. –

+0

자, 클래스를 찾을 수 있습니다. 헤더 클래스에는 정의 된 것이 있습니다. 그것은 원래 클래스 이름이었습니다. 좀 더 자세하게 살펴 보았고 모든 기능을 찾을 수있었습니다. 도와 주셔서 감사합니다. –

1

0xd는 .idl/.odl 파일에 일치하는 ID가있는 함수를 가리 킵니다.COM 개체가 IDispatch를 지원하는 경우, 각 함수는 숫자과 같이 가져옵니다 귀하의 경우

[id(1), helpstring("method Test")] HRESULT Test([in] long number);

, 함수가 13 (0xd의 16 진수)의 ID가 있습니다. 그것이 런타임에 "호출"될 함수입니다.
소스 코드와 양쪽에 .pdb 파일이 없으면 함수로 들어갈 수 없습니다 (디버그).

이 파일은 MFC 또는 런타임 호출 가능 래퍼가있는 관리 코드에서 생성 된 경우 프록시 클래스가 만들어집니다. 그 이름은 원본 .idl 파일의 COM 인터페이스 이름과 거의 일치합니다. 래퍼의 출처를 알 수 있습니다. 의미가 있습니까?

+0

전체 솔루션에서 검색을 수행했습니다.이 행을 포함하는 방법은 어디에도 없습니다. 나는 외부 수업이 무엇인지 찾아야한다. 이 메소드는 odl 파일에 없습니다. –

+0

생성 된 프록시 클래스 파일을 찾고 id가 13 (0xd 16 진수) 인 함수를 찾으십시오. 그러면 함수 이름을 알 수 있습니다. 구성 요소의 원본 소스 코드가 없으면 더 많은 정보를 얻을 수 없습니다. – edtheprogrammerguy