首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何将COM+组件的接口方法设置为只能被COM+应用程序内部使用? [已结贴,结贴人:horris]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • horris
    • 等级:
    发表于:2008-06-04 01:24:59 楼主
    问题是这样的,我有一个COM+应用程序,假设为SVR,内有三个组件A,B,C,其中C有一个接口的方法为Method。现在我想让Method只能被COM+应用程序SVR的内部调用,也就是说只有A,B才能调用Method,而客户端不能直接调用。就象COM+ 1.5中的“使组件专用于应用程序”的效果一样,只不过那个是作用于整个组件的,而我想让一个方法也专用于应用程序。我想过用一个没有配置任何Windows用户的角色来实现,但因为这样的内部方法有不少,而且还需要COM+管理员参与,所以不想通过角色,而通过编程来实现。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-04 08:26:491楼 得分:0
    这个问题有水平,关注
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-04 09:07:202楼 得分:0
    试试在组件线程中实现IMessageFilter,能获取调用者信息。不过我不确定是否适用于COM+
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-04 09:08:383楼 得分:0
    把C实现为不可创建类(OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO),不知可否。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-04 09:14:344楼 得分:0
    关注
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • horris
    • 等级:
    发表于:2008-06-05 00:03:055楼 得分:0
    引用 3 楼 yxz_lp 的回复:
    把C实现为不可创建类(OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO),不知可否。

    这样我的COM+应用程序内部不也调用不了了?而且你的方法是使整个组件都不可用,我想要的是使某个方法对客户端不可用,但对COM+应用程序的其他组件是可用的。
    谢谢各位的回复,期待精彩的思路。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-05 08:37:396楼 得分:40
    我有一个想法供楼主参考,用代码描述如下,不知道是不是馊主意。

    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);

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-05 12:08:527楼 得分:20
    你可以约一个暗号,对上之后才进行正常的操作
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-05 14:35:378楼 得分:40
    引用 7 楼 jiangsheng 的回复:
    你可以约一个暗号,对上之后才进行正常的操作


    应该不可行。由于是COM+环境,暗号机制也应该是公开的。
    另辟其它私密的通信渠道算了,比如SOCKET
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-05 16:34:559楼 得分:0
    是不是和这个问题类似。http://topic.csdn.net/u/20080605/10/5a0daf6d-af71-4b5a-b7f1-67d42834642c.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • horris
    • 等级:
    发表于:2008-06-06 00:38:5710楼 得分:0
    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.

    感谢各位的回贴!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved