2010-03-04 2 views
3

COM DLL (다른 텍스트 상자에 제공된 파일 이름)에서 제공된 함수 (텍스트 상자에 입력 한 함수 이름)를 실행해야하는 VC++의 응용 프로그램이 있습니다.동적으로 COM DLL 호출

LoadLibraryGetProcAddress을 사용하여 Win32 라이브러리를로드하는 코드를 보았습니다.

COM DLL 파일 (Visual Basic 6.0에서 작성)에 대해 어떻게 수행 할 수 있습니까? 더 많은 정보를 얻을 수있는 링크가 있습니까?

답변

2

당신이 (이 VB에서 만든 경우 매우 가능성이 높습니다) 지원 IDispatch를 호출하고있는 구성 요소가 늦게 사용할 수있는 경우에 대한 C++ LoadLibrary의 예와 GetProcAddress있다 바인딩은 COM 인터페이스 메서드를 동적으로 호출합니다. 예를 들어

:

IDispatch *pDispatch; 
// Assumes pUnknown is IUnknown pointer to component that you want to call. 
HRESULT hr = pUnknown->QueryInterface(IID_IDispatch, reinterpret_cast<void **>(&pDispatch)); 
if(SUCCEEDED(hr)) 
{ 
    DISPID dispid; 
    // Assumes sMethodName is BSTR containing name of method that you want to call. 
    hr = pDispatch->GetIDsOfNames(IID_NULL, &sMethodName, 1, LOCALE_SYSTEM_DEFAULT, &dispid); 
    if(SUCCEEDED(hr)) 
    { 
     // Assumes that the method takes zero arguments. 
     VARIANT vEmpty; 
     vEmpty.vt = VT_EMPTY; 
     DISPPARAMS dp = { &vt, 0, 0, 0 }; 
     hr = pDispatch->Invoke(dispid, IID_INULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, 0, 0, 0); 
    } 

    pDispatch->Release(); 
} 

IDispatch::GetIDsOfNames()이 예에서 지정된 방법의 DISPID을 인출 후 IDispatch::Invoke()DISPID에 전달하여 그 메소드를 호출한다.

명확하게하기 위해 호출 할 메서드에 인수가 없다고 가정했지만 Invoke()으로 전달되는 DISPPARAMS structure을 수정할 수 있습니다.