问题是这样的,我有一个COM+应用程序,假设为SVR,内有三个组件A,B,C,其中C有一个接口的方法为Method。现在我想让Method只能被COM+应用程序SVR的内部调用,也就是说只有A,B才能调用Method,而客户端不能直接调用。就象COM+ 1.5中的“使组件专用于应用程序”的效果一样,只不过那个是作用于整个组件的,而我想让一个方法也专用于应用程序。我想过用一个没有配置任何Windows用户的角色来实现,但因为这样的内部方法有不少,而且还需要COM+管理员参与,所以不想通过角色,而通过编程来实现。

解决方案 »

  1.   

    试试在组件线程中实现IMessageFilter,能获取调用者信息。不过我不确定是否适用于COM+
      

  2.   

    把C实现为不可创建类(OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO),不知可否。
      

  3.   

    这样我的COM+应用程序内部不也调用不了了?而且你的方法是使整个组件都不可用,我想要的是使某个方法对客户端不可用,但对COM+应用程序的其他组件是可用的。
    谢谢各位的回复,期待精彩的思路。
      

  4.   

    我有一个想法供楼主参考,用代码描述如下,不知道是不是馊主意。interface ISupportC : public IUnknown
    {
    HRESULT CanbeCall(BSTR strValue);
    }ClassA : public IUnknown,
             public YourInterface,
             public ISupportC
    {
    }ClassC : ....
    {
        HRESULT Method(Your Param...., IUnknown *pCaller)
        {
            CComPtr<ISupportC> spISC;
            HRESULT hr = pCaller->QueryInterface(&spISC);
            if (SUCCEEDED(hr))
            {
                spISC->CanbeCall(....); //这里做一些必要的验证,防止别人派生ISupportC
            }
        }
    }以下是调用
    ClassA a;
    ClassC c;
    c.Method(..., &a);
      

  5.   


    应该不可行。由于是COM+环境,暗号机制也应该是公开的。
    另辟其它私密的通信渠道算了,比如SOCKET
      

  6.   

    是不是和这个问题类似。http://topic.csdn.net/u/20080605/10/5a0daf6d-af71-4b5a-b7f1-67d42834642c.html
      

  7.   

    ukyoking和jameshooo的想法有点用。
    我已在MSDN Forum上得到了一个比较理想的解决方案:You can use the 'local' attribute in MIDL. [local] will mean that the interface can never be marshaled, and callable only within the same process space, your COM+ application.感谢各位的回贴!