看很多人都在问关于结构在COM中的定义,现在统一回答!

flyycyu 2003-01-04 01:51:51
bbq1980,allofeagles你们到时候把提问的分都给我呀!^_^

以vc7为例,生成atl的简单对象步骤就省略了!

1.工程中添加一个新的idl文件,例如就叫MyType.idl:
内容如下:
import "oaidl.idl";
import "ocidl.idl";

struct MyPoint
{
long x;
long y;
};

然后用midl.exe编译(要去命令行)

然后在你接口定义的主头文件(包含你的interface和coclass的那个)
加上:
#include "MyType.h"

我的头文件内容如下:

// IIDL.h : CIIDL 的声明

#pragma once
#include "resource.h" // 主符号
#include "MyType.h"

// IIIDL

[
object,
uuid("82C260C9-3620-49C4-9B8F-CDB3A5189187"),
dual, helpstring("IIIDL 接口"),
pointer_default(unique)
]
__interface IIIDL : IDispatch
{
[id(1), helpstring("方法Spin")] HRESULT Spin([in] MyPoint s);
[propget, id(2), helpstring("属性 ParameterType")] HRESULT ParameterType([in] LONG Index, [out, retval] SIMPL* pVal);
};

// CIIDL

[
coclass,
threading("apartment"),
vi_progid("IDL.IIDL"),
progid("IDL.IIDL.1"),
version(1.0),
uuid("C742452F-A021-44BF-B726-70FA7A751311"),
helpstring("IIDL Class")
]
class ATL_NO_VTABLE CIIDL :
public IIIDL
{
public:
CIIDL()
{
}


DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}
private:
SIMPL _inst;
public:

STDMETHOD(Spin)(MyPoint s);
STDMETHOD(get_ParameterType)(LONG Index, SIMPL* pVal);
};

然后再编译工程!

好了,输出结构的com做好了!




...全文
58 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
anhb 2003-01-21
  • 打赏
  • 举报
回复
好象在STA中调用正常,而用MTA崩溃
flyycyu 2003-01-09
  • 打赏
  • 举报
回复
有必要为MyPoint增加一个一个拷贝构造函数和=重载函数
^^^^^^^
看不懂呀!

struct MyPoint
{
long x;
long y;
BSTR Name;
};

就像这样申明没有问题的呀!

pabulum 2003-01-09
  • 打赏
  • 举报
回复
gz
NB他叔NC 2003-01-09
  • 打赏
  • 举报
回复
有个问题请教一下:
如果这个结构体中有指针;比如:
struct MyPoint
{
long x;
long y;
BSTR Name;
};
有必要为MyPoint增加一个一个拷贝构造函数和=重载函数,请问如何来声明呢?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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