关于C#做的COM服务 问题
我用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 都回出错
[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 都回出错
...全文
相关推荐
C#.net,com编程指南
**COM+服务**:书中会详细介绍COM+提供的服务,如安全性、事务管理、队列组件、事件系统等,以及如何在C#应用中利用这些服务。通过COM+,你可以方便地构建分布式、高可用性的应用程序。6.
基于COM技术的C#与Matlab混合编程.zip
- **并发问题**:多个线程同时访问MATLAB COM服务器可能会出现问题,需要考虑线程安全。
C#.COM+编程指南
本书首先会介绍COM+的基本概念,包括组件、容器和服务,并讲解如何在C#中创建和注册COM+组件。
C# COM+ 编程指南
此外,还讨论了延迟绑定和早期绑定的区别,以及如何处理异常和线程安全问题。**第二部分:COM+的核心服务**这部分深入探讨了COM+的核心服务,包括事务管理、安全性、并发控制、池化和配置管理等。
C# COM+ Programming
**服务组件**:COM+提供了多种服务,如事务管理、安全性、并发控制等。C#通过`[Transacted]`、`[SecurityPermission]`等特性可以利用这些服务。6.


