我想用接口函数传递数组,接口如下:
[
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,剩下的分几次给)
[
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,剩下的分几次给)
2.不要使用类库列集器,要使用标准列集器(nmake -f xxxps.mk,regsvr32 xxxps.dll),因为
类库列集器不支持size_is属性~
客户可以获取接口指针,否则便不能,有时报告错误:不支持该接口。