2011-11-25 5 views
0
C++에서

의()를 호출에서 빈 변형을 받고는,이처럼 보이는 OLE 메소드를 호출하기 위해 노력하고있어 충돌없이OLE 자동화 : 내가 전화를 다음 코드를 사용</p> <pre><code>HRESULT GetFirstMono( [out] BSTR* name, [out, retval] BSTR* monoID); </code></pre> <p>을 대신 유효한 결과

int cArgs = 1; 
DISPPARAMS dp = { NULL, NULL, 0, 0 }; 
DISPID dispidNamed = DISPID_PROPERTYPUT; 
DISPID dispID; 
VARIANT *pArgs = new VARIANT[cArgs+1]; 
// Extract arguments... 
for(int i=0; i<cArgs; i++) { 
    pArgs[i] = va_arg(marker, VARIANT); 
} 

// Build DISPPARAMS 
dp.cArgs = cArgs; 
dp.rgvarg = pArgs; 

// Make the call! 
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp, 
     pvResult, NULL, NULL); 
    if(cArgs == 1) { 
     std::cout << "oleCall()" << std::endl; 
     std::cout << "vt: " << dp.rgvarg[0].vt << std::endl; 
    } 

프로그램 excecutes을, 그리고 나는 pvResult 출력 BSTR *를 모노 이드 수신 (그리고 내가 기대하는 가치를 얻을) : 그것은 (http://www.codeproject.com/KB/office/MSOfficeAuto.aspx에서 적응). 하지만 그 대신 이름을 찾는, 나는 단지 내가

oleCall() 
vt: 0 

를 참조 내 터미널에서 즉, dp:rgvarg[0]의 빈 변형을 얻는다. LabView에서 호출 할 때 똑같은 메서드가 제대로 작동하므로 문제가 내 코드의 어딘가에 있음을 알 수 있습니다. 이름을 출력으로 복구하려면 어떻게해야합니까?

+0

는'dp.cArgs'이 값을 포함하지 않나요 인수 (나는 mean'dp.cArgs의 =의 cArgs +를 1') 유형 VT_BSTR|VT_BYREF을 설정하려고? 이 메서드는 두 개의 매개 변수를 필요로하기 때문입니다. 도움이되지 않는다면 :'Invoke'의'HRESULT' 리턴 값을 확인하십시오. – vstm

+0

왜 나는 확실하지 않지만,'dp.cArgs = cArgs + 1'을 설정하면 프로그램이 충돌합니다. 늘어나는만큼, * retval *로 표시된 매개 변수는 변형 된'pvResult'와 함께 반환됩니다. 다른 하나는'dp '를 통해 리턴되어야한다. 나는 오류 관리에만 사용되기 때문에 내가 원하는 결과가 HRESULT에 있지 않을 것이라고 확신한다. – xqrp

답변

0

다른 사람이 같은 문제를 겪고있는 경우 : 해결할 수는 없지만 해결 방법이 있습니다. IDispatch 인터페이스의 Invoke 메서드를 사용하는 대신 MIDL이라는 Microsoft 프로그램을 사용하여 GetFirstMono이 선언 된 인터페이스의 헤더 파일을 만들었지 만 손으로도 할 수 있습니다 (단순히 인터페이스의 메서드를 찾습니다. ole/com 뷰어와 해당 헤더 파일 작성). 그런 다음, 메소드의 호출은 매우 간단합니다 : codeguru.com에서 더 많은 정보가있다

BSTR name, monoId; 
HRESULT hr = interfacePointer->GetFirstMono(name, monoId); 

. 희망이 도움이됩니다.

동의어 : 아직 원래 질문에 관심이 있습니다. 답변을 알고 있다면 게시하십시오!

0

는 2``0

CComBSTR bstrName; 
V_VT(&dp.rgvarg[0]) = VT_BSTR | VT_BYREF; 
V_BSTRREF(&dp.rgvarg[0]) = &bstrName;