我想用接口函数传递数组,接口如下:
[
object,
uuid(C06AA892-F0D8-4668-AFEE-FB76C8C75B0C),
helpstring("ISimpObj Interface"),
pointer_default(unique)
]
interface ISimpObj : IUnknown
{
HRESULT Write([in]long nSize, [in, size_is(nSize)] 
                                 BYTE* buf);
HRESULT Read([in]long nSize, [out, size_is(nSize)] 
                                BYTE* buf);
};我分别用Inproc Server(DLL)和Local Server(EXE)两种形式实现该接口,
客户用下面的方式获取接口指针:
  ISimpObj* pI_Simp = NULL;
 (1)Inproc Server(dll): 
hr = CoCreateInstance(CLSID_SimpObj, NULL, CLSCTX_INPROC_SERVER, IID_ISimpObj, (LPVOID*)(&pI_Simp)); (2) Local Server(Exe):
hr = CoCreateInstance(CLSID_SimpObj, NULL, 
CLSCTX_LOCAL_SERVER, IID_ISimpObj, (LPVOID*)(&pI_Simp));结果如下:
(1)Inproc Server(dll): 正确执行,可以获取接口指针并在Server和Client之间
传递数组。
(2)Local Server(exe): 不能获取接口指针,hr = 0x80004005(未指定的错误),
如果将接口属性加上dual,则能够获取接口指针,但只能正确传递数组第一个元素。我使用的是系统提供的标准调度器(Marshal),COM文档告诉我:使用标准调度器,接口的列集合散集是透明的,为什么会出现这种情况,用EXE 方式实现的接口必须要求是双接口(dual)吗?我很迷惑,请高手指点,500分相送(一次最多只能给100,剩下的分几次给)

解决方案 »

  1.   

    调用远程COM对象的接口函数,如果要传递内存块,如果不提供自己的Marshal,则参数只能为SAFEARRAY?
      

  2.   

    组件是完全自己写的?还是用MFC或ATL写的?
      

  3.   

    1.声明错误:应为HRESULT Read([in]long nSize, [out, size_is(nSize)]BYTE** buf);并在实现中修改内存的分配方式!
    2.不要使用类库列集器,要使用标准列集器(nmake -f xxxps.mk,regsvr32 xxxps.dll),因为
      类库列集器不支持size_is属性~
      

  4.   

    太高兴了,多谢lwg7603的指点,所有问题都没有了。但我还有一个问题:在用Exe方式实现的接口ISimpObj中,加上dual属性后,
    客户可以获取接口指针,否则便不能,有时报告错误:不支持该接口。