我想用接口函数传递数组,接口如下:
[
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));
结果如下:
Inproc Server(dll): 正确执行,可以获取接口指针并在Server和Client之间
传递数组。
Local Server(exe): 不能获取接口指针,hr = 0x80004005(未指定的错误),
如果将接口属性加上dual,则能够获取接口指针,但只能正确传递数组第一个元素。
我使用的是系统提供的标准调度器,COM文档告诉我:使用标准调度器,接口的列集合散集是透明的,为什么会出现这种情况,用EXE 方式实现的接口必须要求是双接口(dual)吗?我很迷惑,请高手指点,500分相送
1.声明错误:应为HRESULT Read([in]long nSize, [out, size_is(nSize)]BYTE** buf);并在实现中修改内存的分配方式!
2.不要使用类库列集器,要使用标准列集器(nmake -f xxxps.mk,regsvr32 xxxps.dll),因为
类库列集器不支持size_is属性~