关于COM中自定义类型

kukafei 2002-03-14 11:10:18
我使用VC来开发COM组件,自定义了结构,但在VB中调用就要出错
由于VC中没有自定义结构的向导,我只好手工的写IDL
[
uuid(66D373D9-5E0A-43A3-860C-67B800806CC6),
//我不知道VC中怎样产生这个uuid,我是从C++Builder中产生后拷过来的
version(1.0),
helpstring("my record")
]
typedef struct Obj
{
int a;
BSTR b;
}AObj;
[
object,
uuid(0640B77A-DCAF-4769-9B0A-FA890F99F6D6),
dual,
helpstring("IJList Interface"),
pointer_default(unique)
]
interface IJList : IDispatch
{
[propget, id(5), helpstring("property m_AObj")] HRESULT m_AObj([out, retval] AObj *pVal);
[propput, id(5), helpstring("property m_AObj")] HRESULT m_AObj([in] AObj newVal);
};
//m_AObj是IJList的属性
VB中调用
Private Sub Command1_Click()
Dim Ob As AObj
Ob.a = 5
Ob.b = "test"
Dim temp As New JList
temp.m_AObj = Ob //此处出现错误
Dim Ou As AObj
Ou = temp.m_AObj
Label2.Caption = Ou.b
End Sub
编译时报出User-defined type may not be passed ByVal
...全文
128 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
musicdancer 2002-03-17
  • 打赏
  • 举报
回复
还是老老实实用automation类型吧。
lwg7603 2002-03-15
  • 打赏
  • 举报
回复
不知你在IDL中是否使用了"Obj"类型标签!如果没有!可去掉typedef,直接定义为AObj!
[
uuid(66D373D9-5E0A-43A3-860C-67B800806CC6),
version(1.0),
helpstring("my record")
]
struct AObj
{
int a;
BSTR b;
};

抱歉!VB我不太熟!错误出在哪一行呢?
kukafei 2002-03-15
  • 打赏
  • 举报
回复
按 lwg7603的改了
可是编译时出现警告
error generating type library, ignored : Could not set UUID : Obj
由于IDL是自己写的,不知道那里错了,
在vb出现编译错误
Variant required-can't assign to this expression
kukafei 2002-03-15
  • 打赏
  • 举报
回复
使用IUnknown来做组件接口,当传递参数时,就会出错
下面是组件的两个方法,一模一样,当VB调Show时,就能运行正常,
调SetAObj就出现非法操作,

改成IDispatch,自定义类型,idl就编译不过去。
STDMETHODIMP CMaster::Show()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here
AfxMessageBox("test");
return S_OK;
}

STDMETHODIMP CMaster::SetAObj(AObj *newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here
AfxMessageBox("test");
return S_OK;
}
lwg7603 2002-03-15
  • 打赏
  • 举报
回复
IDispatch只能支持VARIANT类型?自定义类型恐怕编译通不过!
kukafei 2002-03-15
  • 打赏
  • 举报
回复
现在将typedef去掉后,VC编译就没有警告了,但VB中还有非法操作,现在
我打算将IUnknown *改为IDispatch *再试一试
hollysky 2002-03-14
  • 打赏
  • 举报
回复
notice:
Set Ixx = new ObjType
Set Iyyy= Ixxx
Set Ixxx = nothing
wudimin 2002-03-14
  • 打赏
  • 举报
回复
在VC中,首先在你的CJList中加入一个成员为:
AObj m_obAObject;
然后设置属性m_AObj的输入输出函数,这里当你设定属性时要定义成propput,而要改成propputref,这样在VB中才可以引用。

wudimin 2002-03-14
  • 打赏
  • 举报
回复
Visual Studio6.0 提供了两个生成GUID的工具,一个是叫Uuidgen.exe的命令行担示,另一个叫做Guidgen.exe,后一个可以在C:\Program Files\Microsoft Visual Studio\Common\Tools下找到,它会生成GUID并产生你想要的格式。
lwg7603 2002-03-14
  • 打赏
  • 举报
回复
1.修改IDL文件
[
uuid(66D373D9-5E0A-43A3-860C-67B800806CC6),
version(1.0),
helpstring("my record")
]
typedef struct Obj
{
int a;
BSTR b;
}AObj;
[
object,
uuid(0640B77A-DCAF-4769-9B0A-FA890F99F6D6),
helpstring("IJList Interface"),
pointer_default(unique)
]
interface IJList : IUnknown
{
[helpstring("property m_AObj")] HRESULT GetAObj([out, retval] AObj *pVal);
[helpstring("property m_AObj")] HRESULT SetAObj([in] AObj *newVal);
};

2.在VC中,首先在你的CJList中加入一个成员为:
AObj m_obAObject;

3.实现GetAObj,SetAObj方法:
STDMETHODIMP CJList::GetAObj(AObj *pVal)
{
pVal->a=m_obAObject.a;
CComBSTR bstrTemp=m_obAObject.b;
pVal->b=bstrTemp.Detach();
return S_OK;
}
STDMETHODIMP CJList::SetAObj(AObj *pVal)
{
::SysFreeString(m_obAObject.b);
m_obAObject.a=pVal->a;
CComBSTR bstrTemp=pVal->b;
m_obAObject.b=bstrTemp.Detach();
return S_OK;
}
4.修改VB代码:
Dim temp As New JList
Dim InInfo As AObj
InInfo.a=8;
InInfo.b="test"
temp.SetAObj(InInfo)
Dim OutInfo As AObj
OutInfo=temp.GetAObj()





kukafei 2002-03-14
  • 打赏
  • 举报
回复
按照wudimin() 的方法改了,问题是编译不过去啊,VC中有没有通过向导来定义一个struct的方法啊?

1,650

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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