문제

내가 알고 있는 우리가 사용할 수 있습니다 CoLoadLibrary 및 DllGetClassObject 을 얻하여 iclassfactory 인터페이스을 얻을 COM 인터페이스 구성 요소 등록하지 않고 DLL.

하지만 무엇에 대해 COM 구성 요소에 EXE?는 방법이 있을 얻을 수 있습 COM 구성 요소에서 인터페이스 EXE 형 COM 서버에 의해 제공하는 다른 파일 경로?

도움이 되었습니까?

해결책

real 등록 무료 com in-proc 및 proc out-of-proc com 객체 에서이 작업을 수행 할 수 있어야합니다.

밝기가 지적했듯이, 등록 무료 COM을 사용하지 않으므로 정말로 사용하지 않습니다.대신 정품 인증 중에 COM이 사용하는 호출을 재능함으로써 정말로 롤링하고 있습니다.응용 프로그램과 COM 서버가 활성화중인 COM 서버를 모두 제어 할 경우 해당 솔루션이 작동 할 수 있습니다. 그러나 그렇지 않으면 실패 할 가능성이 있습니다.

다른 팁

아니오, 당신은 할 수 없습니다.프로그램과 Out-Proc COM 서버간에 Marshalling을 설치해야합니다.이를 위해 CoInitialize()를 호출 한 다음 CoCreateInstance() 또는 CoGetClassObject()를 호출해야합니다.

in-proc 서버로 기술 한 경로 - ProdeCodiceCodeCode를 호출 한 다음 CoLoadLibrary() - 실제로 더러운 해킹 - 정상적인 COM 메커니즘을 무시합니다. 예를 들어 스레딩 모델을 만족시키는 데 필요한 경우에도 마샬링이 필요하지 않습니다.요구 사항 (STA / MTA 재료).in-proc 서버가 노출 된 몇 가지 잘 알려진 기능이있는 일반 DLL이기 때문에 이러한 더러운 해킹이 가능합니다.OUT-PROC COM 서버에서도 동일하지 않습니다.이 경우 COM에 의존해야합니다.

전달할 수 있습 COM 구성 요소의 함수 호출에서,포인터.

그래서 가정을 구현하는 객체에 EXE,로드하는 또 다른 COM 체 DLL 에서,당신이 통과 할 수 있습니 EXE 기반 객체 개체에서 DLL.로드체를 지원해야 하는 인터페이스 기능이 있는지의 포인터,예를 들어,

interface ILoadedObject
{
    HRESULT GiveObject(IUnknown *pObj);
};

는 경우 DLL 기반 객체를 구현하는,당신은 그것을 호출 할 수 있습에서 당신의 자신의 전달체 등록되지 않은 어디서 나, 이 없기 때문에 등록해야에있는 개체 EXE 를 달성했다.

유일한 요구 사항은 올바로 구현의 IUnknown:파괴하지 않는 객체지 Release 가 호출되는 오른쪽 번 확인 QueryInterface 사용될 수 있습을 통과하는 간에 고정된 세트의 인터페이스 객체에는 쿼리 IUnknown 항상을 반환합니다.

다른 한편으로 등록할 수 있습니다 EXE 서버로의 개체,하지만 그 많이 소개하고 복잡;COM 을 시작 EXE 파일을 실행한 다음 그것을 보내는 메시지를 통해 윈도우 메시지 큐가 있습니다.이를 위해 널리 이용되는 OLE;그것은 확실히 깨지기입니다.

업데이트

더 완벽한 솔루션을 정의하는 표준 방식으로 인스턴스를 만드는 개체의 유형,그러나 수 있도록 EXE 를 정의하는 어떻게 작동합니다.EXE 를 구현하는 것이라:

interface IComponent;

interface IEnvironment : IUnknown
{
    HRESULT CreateInstance(REFCLSID clsid, IComponent **ppNew);
}

모든 구성 요소를 지원해야 합니다 이 인터페이스::

interface IComponent : IUnknown
{
    HRESULT SetEnvironment(IEnvironment *pEnv);
}

지금,표준 동작이 어디 EXE 를 사용하고자하는 레지스트리를 찾아 구성 요소,그것을 구현 할 수 있습니다. CreateInstance 방법은 다음과 같다:

HRESULT Env::CreateInstance(REFCLSID clsid, IComponent **ppNew)
{
    HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
                     __uuidof(IComponent), (void **)&ppNew);
    if (FAILED(hr))
        return hr;

    (*ppNew)->SetEnvironment(this);
    return S_OK;
}

하지만 물론 그것은 변경할 수 있고"주"일부 구성 요소입니다.그래서 그 대신(또는)레지스트리,구성 파일을 사용할 수 있습니다.또는(당신이 물었)EXE 수 내장의 구현은 일부 구성 요소:

기 때문에 모든 구성품은 통보의 환경을 만들 때,사용할 수 있는 환경을 만드는 추가 구성 요소:

// inside some component:
HRESULT Comp::SetEnvironment(IEnvironment *e)
{
    m_env = e; // using a smart pointer for ref-counting
    return S_OK;
}

// in some method of the component

ComPtr<IComponent> button;
m_env->CreateInstance(CLSID_Button, &button);

// now query button for more useful interface...

그래서 때마다 구성 요소입니다 만든 환경(에서 정의 EXE)을 제어할 수 있는 방법을 정확하게 구현의 구성 요소를 발견했다.모든 창조를 통해 이동합니다.

이것은 때때로"라는 주입 의존성"또는"inversion of control".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top