关于C#做的COM服务 问题

jxw3000 2006-11-20 09:22:11
我用C#做了个进程外服务器实现了一个接口
[Guid("39c13a4d-011e-11d0-9675-0020afd8adb3")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
ITest
{
void fuc0( ref System.Guid riid, [MarshalAs(UnmanagedType.Interface)]out object ppvObject);
void fuc1(ref System.Guid riid, [MarshalAs(UnmanagedType.IUnknown)]out object ppUnk);
void fuc2();
}
public CTest:ITest
{
void fuc0( ref System.Guid riid,out object ppvObject)
{
ppvObject = this;
}
void fuc1(ref System.Guid riid,out object ppUnk)
{
IntPtr pSite = IntPtr.Zero;
IntPtr pUnk = Marshal.GetIUnknownForObject(this);
Marshal.QueryInterface(pUnk, ref riid, out pSite);
Marshal.Release(pUnk);
Marshal.Release(pUnk);
ppUnk = pSite;
或者 用下面的实现
ppUnk= this;
}
void fuc2()
{
MessageBox.Show("fuc2 ok");
}

用C++调用
ITest:IUnknown
{
HRESULT fuc0(REFIID riid, LPVOID* ppvObject);
HRESULT fuc1(REFIID riid, LPUNKNOWN *ppUnk);
HRESULT fuc2();
}

在用实际运行期间 fuc0 的riid参数是 IDD_ITest ,返回结果正确,
fuc1的的riid参数是 IDD_IUnknown,返回结果是0xc0000005,ppUnk == NULL;
fuc2结果正确。
做了很多试验,发现如果参数是LPUNKNOWN *ppUnk 都回出错

...全文
228 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxw3000 2006-11-20
  • 打赏
  • 举报
回复
哎,怎么没人理我啊
jxw3000 2006-11-20
  • 打赏
  • 举报
回复
因为
IntPtr pUnk = Marshal.GetIUnknownForObject(this);
Marshal.QueryInterface(pUnk, ref riid, out pSite);
都增加了计数
shalen520 2006-11-20
  • 打赏
  • 举报
回复
Marshal.Release(pUnk);
Marshal.Release(pUnk);

不知道为什么要减引用计数呢,而且还是两次?
jxw3000 2006-11-20
  • 打赏
  • 举报
回复
哦,还有个现象,如果注册为进程内COM,一切都运行正常
jxw3000 2006-11-20
  • 打赏
  • 举报
回复
晕啊

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧